同一域名下的网站的cookie都是一样的。所以无论几台服务器,无路请求分配到哪一台服务器上同一用户的cookie是
不变的。也就是说cookie对应的session也是唯一的。
lib
下即可:
tomcat-redis-session-manager
最后更新的年代相隔较久,代码中使用的Tomcat api出现了过时删去的情况,在Tomcat8下会出现问题,如果想在Tomcat8下使用,需要自行对过时的api进行修改,替换成新的Tomcat api。
上文介绍的方法其实已经可以搭建一个完整的Tomcat集群了,如果系统想要一个更安全可靠的环境,那么nginx其实也可以做集群,这里略去不说,我们想要说的是redis集群。
上面我们已经说到redis是session的公共存储区,如果redis不幸挂掉的话将会导致致命的问题,因为无session源可取,Tomcat中有session读取的接口会直接报错。所以搭建一个redis集群还是很有必要的,幸好redis对分布式HA的搭建支持得很好,原生即有一套sentinel哨兵机制即可用。
以sentinel模式启动的redis实例起到了监控者的作用,redis集群以master-slave的模式启动,消息不再直接发给redis实例,而是发给sentinel,由sentinel同步至所有的redis实例,如果出现redismaster实例挂掉的情况,会由sentinel发现,根据配置还可以由sentinel自己组成的集群去选举产生新的master,新的master将会承担起作用,起到了灾难自动回恢复的作用。
这里来说一下sentinel集群的配置:
我们使用两个redis实例来组成master-slave,需要三个sentinel组成哨兵集群来监控两个redis实例,在master出现问题的时候选举产生新的master。
路径假设如下:redis1
redis2
sentinel1
sentinel2
sentinel3
配置redis1/redis.conf
为master:
bind 127.0.0.1
port 6379
配置redis2/redis.conf
为redis1的slave:
bind 127.0.0.1
port 6379
slaveof 6379
配置sentinel1/redis-sentinel.conf
:
port 26379
sentinel monitor mymaster 6379 2
指定redis1为master,slave信息会在启动后被sentinel监听到并自动写入到配置文件中,因此不需要手动写入,最后的quorum表示当有2个sentinel判断master挂掉的时候即可选举slave为新的master。
sentinel2
,sentinel3
配置相同。
这样之后启动redis和sentinel集群,即可构建一个高可用的redis集群。可以尝试一下把redis1
这个master挂掉,sentinel就会探查到并且在2个sentinel都探查到的时候即会选举产生新的master:
# +monitor master mymaster 6379 quorum 2
# +sdown master mymaster 6379
同时我们的Tomcat配置也将改为使用sentinel集群的版本:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
sentinelMaster="mymaster"
sentinels=":26379,:26379,:26379"
maxInactiveInterval="60"/>
这个集群搭建完成后,我们的系统将会更为稳定: