现在位置: 首页 > 博客文章 > 电脑相关 > IT架构 > 正文
使用 memcached 解决 tomcat 的 session 一致性问题
2021年01月17日 19:26:21 IT架构 ⁄ 共 2531字 暂无评论 ⁄ 被围观 2,532次

环境准备

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 得以解决。

如果测试过程中,发现访问 nginx 时,tomcat 不轮循切换,是 Chrome 浏览器的问题,换浏览器测试,或者给 nginx 做下配置即可,配置为:location /favicon.ico {},详细问你原因可以参看链接:https://bbs.csdn.net/topics/393650853

原文链接:https://blog.csdn.net/tzhuwb/article/details/112752190

给我留言

留言无头像?