使用 memcached 解决 tomcat 的 session 一致性问题
环境准备
nging:安装在 192.168.220.243(node243),版本为 nginx-1.19.6.tar.gz。
memcached:安装在 192.168.220.100(node100),版本为1.4.4。
tomcat:安装在 192.168.220.71(Rserver71)和 192.168.220.72(Rserver72),版本为 7。
第一步,安装 memcached 并启动
在 node100 机器上安装 memcached 服务,并启动服务。相关命令如下:
安装服务:yum -y install memcached
启动服务:service memcached start
第二步,测试 memcached 服务
memcached 服务启动后,默认端口为11211。
命令:telnet 192.168.220.100 11211
查看软件信息命令:stats
第三步,安装 tomcat 并启动
这里在另外两台测试机 Rserver71 和 Rserver72 上分别安装 tomcat7 并启动 tomcat 服务。
详细步骤略,请自行查阅。测试结果如下:
第四步,配置 nginx 并测试
修改 nginx 配置文件 nginx.conf,添加两个 tomcat 的访问配置,让其轮循访问。
#gzip on;
upstream myweb {
server 192.168.220.71:7070 weight=5;
server 192.168.220.72:7070 weight=5;
}server {
listen 80;
server_name 192.168.220.243;#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myweb;
root html;
index index.html index.htm;
}...
}
访问 nginx,测试轮循访问 tomcat。
第五步,上传相关 jar 包到 tomcat 目录
上传 memcached-session-manager 及相关依赖包到 tomcat 的 lib 目录。
包下载地址:链接:https://pan.baidu.com/s/1xmRU0ic78u8-wvjeTmGVCw (提取码:mzdc)
第六步,修改 tomcat 的 server.xml 配置文件
修改配置:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm71">
这个配置是 session 中 tomcat 的标识名。
72 机器同理修改为 jvmRoute="jvm72"
第七步,修改 tomcat 测试页面获取 session 信息
命令:vi webapps/ROOT/index.jsp
内容修改为如下:
<html>
<h1>tomcat7-71</h1>
SessionID:<%=session.getId()%></br>
SessionIP:<%=request.getServerName()%></br>
</html>
72 机器同理修改,修改后分别重启两个 tomcat。
可以看到在 tomcat 轮循访问时,sessionId 也在不停发生变化。
第八步,添加 memcached 配置
分别修改两个 tomcat 的 context.xml 配置文件,添加关于 memcached 部分的配置信息。
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource><!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
--><!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
--><Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:192.168.220.100:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /></Context>
修改后分别重启两个 tomcat 服务,再次通过 nginx 访问测试轮循,可以看到 sessionId 已保持一致。
通过配置和测试,两个 tomcat 的 session 一致性问题,已经通过 memcached 得以解决。