为什么会出现session共享问题

  • 当我们使用负载均衡时,因为是多个tomcat, 当同一个用户第一次访问tomcat_8111 并且登录成功,第二次访问却被分配到了tomcat_8222, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
    image.png

解决方案

####. 使用ip_hash

通过ip标记用户,如果多次请求都来自同一个ip,那么就都分配到同一个tomcat上,
这样就不会出现负载均衡 session问题了. 处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。

image.png
问题:

  1. 大量请求来之某个局域网,那么相当于就没有负载均衡了.
  2. 如果tomcat_111崩溃了,那么此时nginx只能把请求给tomcat_222,但是这里却没有记录session,用户体验依然受影响。

####使用redis+tomcat-sessoin-manager

这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:
1. 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。
2. 当用户第二次访问的时候,被分配到了tomcat8222上
3. 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。

这样就规避了解决办法一: ip_hash里会出现的两种问题了。

image.png