问题未结
目的
将目前采用ip hash负载集群改为session复制的集群,实现用户登录访问不受节点重启影响。
简述
网上搜索到的关于session复制的文章资料基本都是搭建,没有关于恢复验证的介绍。目前实验方案也卡在tomcat集群节点重启情况下的session未复制问题。另外从redis中读取key值的内容以及和开发讨论有关用户信息保存在哪里,也确认是保存在session中,目前从日志中也没有发现可以与session关联的异常信息。
方案1:tomcat cluster
基于tomcat自有的tomcat集群,session在各个server之间保持同步复制。
配置要点:
# tomcat的server.xml配置增加
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
# 应用包内的web.xml增加
<distributable/>
实验现象:
- 通过nginx负载访问应用时,会发现两个tomcat日志均在刷新,同时nginx日志的upstream也在两个tomcat来回变化。
- 用户登录后,状态始终保持。
- 后台随机停止一个tomcat,此时持续刷新用户状态仍然保持登录状态
- 再次启动该tomcat后,反复刷新点击页面会有一定几率出现需要登录的页面, 说明之后启动的tomcat session信息不存在。
方案2: tomcat redis
配置要点:
# 搭建redis server
# tomcat/lib下载三个相关的包:
tomcat-redis-session-manager-7.jar
commons-pool2-2.2.jar
jedis-2.5.2.jar
# conf/context.xml 增加redissession配置
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.100.202"
port="7710"
database="0"
maxInactiveInterval="60" />
实验现象:
- 现象同之前方案相同。
- 终端连接redis,有sessionID为key的键,查看其值大多数乱码,但从个别可读字符应该是包含了当前用户信息的各种字段。