haproxy配置說明

jopen 10年前發布 | 17K 次閱讀 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

實際運行結果為:

haproxy配置說明

2. ulimit

聊到最大連接數,那么必然會涉及到ulimit的設置,是否還需要對haproxy進行ulimit -n的設置?不進行設置的話那真正的限制數是多少?上圖中 maxsock=120015又是怎么來的?

haproxy配置說明

官網的文檔中看到可以通過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可以驗證

haproxy配置說明

如果在配置文件中配置了 ulimin-n,其值應該大于通過計算后得出的maxsock的值。

設置ulimit-n 130000的運行情況為

haproxy配置說明

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權限。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!