负载均衡 + session sticky 会话保持 三
实例3 tomcat中 session 共享服务器,使用memcached、redis做共享的Session服务器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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]' }) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 上面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上查看。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类