负载均衡 + session sticky 会话保持 三
实例3 tomcat中 session 共享服务器,使用memcached、redis做共享的Session服务器。
1.规划 192.168.80.110 t0 调度器 Nginx 192.168.80.130 t1 tomcat1 JDK8、Tomcat8 memcached 192.168.80.140 t2 tomcat2 JDK8、Tomcat8 memcached 时间同步 其它说明https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html 2.nginx设置 http { upstream tomcats { #默认wrr server www.aaa.com:8080; server www.bbb.com:8080; } server { listen 80; server_name www.magedu.net; location / { proxy_pass http://tomcats; } } } 3.上传下列文件上$CATALINA_HOME/lib/ 目前项目托管在Github,https://github.com/magro/memcached-session-manager参考说明 安装msm(memcached session manager)提供将Tomcat的session保持到memcached或redis的程序,可以实现高可用。 将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中去, 文件说明: Tomcat的Session管理类,Tomcat版本不同 memcached-session-manager-2.3.2.jar memcached-session-manager-tc8-2.3.2.jar Session数据的序列化、反序列化类 官方推荐kyro,在webapp中WEB-INF/lib/下 驱动类 memcached(spymemcached.jar) Redis(jedis.jar) cat /$CATALINA_HOME/lib/ asm-5.2.jar kryo-3.0.3.jar kryo-serializers-0.45.jar memcached-session-manager-2.3.2.jar memcached-session-manager-tc8-2.3.2.jar minlog-1.3.1.jar msm-kryo-serializer-2.3.2.jar objenesis-2.6.jar reflectasm-1.11.9.jar spymemcached-2.12.3.jar 4.sticky模式 sticky模式原理 当请求结束时Tomcat的session会送给memcached备份。即Tomcat session为主session,memcached session为备session,使用memcached相当于备份了一份Session。 如果查询Session时Tomcat会优先使用自己内存的Session,Tomcat通过jvmRoute发现不是自己的Session,便从memcached中找到该Session 如果是更新本机Session,请求完成后更新memcached。 4.1 <Engine name="Catalina" defaultHost="www.bbb.com" jvmRoute="Tomcat2" > 4.2 配置放到$CATALINA_HOME/conf/context.xml :特别注意,t1配置中为failoverNodes="n1", t2配置为failoverNodes="n2" <Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.80.130:11211,n2:192.168.80.140:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/> </Context> 说明: memcached的节点们;n1、n2只是别名,可以重新命名。 failoverNodes故障转移节点,n1是备用节点(相对于n2,n1备用节点),n2是主存储节点。 另一台Tomcat将n1改为n2,其主节点是n1,备用节点是n2。 如果配置成功,可以在日志中查看 [root@localhost7e webapps]# tail -f /usr/local/tomcat/logs/catalina.out 信息 [www.aaa.com-startStop-1] de.javakaffee.web.msm.MemcachedSessionService.startInternal -------- - finished initialization: - sticky: true - operation timeout: 1000 - node ids: [n2] - failover node ids: [n1] - storage key prefix: null - locking mode: null (expiration: 5s) 5. 任务一台上安装python环境准备python程序测试查看memcached中的SessionID [root@localhost7A tomcat]# cat showmemcached.py import memcache # pip install python-memcached mc = memcache.Client(['192.168.80.130:11211','192.168.80.140:11211'], debug=True) stats = mc.get_stats()[0] print(stats) for k,v in stats[1].items(): print(k, v) print('-' * 30) # 查看全部key print(mc.get_stats('items')) # stats items 返回 items:5:number 1 print('-' * 30) #print(mc.get_stats('cachedump 5 0')) # stats cachedump 5 0 # 5和上面的items返回的值有关;0表示全部 for x in mc.get_stats('cachedump 5 0') # stats cachedump 5 0 # 5和上面的items返回的值有关;0表示全部 print(x) 6. 网页访问测试 yum install python3 pip3 install python-memcached chmod +x memechchen.py python3 memechchen.py
non-sticky模式原理(上面第四步) 这个方法比较常。 从msm 1.4.0之后开始支持non-sticky模式。 Tomcat session为中转Session,如果n1为主session,n2为备session。产生的新的Session会发送给主、备memcached,并清除本地Session。 n1下线,n2转正。n1再次上线,n2依然是主Session存储节点。 memcached配置 放到 $CATALINA_HOME/conf/context.xml 中 <Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.80.130:11211,n2:192.168.80.140:11211" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/> </Context> 查看变化 ('192.168.80.130:11211 (1)', {'bak:FF8F791089E0EC3320A4B9F2A1FF729F-n2.Tomcat1': '[97 b; 1659964159 s]'}) ('192.168.80.140:11211 (1)', {'FF8F791089E0EC3320A4B9F2A1FF729F-n2.Tomcat1': '[97 b; 1659964140 s]'})
上面memcached使用redis配置 下载jedis.jar,放到$CATALINA_HOME/lib/,对应本次安装就是/usr/local/tomcat/lib。 # yum install redis # vim /etc/redis.conf bind 0.0.0.0 # systemctl start redis 配置放到$CATALINA_HOME/conf/context.xml <Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="redis://192.168.80.100:6379" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/> </Context> 使用命令或工具登录到Redis上查看。