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的会话保持集群;
本文出自 “linux运维” 博客,请务必保留此出处http://arm2012.blog.51cto.com/2418467/1980459
原文地址:http://arm2012.blog.51cto.com/2418467/1980459