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

  

posted @ 2022-08-08 20:32  yuanbangchen  阅读(173)  评论(0编辑  收藏  举报