Tomcat集群,負載均衡,Session共享?怎麼解決?


你要有一個獨立的系統來存Session,比如用一個redis集群,或者看看淘寶開源

不要使用tomcat的http session,用redis來存

然後tomcat前放一個F5,或者別的,比如華為他們家的,來做負載均衡。如果流量很大的話,看下分散式網路設計,百度吧,很多經典,不多說了


負載均衡會話處理主要方式:粘滯session,session共享和不用session。

0. 粘滯session

不考慮了。

1. session共享

tomcat本身自帶session複製功能,開啟server.xml中的`cluster`節點,做相應的配置即可。參見[官方文檔][1]。tomcat本身的session複製功能並不好用,官方文檔也說方式只適合小集群:

This works great for smaller cluster but we don"t recommend it for larger clusters(a lot of Tomcat nodes).

於是乎大家就"自己動手,豐衣足食"了,自己包裝session,並使用第三方存儲(例如memcached)來存儲session,從而實現session共享,例如[memcached-session-manager][2]。但由於memcached的緩存剔除機制,使用memcached存儲session是不靠譜的,參見[這篇文章][3]。之前使用[memcachedb][4](即memcached+bdb)可以應對這個問題。

2. 不使用session

HTTP本身就是無狀態的,應用伺服器為了跟蹤用戶狀態而強行加入了session。伺服器為了保存用戶狀態就需要做額外的工作。

於是乎,Token-based的身份校驗因其伸縮性而廣受歡迎。在用戶登錄後,伺服器返回一個token給用戶,用戶後續的請求都需要附帶此token,伺服器會校驗該token來判斷用戶身份,進而完成具體業務(這裡掠過不談token的安全防護問題)。

[1]: Apache Tomcat 8 (8.0.26)

[2]: magro/memcached-session-manager · GitHub

[3]: http://bearmountain.io/why-you-should-not-store-your-sessions-in-memcached

[4]: MemcacheDB: A distributed key-value storage system designed for persistent


1、可以使用 Tomcat 本身的會話複製功能,按配置配一下就可以了,這樣會話會在各個 Tomcat 進程之間複製。

2、使用獨立的緩存伺服器來放會話,然後改寫創建會話和往會話裡面寫數據的方法,改成往會話伺服器 Get、Put。


跟nginx,jboss或者Apache配合使用tomcat。tomcat本身並發性能不是太好


推薦閱讀:

遊戲伺服器,每秒需要處理百來次資料庫的讀寫操作,如何設計比較好?
如何看待AWS亞馬遜入華?
在學校實驗室伺服器沒有許可權如何安裝軟體?

TAG:互聯網 | 伺服器 | Nginx | ApacheTomcat |