0
首先,這個應用在非集羣環境中工作得非常好。在Amazon EC2上使用彈性負載平衡器Glassfish集羣會話問題
我們遇到的問題是ELB在會話期間首先將羣集路由到羣集中的一臺服務器,然後再到第二臺服務器。第二臺服務器找不到會話。例如
- iOS應用程式通過一個登錄呼叫到Glassfish的4服務器羣集(我們使用OAuth/Facebook的令牌,所以沒有Glassish安全領域)。
- Amazon Elastic Load Balancer(ELB)發送到服務器1.
- 會話已通過身份驗證,用戶已登錄,會話cookie傳回應用程序。
- 立即應用程序發送另一個需要身份驗證的請求(這是一個有效的會話)。
- 的ELB決定將請求發送到服務器2
- 在我們的身份驗證的Servlet過濾器,服務器2找不到與此Cookie
- 該servlet說,用戶沒有通過驗證,並通過在ID會話通話失敗。
我們的代碼是用來尋找會話(如果會話不立即返回失敗)非常典型:
HttpSession session = req.getSession(false);
//psuedocode
if session == null then session not authenticated log and return
else session authenticated, log and return
如果第二個呼叫被路由到相同的服務器登錄,第二個電話工作正常。每當一個呼叫(無論是第二,第三,第四,還是第二)進入第二臺服務器,身份驗證都會失敗,因爲它無法在第二臺服務器上找到會話。
我正在查看是否有人遇到類似這樣的事情以及您如何解決問題。在ELB上使用粘性會話更好還是使用JK或AJP的Apache Web服務器是更好的選擇?把我的頭頂部
分佈在web.xml中,我設置了非多播聚類 – BillR
我注意到這個網頁上有一個有趣的評論:http://docs.oracle.com/cd/E18930_01/html/821- 2426/abdla.html注 - 將高可用性會話持久性與負載平衡器一起使用時,請使用包含基於會話的粘性的負載平衡器作爲其負載平衡算法的一部分。否則,會話數據可能被誤導或丟失。包含基於會話的粘性的負載均衡器的示例是Oracle GlassFish Server中提供的Loadbalancer插件。 – BillR
您是否發現在非故障轉移方案中訪問第二臺服務器時遇到任何問題?第二臺服務器被攻擊的唯一原因是由於ELB循環實施。第二臺服務器是否仍然能夠返回會話的引用。我們的應用程序只是試圖找到與會話cookie相同的會話ID,但是當我們在我的帖子中打電話時,會話中會出現'null'。當初始登錄創建會話的第一臺服務器時,我看到一個JREPLICA cookie。所以我想知道這是否是'我們如何解決會話'問題。 – BillR