|
Tomcat 集群分类:
tomcat实现session集群的几种方式:
(1) nginx + tomcat cluster
(2) httpd + tomcat cluster #基于http协议
httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer
tomcat cluster:http connector
(3) httpd + tomcat cluster #基于ajp协议
httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer
tomcat cluster:ajp connector
(4) httpd + tomcat cluster
httpd: mod_jk #不常用,本文不做接受
tomcat cluster:ajp connector
实验准备:
三台主机:1台nginx或者httpd做反向调度,两台tomcat做后端服务器(tomcatA,tomcatB)
时间同步
主机名解析
tomcat主机安装:
yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
1. nginx + tomcat cluster
1.1 部署nginx反向代理
vim /etc/nginx/nginx.conf
upstream tomsrvs { #http段
server 172.18.43.72:8080;
server 172.18.43.73:8080;
location / { #默认http-->server段:
proxy_pass http://tomsrvs;
}
| 1.2 部署tomcat后端服务器
mkdir -pv /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF,META-INF}
创建文件vim /var/lib/tomcat/webapps/test/index.jsp
tomcatA测试页:
TomcatA
TomcatA.magedu.com
Session ID
Created on
| tomcatB测试页:
TomcatB
TomcatB.magedu.com
Session ID
Created on
| 测试结果(已完成nginx反代):
2. httpd + tomcat cluster (http协议)
httpd服务器部署反向代理虚拟服务器vim /etc/httpd/conf.d/tom-http.conf
BalancerMember http://172.18.43.72:8080 loadfactor=1 #定义权重
BalancerMember http://172.18.43.73:8080 loadfactor=3
ProxySet lbmethod=byrequests #设定调度算法
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off #关闭正向代理
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/ #把所有请求映射到tcsrvs
ProxyPa***everse / balancer://tcsrvs/
Require all granted
| 测试略
附httpd反代相关设置:
http集群调度算法:
byrequests:轮询(默认)
bybusyness:加权轮询
bytraffic:基于流量调度
定义后端调度主机状态status:
D:相当于down不接受请求
I:强行设置为健康
H:热备,相当于backup
E:错误
N:不接受新请求 3. httpd + tomcat cluster (ajp协议)
httpd服务器部署反向代理虚拟服务器vim /etc/httpd/conf.d/tom-ajp.conf
BalancerMember ajp://172.18.43.72:8009
BalancerMember ajp://172.18.43.73:8009
ProxySet lbmethod=byrequests
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/
ProxyPa***everse / balancer://tcsrvs/
Require all granted
| 4. 关于httpd内置集群代理管理页面的配置
在如上设置中加入如下代码:
SetHandler balancer-manager #启用内建处理器
ProxyPass ! #访问这个URL时不向后端代理
Require all granted #真正使用时管理页面不应都可访问
| 访问URL进行访问效果如图:
可在此页面进行管理调度算法,后端主机状态权重等。
实现Tomcat会话保持的三种方式:
1.基于http模块route标签实现会话粘性
1.1 http服务器与上面相比添加内容如下:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #新
BalancerMember ajp://172.18.43.72:8009 route=TomcatA #新加
BalancerMember ajp://172.18.43.73:8009 route=TomvatB #新加
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID #新加
| 1.2 修改两台后端tomcat主机
在Engine标签里面(在105行附近)加入jvmRoute="Tomcat*"
测试实现会话粘性
2. Tomcat 会话复制集群
2.1 httpd主机注释或删除上例中添加部分
2.2 编辑两台后端tomcat主机server.xml配置文件
确保server.xml配置文件Engine的jvmRoute属性配置正确(如上例TomcatA,TomcatB),将下列配置放置于或中,注意各节点配置不同
2.3 添加元素
拷贝tomcat自带模板到test的WEB-INF下面:
cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml
| 编辑WEB-INF/web.xml,添加元素
vim web.xml
在任意非注释区域添加:
2.4 抓包测试,可看到两台主机互相通信实现会话复制
浏览器测试已实现会话粘性
3. session会话保持之session服务器(memcached)
3.1 memcached介绍
Memcached 是一款高效高性能的旁挂式数据缓存系统,设计简单,程序短小。即只将数据存贮至内存中,而不写入至硬盘,成为缓存系统, memcached 存储的是 kv 类型数据.所有的缓存都是 kv 类型的数据,并且 memcached 中缓存的数据可以被修改,因为 memcached 的缓存数据存在于内存中所以,服务器宕机,数据丢失,所以只能作为缓存使用,而不能当做存储使用.
memcached 支持互不通信的集群,作为旁挂式缓存系统。需要程序主动与 memcached 进行交互通信。并且memcached 一般用于存储 session。即作为 session 服务器使用。
采用了惰性管理,即该清理掉的数据被标记为不可用,然后在新数据到达时,进行覆盖。
3.2 实验环境
构建一台httpd反向代理,两台后端tomcat服务器(兼memcached)。操作方法见上例 [集群之 3 httpd + tomcat cluster (ajp协议)]
主体架构:Clients–>172.18.43.71(httpd)–>(tomcatA, tomcatB)–> (n1 n2)
https://s3.运维网.com/oss/201711/09/efafbb49622df53576520d35afd4c7fe.png
3.3.配置tomcat
memcache不支持流式数据存储,需借助memcached-session-manager转化信息。
memcached-session-manager项目地址:
http://code.google.com/p/memcached-session-manager/
https://github.com/magro/memcached-session-manager
下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。
实验所用包一览:
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar
分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:
重启tomcat,memcache服务
3.4 测试
在浏览器中访问http://172.18.43.71/test/index.jsp,不断刷新,结果如下所示,其session ID在负载均衡环境中保持不变。
https://s3.运维网.com/oss/201711/09/6aee496313cddfea8d2c77218a675d2b.gif
从测试结果可以看出,现在启用会话共享服务的memcache节点为n1,此时将n1节点的memcache关闭;
刷新页面:
https://s1.运维网.com/oss/201711/09/2d22d5720fae571d4db2c9a879359575.gif
此时,其session ID在负载均衡环境中保持不变,只是提供memcache服务的节点转为n2;
实现了基于memcache的会话保持集群;
|
|