tomcat实现session保持案例
http://s3.运维网.com/wyfs02/M02/75/4A/wKioL1Y05naCc7lZAAB9aJN0GPQ154.jpgapache: tomcats
(1) apache:
mod_proxy
mod_proxy_http实现代理
mod_proxy_balancer实现负载均衡
tomcat:
http connector http连接器
(2) apache:
mod_proxy
mod_proxy_ajp ajp模块
mod_proxy_balancer
tomcat:
ajp connectorajp连接器
(3) apache:
mod_jk
tomcat:
ajp connector
方案一:使用nginx反代用户请求到tomcat:(实现负载均衡和session绑定)
配置hosts文件:
192.168.20.1 node1.lee.com node1
192.168.20.2 node2.lee.com node2
192.168.20.8 node4.lee.com node4
192.168.20.7 node3.lee.com node3
前端nginx配置实现负载均衡:
1.在http上下文定义upstream server
upstream tcsrvs {
ip_hash;实现session绑定
server node1.lee.com:8080;
server node2.lee.com:8080;
}
2.在server段中调用:
location / {
root /usr/share/nginx/html;
}
location ~* \.(jsp|do)$ {
proxy_pass http://tcsrvs;
}
后端两个tomcat配置server.xml:
示例只给了第一台的配置,第二台的只需将所有node1改为node2即可
/data/webapps/index.jsp文件:
JSP Test Page
方案二:使用httpd反代用户请求到tomcat
前端httpd反代配置:
BalancerMember http://172.16.100.68:8080 loadfactor=10 route=TomcatA
BalancerMember http://172.16.100.69:8080 loadfactor=10 route=TomcatB
ServerName web1.lee.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Order Deny,Allow
Allow from all
ProxyPass /status !
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
Order Deny,Allow
Allow from all
后端tomcat主机配置:此处为node1主机,node2主机设置为 jvmRoute="TomcatB",测试页也做相应替换
#jvmRoute为了让前端httpd可以精确识别自己,使用jvmRoute作为标示
编辑测试页面:/data/webapps/index.jsp
TomcatA
TomcatA.lee.com
Session ID
Created on
测试:
http://s3.运维网.com/wyfs02/M02/75/4D/wKiom1Y070_AUiG7AAEHvAHidZ0071.jpg
发现即便调度到同一主机session也会变,更不用说不调度在同一主机
http://s3.运维网.com/wyfs02/M02/75/4A/wKioL1Y074niNyW4AAEHLCtJ-Xc736.jpg
解决:修改这两行,使用session粘性功能
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
BalancerMember http://192.168.20.1:8080 loadfactor=10 route=TomcatA
BalancerMember http://192.168.20.2:8080 loadfactor=10 route=TomcatB
ProxySet stickysession=ROUTEID
测试后发现session绑定成功
使用ajp连接:只需要修改两行
#Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
注释上面一行是因为使用ajp协议的话只需要ProxySet stickysession=ROUTEID一条语句即可绑定
BalancerMember ajp://172.16.100.68:8009 loadfactor=10 route=TomcatA
BalancerMember ajp://172.16.100.69:8009 loadfactor=10 route=TomcatB
ProxySet stickysession=ROUTEID
方案三:使用mod_jk作反向代理,使用mod_jk后端连接只能使用ajp协议
tarxf tomcat-connectors-1.2.40-src.tar.gz
cd tomcat-connectors-1.2.40-src/native
准备编译环境:
yum install httpd-devel gcc glibc-devel
yum groupinstall "Development tools"
mod_jk依赖于apxs
# which apxs
/usr/sbin/apxs
在native目录下:
./configure --with-apxs=/usr/sbin/apxs
装载mod_jk模块:在httpd.conf文件中:
LoadModulejk_modulemodules/mod_jk.so
查看是否装载成功:
# httpd -M | grep jk
Syntax OK
jk_module (shared)
配置jk_module属性:httpd.conf中
JkWorkersFile/etc/httpd/conf.d/workers.properties
JkLogFilelogs/mod_jk.log
JkLogLeveldebug
JkMount/*TomcatA#此处的TomcatA必须与后端Tomcat的engine中定义哪个TomcatA的一致
JkMount/status/stat1
创建/etc/httpd/conf.d/workers.properties
worker.list=TomcatA,stat1
worker.TomcatA.port=8009
worker.TomcatA.host=192.168.20.1
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status
访问mod_jk自带的status页面:此页面也有管理功能http://s3.运维网.com/wyfs02/M02/75/4E/wKiom1Y1m0SjLzTZAAQxmDq_OZI787.jpg
改为负载均衡:并且会话绑定功能
修改httpd.conf:
JkWorkersFile/etc/httpd/conf.d/workers.properties
JkLogFilelogs/mod_jk.log
JkLogLeveldebug
JkMount/*lbcluster1
JkMount/jkstatus/stat1
修改/etc/httpd/conf.d/workers.properties
worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 192.168.20.1
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.20.2
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 1
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status
测试成功 介绍:proxy-balancer-manager模块页面的使用
BalancerMember http://192.168.20.1:8080 loadfactor=10 route=TomcatA
BalancerMember http://192.168.20.2:8080 loadfactor=10 route=TomcatB
ProxySet stickysession=ROUTEID
ServerName web1.lee.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
SetHandler balancer-manager
ProxyPass !
Order Deny,Allow
Allow from all
Order Deny,Allow
Allow from all
ProxyPass /status !
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
Order Deny,Allow
Allow from all
测试:
http://s3.运维网.com/wyfs02/M01/75/4E/wKiom1Y1qzfCYmTQAALgrtcUC_I129.jpg
delta-manager实现会话复制集群实现
在server.xml中Host上下文中添加:
配置我们的特定应用程序调用上面的cluster功能
# cp web.xml /data/webapps/WEB-INF/
# vim /data/webapps/WEB-INF/web.xml
添加
# scp /data/webapps/WEB-INF/web.xml node2:/data/webapps/WEB-INF/
web.xml 100%163KB 162.7KB/s 00:00
查看日志,发现集群中加入了主机:
tail -100 /usr/local/tomcat/logs/catalina.out
01-Nov-2015 00:09:04.215 INFO org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded Replication member added:org.apache.catalina.tribes.membership.MemberImpl 测试发现尽管负载均衡切换了主机,但是session不会改变
http://s3.运维网.com/wyfs02/M02/75/4C/wKioL1Y1vDKQJuGLAAEAuuEqp8I698.jpg
http://s3.运维网.com/wyfs02/M00/75/4E/wKiom1Y1u_jBhjkJAAEEJWAAlgI214.jpg
同理,使用Mod_jk和ajp连接后端也成功,使用nginx做反代也行,这里就不缀余了
使用msm实现session服务器实现:
借助于memcached:
yum install memcached
# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
提供四个java类库:
# ls
memcached-session-manager-1.8.3.jar msm-javolution-serializer-1.8.3.jar
memcached-session-manager-tc8-1.8.3.jarspymemcached-2.10.2.jar
javolution-5.5.1.jar
放置于两台tomcat服务器的/usr/local/tomcat/lib目录下:
# scp -r msm-1.8.3/ node2:/usr/local/tomcat/lib
The authenticity of host 'node2 (192.168.20.2)' can't be established.
RSA key fingerprint is d5:69:d0:fc:ce:90:14:14:6d:4c:52:82:53:a5:ed:0b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node2,192.168.20.2' (RSA) to the list of known hosts.
root@node2's password:
spymemcached-2.10.2.jar 100%429KB 428.8KB/s 00:00
memcached-session-manager-tc8-1.8.3.jar 100% 10KB10.2KB/s 00:00
msm-javolution-serializer-1.8.3.jar 100% 69KB69.4KB/s 00:00
memcached-session-manager-1.8.3.jar 100%144KB 143.6KB/s 00:00
javolution-5.5.1.jar 100%144KB 143.6KB/s 00:00
编辑server.xml文件Host上下文中定义context
页:
[1]