负载均衡 + 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上查看。

  

posted @   yuanbangchen  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示