nginx负载均衡session共享问题

用户的登陆请求被转发到tomcat1上;

假设是第一次调用getSession方法(使用true作为参数)得到session。这时session会被创建;

在创建了Session的同时,服务器会为该Session生成唯一的Session id;

程序得到session后,session.addAttribute(“user”, user);

然后将sesessionId返回给浏览器。

上述这种情况就是有状态的请求。

如果用户再次向服务器发送请求,假设被nginx转发到tomcat2服务器上,tomcat2上没有session,系统就会要求用户再次登陆。这显然是不合理的。

上述的情况就是session共享的问题。

解决方法:

1. session同步

tomcat支持动态将某个tomcat下的session复制到其他的tomcat中,但是这个方式是早期的企业级应用习惯的方式。现在很少使用。

这种方式在集群数量很少的时候,结果还是可以的。但是如果集群数量庞大,都需要复制session, 这时会因为网络延迟,或者session内容非常大。

就会有隐患,数据可能会存在不一致问题。

2. session黏着

对IP或者URL进行hash, 这种会导致资源分配不均匀的情况。

因为uri比ip地址相应数量多,变化就多,因此uri-hash比ip-hash分布更均衡些。

uri-hash需要第三方软件支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz

3. 将信息放到cookie

缺点:客户可能会禁用cookie可以被禁用;

cookie要随着浏览器传递,增大了传输的内容,

cookie大小有限制。

Firefox、Safari:4097byte,(key=value);Opera: 4096byte,(key=value)

Internet Explorer: 4096个byte,(key=value)

多字节字符计算为两个字节。在所有浏览器中,任何cookie大小超过限制都被忽略,且永远不会被设置。

4. 将session从系统中独立出来

目前主流做法是利用redis作为session管理的实现,因为redis访问极其快速。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?