2014-10-16 156 views
14

我們使用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粘性和最少連接邏輯?你知道哪些其他負載平衡器可以解決這個問題嗎?

+0

也許這應該被移到serverfault以獲得答案? – Collector 2016-08-14 04:37:41

+0

有趣的問題是,爲什麼「在服務器1上的負載繼續增加」 - 是否會出現這樣的情況:您的大多數用戶都坐在同一個或幾個NAT後面?在這種情況下,源IP上的散列效率並不高,您可以考慮通過'hash'指令使用更復雜的密鑰,而不是'ip_hash'。例如,您可能希望將某個用戶特定的URI部分或參數添加到密鑰中。 – wick 2017-10-07 18:47:06

+0

有用的答案,但我不確定他們是否回答了最初提出的問題。亞歷克斯? – 2017-10-14 11:35:19

回答

5

可能使用split_clients模塊可以幫助

upstream app { 
    ip_hash; 
    server 127.0.0.1:8001; 
} 

upstream app_new { 
    ip_hash; 
    server 127.0.0.1:8002; 
} 

split_clients "${remote_addr}AAA" $upstream_app { 
    50% app_new; 
    * app; 
} 

這將拆分流量和創建變量$upstreap_app你可以使用像一個:

server { 
    location /some/path/ { 
    proxy_pass http://$upstream_app; 
} 

這是一種變通方法least_conn和使用粘性會話的負載均衡器,「缺點」是如果需要添加更多服務器,則需要創建新流,例如:

split_clients "${remote_addr}AAA" $upstream_app { 
    30% app_another_server; 
    30% app_new; 
    * app; 
} 

來進行測試:

for x in {1..10}; do \ 
    curl "0:8080?token=$(LC_ALL=C; cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)"; done 

關於這個模塊的更多信息可在本文中找到(Performing A/B testing

+0

請注意,'split_clients'將使用一致的哈希來進行負載平衡,這可能會或可能不比循環更好,但不是什麼操作(基於least_conn的負載平衡) – wick 2017-10-07 18:40:45

4

您可以輕鬆地做到這一點使用HAProxy,我確實建議去through it thoroughly怎麼看您目前的設置可以受益。

隨着HA代理,你會碰到這樣的:

backend nodes 
    # Other options above omitted for brevity 
    cookie SRV_ID prefix 
    server web01 127.0.0.1:9000 cookie check 
    server web02 127.0.0.1:9001 cookie check 
    server web03 127.0.0.1:9002 cookie check 

它只是意味着代理正在跟蹤的請求往復使用的cookie的服務器。

但是,如果您不想使用HAProxy,我建議您設置您將會話實現更改爲使用內存數據庫,例如redis/memcached。這樣,您可以使用leastconn或任何其他算法,而無需擔心會話。