應用伺服器的高可用架構設計主要基于服務無狀态這一特性,但是事實上,業務總
是有狀态的,
-
在交易類的電子商務網站,需要有購物車記錄使用者的購買資訊,使用者每次
購買請求都是向購物車中增加商品
- 在社交類的網站中,需要記錄使用者的目前登入狀态、最新釋出的消息及好友狀态等,使用者每次重新整理頁面都需要更新這些資訊
Web 應用中将這些多次請求修改使用的上下文對象稱作會話(Session)
單機情況下,Session 可由部署在伺服器上的Web 容器( 如Tomcat) 管理
在使用負載均衡的叢集環境中,由于負載均衡伺服器可能會将請求分發到叢集中的任何一台應用伺服器上,是以保證每次請求依然能夠獲得正确的Session比單機時要複雜很多
叢集環境下,Session 管理主要有以下幾種手段
1 Session 複制
Session 複制是早期系統使用的一種伺服器叢集Session管理機制
應用伺服器開啟Web 容器的Session複制功能,在叢集中的幾台伺服器之間同步Session對象,
使得每台伺服器上都儲存所有使用者的Session資訊,這樣任何一台機器當機都不會導緻
Session 資料的丢失,而伺服器使用Session 時,也隻需要在本機擷取即可
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMWNiNTNyEjZmFWMxMmZxEWZ4QmN5MjZ1MmZwEDN3gTMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
使用Session複制實作應用伺服器共享Session
1.1 優點
雖然簡單,從本機讀取Session資訊也很快速,但隻能使用在叢集規模比較小的情況下
1.2 缺點
- 當叢集規模較大時,叢集伺服器間需要大量的通信進行Session複制,占用伺服器和網絡的大量資源,系統不堪負擔
- 而且由于所有使用者的Session資訊在每台伺服器上都有備份,在大量使用者通路的情況下,甚至會出現伺服器記憶體不夠Session使用的情況
- 而大型網站的核心應用叢集就是數千台伺服器,同時線上使用者可達千萬,是以并不适用這種方案
2 Session綁定(黏滞sticky)
可以利用負載均衡的源位址Hash算法實作
負載均衡伺服器總是将來源于同一IP的請求分發到同一台伺服器上(也可以根據Cookie資訊将同一個戶的請求總是分發到同一台伺服器上,當然這時負載均衡伺服器必須工作在HTTP 協定層)
這樣在整個會話期間,使用者所有的請求都在同一台伺服器上處理,即Session綁定在某台特定伺服器上,保證Session總能在這台伺服器上擷取
利用負載均衡的會話黏滞機制将請求綁定到特定伺服器
但是Session綁定的方案顯然不符合我們對系統高可用的需求
缺點
一旦某台伺服器當機,那麼該機器上的Session也就不複存在了,使用者請求切換到其他機器後因為沒有Session而無法完成業務處理
是以雖然大部分負載均衡伺服器都提供源位址負載均衡算法,但很少有網站利用這個算法進行Session管理
3 利用Cookie 記錄Session
早期系統使用C/S架構,一種管理Session的方式是将Session記錄在用戶端,每次請求伺服器的時候,将Session放在請求中發送給伺服器,伺服器處理完請求後再将修改過的Session響應給用戶端
如今的B/S架構,網站沒有用戶端,但是可以利用劉覽器支援的Cookie記錄Session
利用Cookie 記錄Session資訊
3.1 缺點
- 受Cookie大小限制,能記錄的資訊有限
- 每次請求響應都需要傳輸Cookie,影響性能
- 如果使用者關閉Cookie,通路就會不正常
但是
3.2 優點
由于Cookie的
- 簡單易用
- 可用性高
- 支援應用伺服器的線性伸縮
- 而大部分應用需要記錄的Session 資訊又比較小
是以事實上,許多網站都或多或少地使用Cookie記錄Session。
4 Session伺服器
那麼有沒有可用性高、伸縮性好、性能也不錯,對資訊大小又沒有限制的伺服器叢集Session管理方案呢?
答案就是Session伺服器!利用獨立部署的Session伺服器(叢集)統一管理Session,應用伺服器每次讀寫Session時,都通路Session伺服器
利用Session伺服器共享Session
這種方案事實上是将應伺服器的狀态分離,分為
- 無狀态的應用伺服器
- 有狀态的Session伺服器
然後針對這兩種伺服器的不同特性分别設計其架構
對于有狀态的Session伺服器,一種比較簡單的方法是利用
-
分布式緩存
即使用cacheDB存取session資訊,應用伺服器接受新請求将session資訊儲存在cache DB中,當應用伺服器發生故障時,web伺服器會周遊尋找可用節點,分發請求,當應用伺服器發現session不在本機記憶體時,則去cache DB中查找,如果找到則複制到本機,這樣實作session共享和高可用。
- 資料庫等
在這些産品的基礎上進行包裝,使其符合Session 的存儲和通路要求。如果業務場景對Session 管理有比較高的要求,比如利用Session 服務內建單點登入(SSO)、使用者服務等功能,則需要開發專門的Session服務管理平台。