2015-02-10 35 views
3

我正面臨一個有趣的問題。我們運行基於狀態的基於HTTPS的應用程序。狀態基於會話cookie進行維護。應用程序的設計方式是,如果會話突然終止,應用程序將恢復到主屏幕,任何未保存的數據都將丟失。所以對我們來說保持會話非常重要。ELB是基於tcp的排空嗎?

過去的一些觀點決定爲此使用AWS服務,而當前體系結構具有ELB,可將負載平衡到自動縮放組。使用的第一個體系結構啓用了基於HTTP的粘性會話。在測試過程中發現,縮小現有會話時會立即關閉並重新路由到可用實例。即使在啓用排水(5分鐘的時間)之後也會發生這種情況,根據文件應該防止這種情況發生。有人能告訴我我們做錯了什麼,這是否是這樣的假設工作?

我的第二個問題是,當使用ELB來平衡基於tcp連接的負載時,我們發現情況並非如此。在這種情況下,當我們縮減舊的tcp連接時,它會一直保持到它關閉或超時,並且新連接被路由到其他實例。這是我們正在使用的當前設置。所以我的問題是爲什麼ELB在這兩種情況下表現不同,並且有什麼方法可以讓ELB使用基於tcp連接的HTTP粘性會話和流失?

如果您確實有答案,請與配置詳細信息分享。謝謝。

回答

2

關於問題#1 - 這是ELB連接排水的預期行爲。

來自doc:「連接耗盡導致ELB負載平衡器停止向註銷實例或不健康實例發送新請求,同時保持現有連接處於打開狀態,這允許負載平衡器完成對請求進行的註銷或不健康的情況。「 http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#conn-drain

ELB不知道您的會話狀態,因爲這是您的應用程序管理的東西。連接耗盡僅適用於網絡級別。如果沒有與您的實例打開連接,ELB可能會選擇您的實例從AutoScaling註銷(並且自動縮放將稍後終止它)

問題2:在負載平衡器上使用TCP模式時,它嘗試着嘗試瞭解HTTP內容(如cookie),並將從客戶端收到的任何內容高興地發送到後端。您正在嘗試的行爲可能與客戶端瀏覽器管理連接的方式有關(即保持開放連接)。這必須通過網頁開發工具進行驗證。

對於您的使用案例,我會調查自動縮放生命週期事件,以便在您的實例上進行自動縮放時自動觸發您的一段代碼。使用生命週期事件,您可以在實例的關鍵生命週期狀態中觸發自定義代碼,並採取其他操作或要求Auto Scaling放棄更改。

詳情,可瀏覽這裏http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/lifecycle-hook-considerations.html

+0

「保持現有的連接開放」是指在現有的TCP連接保持活力,只要它們不被任何一方的權利關閉。但是當我們測試時,這不是正在發生的事情。我們在HTTP請求上保持活躍狀態​​,並且在我們針對獨立服務器進行測試時,客戶端和服務器都保持tcp連接處於打開狀態。但是ELB只是關閉連接,儘管啓用了消耗並且使用基於應用程序的會話粘性。 – 2015-02-10 17:47:27

+0

默認情況下,ELB將連接保持連接60秒,以連接到您的客戶端和後端。您可以隨時更改該值,並指定1到3600秒之間的任何值。如果您在後端指定保持活動狀態,並且希望負載平衡器負責關閉連接,則必須使用比保持活動狀態的值更低的值配置ELB空閒超時 – 2015-02-10 21:15:27

+0

連接耗盡與連接保持活動無關。保持活躍是一種網絡優化,可避免爲每個HTTP請求打開TCP連接的開銷。連接耗盡是關於當要從負載平衡器移除實例時保持用戶連接,以避免中斷正在進行的客戶HTTP連接。最後,HTTP會話僅在應用程序級別可見,並且從ELB不可見(只有會話cookie在ELB的HTTP模式下工作時) – 2015-02-10 21:19:48