通过上一篇博客,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力,但是这里存在一个问题: 当同一个用户第一次访问tomcat_8080 并且登录成功, 而第二次访问却被分配到了tomcat_8081, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
解决办法有两个:
一、ip_hash
上篇博客已有讲述,这里不再说了。
不过这种方案并不完美,当如下几种情况发生时就有问题:
1. 大量请求来之某个局域网,那么相当于就没有负载均衡了
2. 如果tomcat_8080 挂了,那么此时nginx只能把请求交给tomcat_8081,但是这里却没有记录session,用户体验依然受影响。
二、 redis+tomcat-sessoin-manager
既然第一种解决办法有问题,那么就采用第二种解决办法:用Redis来存取session.
Redis是什么呢?说简单点就是个独立的Hashmap,用来存放键值对的。
这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:
1. 用户提交账号密码的行为被分配在了tomcat8080上,登陆信息被存放在redis里。
2. 当用户第二次访问的时候,被分配到了tomcat8081上
3. 那么此时tomcat8081就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。
这样就规避了ip_hash 里会出现的两种问题了。