在我們的測試環境中,我們發現了一個奇怪的 HAProxy 行為。我們使用 RHEL 7 提供的標準haproxy-1.5.18-8.el7.x86_64
RPM。
根據我們的理解,接受的平行連接總數被定義為maxconn*nbproc
fromglobal
的部分haproxy.cfg
。
但如果我們定義:
maxconn 5
nbproc 2
我們預計並行連接的總數為 10 maxconn
。
為什麼 nbproc 被忽略?
這是完整的 haproxy.cfg:
# Global settings
global
log 127.0.0.1 local2 warning
log 10.229.253.86 local2 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 5
user haproxy
group haproxy
daemon
nbproc 2
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
stats socket /var/run/haproxy.sock mode 600 level admin
stats socket /var/run/haproxy_hamonit.sock uid 2033 gid 2033 mode 600 level admin
stats timeout 2m
defaults
mode tcp
log global
option tcplog
option dontlognull
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 30s
timeout server 30s
timeout http-keep-alive 10s
timeout check 10s
bind-process all
frontend ha01
bind 10.229.253.89:80
mode http
option httplog
option http-server-close
option forwardfor except 127.0.0.0/8
default_backend ha01
backend ha01
balance roundrobin
mode http
option httplog
option http-server-close
option forwardfor except 127.0.0.0/8
server server1 10.230.11.252:4240 check
server server2 10.230.11.252:4242 check
listen stats 10.229.253.89:1936
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:foo
答案1
我已經找到罪魁禍首了我們正在從套接字介面讀取統計資料。然而,在我們的配置中,只有 1 個套接字接口,僅綁定到一個進程。因此我們無法從其他進程獲得統計數據。不幸的是,HAProxy 不支援透過套接字介面聚合統計資訊(如果支持,請分享如何實現)。
所以當我更改為精確綁定時:
stats socket /var/run/haproxy.sock mode 600 level admin process 1
stats socket /var/run/haproxy2.sock mode 600 level admin process 2
我可以在以下情況下從兩個套接字獲取統計資料nbproc=2
:
echo "show sess" | socat /var/run/haproxy.sock stdio
echo "show sess" | socat /var/run/haproxy2.sock stdio