您的位置:首页 > 运维架构 > Tomcat

tomcat 集群及会话保持实验示例

2017-11-09 23:00 483 查看
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测试页:
<%@ page language="java" %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color="red">TomcatA.magedu.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>
<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>
tomcatB测试页:
<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB.magedu.com</font></h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>
<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>
测试结果(已完成nginx反代):




2. httpd + tomcat cluster (http协议)
httpd服务器部署反向代理虚拟服务器vim /etc/httpd/conf.d/tom-http.conf
<proxy balancer://tcsrvs>
BalancerMember http://172.18.43.72:8080 loadfactor=1 #定义权重
BalancerMember http://172.18.43.73:8080 loadfactor=3
ProxySet lbmethod=byrequests #设定调度算法
</Proxy>
<VirtualHost *:80>
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off #关闭正向代理
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/ #把所有请求映射到tcsrvs
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>
测试略

附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
<proxy balancer://tcsrvs>
BalancerMember ajp://172.18.43.72:8009
BalancerMember ajp://172.18.43.73:8009
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>
4. 关于httpd内置集群代理管理页面的配置
在如上设置中加入如下代码:
<Location /balancer-manager>
SetHandler balancer-manager #启用内建处理器
ProxyPass ! #访问这个URL时不向后端代理
Require all granted #真正使用时管理页面不应都可访问
</Location>
访问URL进行访问效果如图:



可在此页面进行管理调度算法,后端主机状态权重等。
实现Tomcat会话保持的三种方式:

1.基于http模块route标签实现会话粘性
1.1 http服务器与上面相比添加内容如下:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #新
<proxy balancer://tcsrvs>
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*"
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> #主机A
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB"> #主机B
测试实现会话粘性
2. Tomcat 会话复制集群
2.1 httpd主机注释或删除上例中添加部分
2.2 编辑两台后端tomcat主机server.xml配置文件
确保server.xml配置文件Engine的jvmRoute属性配置正确(如上例TomcatA,TomcatB),将下列配置放置于<engine>或<host>中,注意各节点配置不同
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>

<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.250.43" #tomcat主机同步多播地址,适当修改
port="45564"
frequency="500" #每隔多久发一次信息(毫秒)
dropTime="3000"/> #超时多久判定为故障
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="172.18.43.72" #填写本tomcat主机ip地址
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
2.3 添加<distributable/>元素
拷贝tomcat自带模板到test的WEB-INF下面:
cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml
编辑WEB-INF/web.xml,添加<distributable/>元素
vim web.xml
在任意非注释区域添加:<distributable/>
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)



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容器,并在其中创建一个会话管理器,如下所示:
<Context path="/test" docBase="test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.18.43.72:11211,n2:172.18.43.73:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
重启tomcat,memcache服务
3.4 测试
在浏览器中访问http://172.18.43.71/test/index.jsp,不断刷新,结果如下所示,其session ID在负载均衡环境中保持不变。




从测试结果可以看出,现在启用会话共享服务的memcache节点为n1,此时将n1节点的memcache关闭;
刷新页面:




此时,其session ID在负载均衡环境中保持不变,只是提供memcache服务的节点转为n2;
实现了基于memcache的会话保持集群;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat 集群 会话保持