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