haproxy配置說明
對haproxy配置學習過程中幾個點進行總結,以備忘
1. maxconn設置
大家都知道haproxy啟動時可以通過命令行參數-n, -N設置連接數,在配置文件也可以在global段,default段,listen段中分別對maxconn進行設置,然而這些設置都啟什么作用,優先級又是怎樣的?
haproxy -f haproxy.cfg -n 60000 -N 50000 haproxy.cfg global maxconn 40000 default maxconn 30000 listen test1 bind 0.0.0.0:50000 maxconn 20000 server srv-test1... maxconn 10000 check listen test2 bind 0.0.0.0:6000 server srv-test2 ... maxconn 10000 check
以上圖為例:
global段中的maxconn: 設置進程的最大連接數,等同于命令行參數 -n
default段中的maxconn: 設置默認代理段的最大連接數, 等同于命令行參數 -N
listen段中的maxconn: 設置該代理的最大連接數,等同于命令行參數-N
server中的maxconn: 設置該后臺服務的最大連接數
其優先級為:
(1) 命令行參數-n指定的連接數 > global中通過maxconn設置的連接數
(2) listen段中的maxconn > default段中的maxconn > 命令行參數-N指定的連接數
根據上面的總結,如果按照前面的命令行參數和配置文件運行haproxy,那么
haproxy的最大連接數為60000
偵聽端口為50000的代理段,最大連接數為20000
偵聽端口未60000的代理段,最大連接數為30000(使用了default中maxconn的值)
其后端真正的服務最大連接數為10000
實際運行結果為:
2. ulimit
聊到最大連接數,那么必然會涉及到ulimit的設置,是否還需要對haproxy進行ulimit -n的設置?不進行設置的話那真正的限制數是多少?上圖中 maxsock=120015又是怎么來的?
官網的文檔中看到可以通過ulimit-n進行設置,然而并不推薦手動進行設置,因為haproxy自身會進行調整。
具體計算方式為:
maxsock = 10(默認值) + global.maxconn * 2 + global.maxpipes * 2 + bind數量 + check數量
其中maxconn對應global中maxconn或者命令行參數-n設置的值
maxpipes對應global中maxpipes的值
bind對應為bind的個數
check對應于對后臺真正服務進行健康檢測的個數
還是以前面的例子說明:
maxconn的值為60000;maxpipes沒有進行設置,其值為0;在50000,60000進行bind(實際還在1080端口進行了bind,以供管理員通過web查看haproxy的相關信息,上面的配置文件中并沒有列出來),那么bind的值等于3;對后臺服務srv-test1,srv-test2均進行了check,因此check的值為2
maxsock = 10 + 60000*2 + 0 + 3 + 2 = 120015
這個maxsock也就是最終的限制數,通過查看/proc/PID/limits可以驗證
如果在配置文件中配置了 ulimin-n,其值應該大于通過計算后得出的maxsock的值。
設置ulimit-n 130000的運行情況為
3. bind interface
通常,作為后臺服務的代理,haproxy會配置多網段的地址,比如在不同的網卡上分別綁定移動,聯通,電信,內網等地址。那么如果業務需要區分來自不同網段的客戶端時,可以考慮在bind中增加interface配置項來解決。例如:
listen 電信 bind 0.0.0.0:60000 interface eth0 server ... listen 聯通 bind 0.0.0.0:60000 interface eth1 server ... listen 內網 bind 0.0.0.0:60000 interface eth2 server ...
簡單翻了下代碼,發現haproxy對此的大概實現為:在解析配置文件的bind時,記錄interface指定的網卡名,然后通過
setsockopt(fd,SOL_SOCKET,SO_BINDTODEVICE,listener->interface,strlen(listener->interface)+1)來實現。
注意: 這種方式僅在linux下有效,且需要root權限。