基於會話cookie的負載均衡?
我有一個要在多台伺服器上執行的 Web 應用程序。我想確保使用同一會話(值為 JSESSIONID=x 的 HTTP cookie 標頭)的請求始終與同一伺服器通信。也就是說,直到會話在某些情況下“移動”到不同的伺服器(不僅當伺服器發生故障時,還由於某些伺服器端記憶體和性能策略)。
我的 Web 應用程序在這種情況下執行良好,但我應該使用哪種負載均衡器?顯然,我可以在應用程序級別進行負載平衡,但我正在尋找更有效的東西。也許是專門的硬體(也許不是)?我不能花很多錢…
更新
到目前為止,感謝您的回答:我現在發現,可以將Pound和HAProxy配置為查找某些 cookie。我還不知道,如果他們還允許動態更新映射(當會話“移動”到不同的應用伺服器時)?
是否有(廉價的)硬體解決方案也可以做到這一點?(這會比額外的負載平衡伺服器成本低嗎?)
通常不建議使用“粘性(持久)會話”。如果這樣做,您將失去負載平衡的許多好處。負載將無法平衡,您將失去高可用性,因為某些客戶端將無法在發生故障時訪問您的應用程序。
你希望你的會話是動態的。使用 Java,它通常儲存在記憶體中,並通過多播聚集到所有伺服器。更常見的是,會話將儲存在數據庫中。
如果您的 Web 應用程序需要粘性會話,那麼您的體系結構可能需要改進。
就負載均衡器解決方案而言,有很多解決方案,並且該主題已在此處進行了廣泛介紹。我喜歡LVS。其他喜歡nginx。 被博科收購的Foundry Networks生產一些可靠的商業產品。它們是硬體負載均衡器的主要商業解決方案。 梭子魚還有一個基於 Linux/OSS 的“設備”,可用於負載平衡。
然後為您提供幾個解決方案。
編寫一個使用數據庫儲存會話資訊的會話儲存方法,如果它在多個伺服器上,您可以將數據庫集群。這實際上取決於您決定如何組織事物,其他想法是在網路伺服器後面使用帶有 memcache 的伺服器並將會話儲存在那裡。
這樣一來,您就可以在一個地方擁有會話,並且客戶端被定向到哪個 Web 伺服器不再重要。