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访问极其快速。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM