我們使用Nginx作爲websocket應用程序的負載平衡器。每個後端服務器都會保存會話信息,因此每個來自客戶端的請求都必須在同一臺服務器上進行轉發。所以我們用ip_hash
指令來實現這一目標:Nginx,使用粘性和最少連接算法進行負載均衡
upstream app {
ip_hash;
server 1;
}
當我們要添加其他後端服務器出現問題:
upstream app {
ip_hash;
server 1;
server 2;
}
新的連接到服務器1和服務器2 - 但這不是什麼我們需要在這種情況下服務器1上的負載繼續增加 - 我們仍然需要粘性會話,但也啓用了least_conn
算法 - 因此我們的兩臺服務器接收的負載大致相等。
我們也考慮過使用Nginx-sticky-module
,但是文檔說如果沒有可用的粘性cookie,它將回退到循環默認的Nginx算法 - 所以它也不能解決問題。
所以問題是我們可以結合使用Nginx粘性和最少連接邏輯?你知道哪些其他負載平衡器可以解決這個問題嗎?
也許這應該被移到serverfault以獲得答案? – Collector 2016-08-14 04:37:41
有趣的問題是,爲什麼「在服務器1上的負載繼續增加」 - 是否會出現這樣的情況:您的大多數用戶都坐在同一個或幾個NAT後面?在這種情況下,源IP上的散列效率並不高,您可以考慮通過'hash'指令使用更復雜的密鑰,而不是'ip_hash'。例如,您可能希望將某個用戶特定的URI部分或參數添加到密鑰中。 – wick 2017-10-07 18:47:06
有用的答案,但我不確定他們是否回答了最初提出的問題。亞歷克斯? – 2017-10-14 11:35:19