Nginx 的 TCP 負載均衡介紹

2021-07-10 18:08:53 字數 2673 閱讀 1548

ginx plus的商業授權版開始具有tcp負載均衡的功能。從nginx 1.7.7版本開始加入的,現在變成了乙個商業收費版本,想要試用,需要在官網申請。也就是說,nginx除了以前常用的http負載均衡外,nginx增加基於tcp協議實現的負載均衡方法。

http負載均衡,也就是我們通常所有「七層負載均衡」,工作在第七層「應用層」。而tcp負載均衡,就是我們通常所說的「四層負載均衡」,工作在 「網路層」和「傳輸層」。例如,lvs(linux virtual server,linux虛擬服務)和f5(一種硬體負載均衡裝置),也是屬於「四層負載均衡」。

nginx使用了乙個新的stream模組來實現tcp負載均衡,這個模組,類似於http和mail模組,允許我們配置一組監聽tcp連線的服務。允許你配置多個服務的tcp連線,通過在upstream的server組中配置proxy_pass指令。

修改nginx.conf檔案,在http模組的統計目錄,新增乙個stream模組(和http等同級):

1

2

3

4

5

6

7

8

9

10

11

12

stream

server 192.168.0.3:1034;

server 192.168.0.4:1034;

server 192.168.0.6:1034;

}

}

當nginx從監聽埠收到乙個新的客戶端鏈結時,立刻執行路由排程演算法,獲得指定需要連線的服務ip,然後建立乙個新的上游連線,連線到指定伺服器。

tcp負載均衡支援nginx原有的排程演算法,包括round robin(預設,輪詢排程),雜湊(選擇一致)等。同時,排程資訊資料也會和健壯性檢測模組一起協作,為每個連線選擇適當的目標上游伺服器。如果使用 hash負載均衡的排程方法,你可以使用$remote_addr(客戶端ip)來達成簡單持久化會話(同乙個客戶端ip的連線,總是落到同乙個服務 server上)。

和其他upstream模組一樣,tcp的stream模組也支援自定義負載均和的**權重(配置「weight=2」),還有backup和 down的引數,用於踢掉失效的上游伺服器。max_conns引數可以限制一台伺服器的tcp連線數量,根據伺服器的容量來設定恰當的配置數值,尤其在 高併發的場景下,可以達到過載保護的目的。

nginx監控客戶端連線和上游連線,一旦接收到資料,則nginx會立刻讀取並且推送到上游連線,不會做tcp連線內的資料檢測。nginx維護乙份記憶體緩衝區,用於客戶端和上游資料的寫入。如果客戶端或者服務端傳輸了量很大的資料,緩衝區會適當增加記憶體的大小。

當nginx收到任意一方的關閉連線通知,或者tcp連線被閒置超過了proxy_timeout配置的時間,連線將會被關閉。對於tcp長連線, 我們更應該選擇適當的proxy_timeout的時間,同時,關注監聽socke的so_keepalive引數,防止過早地斷開連線。

tcp負載均衡模組支援內建健壯性檢測,一台上游伺服器如果拒絕tcp連線超過proxy_connect_timeout配置的時間,將會被認為 已經失效。在這種情況下,nginx立刻嘗試連線upstream組內的另一台正常的伺服器。連線失敗資訊將會記錄到nginx的錯誤日誌中。

如果一台伺服器,反覆失敗(超過了max_fails或者fail_timeout配置的引數),nginx也會踢掉這台伺服器。伺服器被踢掉60 秒後,nginx會偶爾嘗試重連它,檢測它是否恢復正常。如果伺服器恢復正常,nginx將它加回到upstream組內,緩慢加大連線請求的比例。

之所「緩慢加大」,因為通常乙個服務都有「熱點資料」,也就是說,80%以上甚至更多的請求,實際都會被阻擋在「熱點資料快取」中,真正執行處理的 請求只有很少的一部分。在機器剛剛啟動的時候,「熱點資料快取」實際上還沒有建立,這個時候爆發性地**大量請求過來,很可能導致機器無法「承受」而再次 掛掉。以mysql為例子,我們的mysql查詢,通常95%以上都是落在了記憶體cache中,真正執行查詢的並不多。

其實,無論是單台機器或者乙個集群,在高併發請求場景下,重啟或者切換,都存在這個風險,解決的途徑主要是兩種:

(1)請求逐步增加,從少到多,逐步積累熱點資料,最終達到正常服務狀態。

(2)提前準備好「常用」的資料,主動對服務做「預熱」,預熱完成之後,再開放伺服器的訪問。

tcp負載均衡原理上和lvs等是一致的,工作在更為底層,效能會高於原來http負載均衡不少。但是,不會比lvs更為出色,lvs被置於核心模組,而nginx工作在使用者態,而且,nginx相對比較重。另外一點,令人感到非常可惜,這個模組竟然是個付費功能。

Nginx的TCP負載均衡介紹

nginx plus的商業授權版開始具有tcp負載均衡的功能。從nginx 1.7.7版本開始加入的,現在變成了乙個商業收費版本,想要試用,需要在官網申請。也就是說,nginx除了以前常用的http負載均衡外,nginx增加基於tcp協議實現的負載均衡方法。http負載均衡,也就是我們通常所有 七層...

Nginx 的 TCP 負載均衡介紹

nginx plus的商業授權版開始具有tcp負載均衡的功能。從nginx 1.7.7版本開始加入的,現在變成了乙個商業收費版本,想要試用,需要在官網申請。也就是說,nginx除了以前常用的http負載均衡外,nginx增加基於tcp協議實現的負載均衡方法。http負載均衡,也就是我們通常所有 七層...

Nginx的TCP負載均衡介紹

nginx plus的商業授權版開始具有tcp負載均衡的功能。從nginx 1.7.7版本開始加入的,現在變成了乙個商業收費版本,想要試用,需要在官網申請。也就是說,nginx除了以前常用的http負載均衡外,nginx增加基於tcp協議實現的負載均衡方法。http負載均衡,也就是我們通常所有 七層...