最近工作中需要做TCP層面的負載均衡,以前網站用的反向代理nginx只支持應用層的負載均衡,對於TCP協議是無能為力的,需要使用LVS(linux虛擬服務器)。
LVS的特點是高性能和極復雜的配置、對網絡環境的要求比較高。最近苦於LVS的配置測試,網上的文檔和社區都比較少,按照各種教程配置,TCP報文均無法連通,再往下深究就要去研究公司虛機的網絡結構了...
在尋找LVS配置調試方法時,看到一篇最近的文章講4月28日剛剛發布的nginx1.90,添加了支持TCP協議的負載均衡的,如果只是需要做TCP協議的負載均衡的話,這個是可以滿足需求的。如果涉及到UDP或者傳輸層以上的其他協議,那就必須得繼續死磕LVS了。
下面測試nginx代理TCP協議的配置。
realserver : 10.134.241.68
nginx :10.134.72.166
客戶端:10.129.157.168
TCP監聽端口:2014
一、配置nginx
看官網上的文檔 http://nginx.org/en/docs/stream/ngx_stream_core_module.html
nginx1.90對TCP協議的代理並不是默認開啟的,需要在編譯的時候配置 --with-stream 參數:
nginx.config文件參照官網:
stream { upstream cloudsocket { hash $remote_addr consistent; server 10.134.241.68:2014 weight=5 max_fails=3 fail_timeout=30s; } server { listen 2014; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass cloudsocket; } }
啟動nginx,發現nginx已經開始監聽2014端口了
二、測試客戶端連realserver
在客戶端通過telnet連接realserver的2014端口:
在realserver上查看網絡連接:
可以正常連接
三、測試客戶端連接nginx
在客戶端通過telnet連接nginx所在服務器的2014端口
在nginx機器上查看網絡連接
在realserver上查看網絡連接
可以注意到nginx是給做了一個TCP連接的中轉。
實際上這種負載均衡的方式有點像LVS的 VS/NAT 工作模式,數據報文的發送和接收都要經過負載均衡器,有需要替換的話這兩種技術是可以平滑過渡的。
它可以運算處理能力的瓶頸,但是當用戶請求越來越多時,nginx的處理能力將成為瓶頸。