Netty Tcp 負載均衡(上)----Nginx
為什么要負載均衡
隨着設備連接數增多,單台服務器支撐的TCP長連接數有限,這個時候程序架構就需要改變,一般都會采取橫向擴展,增加多台服務器程序。怎么將TCP長連接均衡的路由到不同的服務器,這個時候就需要實現負載均衡了。
兩種不同的場景和方案
目前筆者想到的兩種應用場景是:
- 客戶端實現比較簡單,所有客戶端都會連接同一個ip域名和端口。客戶端不會去請求可用服務器列表,然后去根據具列表選擇不同的服務器。比如說一些DTU等硬件設備或者因為前期沒有考慮負載均衡而導致的遺留老項目。
解決方案:
在目標服務器上做TCP負載均衡,轉發到不同的服務器上,但是這種方案需要解決負載均衡服務器的單點故障。例如可以通過Nginx開啟TCP負載均衡功能來實現。 - 客戶端本身就實現了請求可用服務器列表,然后根據列表去連接不同的服務器。
方案一:Nginx實現負載均衡
1. 安裝Nginx
參考的資料:https://my.oschina.net/ouyush...
參考的資料:http://www.jiagoumi.com/work/...
(0)安裝依賴的軟件
(1)下載:wget http://nginx.org/download/ngi...
(2)解壓:執行指令
tar -xzvf nginx-1.12.2.tar.gz -C 你的目錄
(3)配置: 需要添加 with-stream參數 nginx tcp負載均衡需要
./configure --prefix=/opt/nginx-1.9.3 --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-pcre --with-http_realip_module --with-stream
(4)make
(5)make install
nginx會安裝到特定的文件夾 /opt,如果一開始把源碼包下載到改目錄,編譯安裝時會提示類似錯誤
把源碼包移到其它目錄就能解決。
2.修改nginx.conf添加負載均衡配置
官方樣例:
worker_processes auto; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { upstream backend { hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; } upstream dns { server 192.168.0.1:53535; server dns.example.com:53; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass backend; } server { listen 127.0.0.1:53 udp; proxy_responses 1; proxy_timeout 20s; proxy_pass dns; } server { listen [::1]:12345; proxy_pass unix:/tmp/stream.socket; } }
自定義測試配置為:
#tcp load balance stream{ #更多更詳細的參數,查看文檔或網絡 upstream netty_test{ server 192.168.0.26:6666 weight=1; server 192.168.0.26:6667 weight=1; } server{ listen 6665; proxy_pass netty_test; } } http { include mime.types; default_type application/octet-stream; ...
以上配置只是為了方便測試,因此配置的較為簡陋,生產環境中,詳細配置請看官方樣例。
相關端口不要忘記開放,會存在防火牆導致無法連接的情況。
3.連接測試
啟動兩個netty服務器程序,在生產環境中會部署到不同的服務器,這里測試,在同一台PC上啟動兩個netty程序,端口分別為6666和6667。使用客戶端連接192.168.0.26:6665,當建立4個連接時,客戶端會被平均路由到 192.168.0.26:6666和6667兩個server