Load-Balancing
如何解決 haproxy 負載均衡器上的後端連接錯誤?
以下是我的 haproxy 配置
global log /dev/log local0 notice log /dev/log local0 debug log 127.0.0.1 local0 chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon maxconn 5000 defaults log global mode tcp option tcplog option tcpka timeout connect 60s timeout client 1000s timeout server 1000s frontend aviator-app option tcplog log /dev/log local0 debug bind *:4433 ssl crt /etc/haproxy/certs/{domain_name}.pem mode tcp option clitcpka option http-server-close maxconn 5000 default_backend aviator-app-pool # Table definition stick-table type ip size 2000k expire 30s store conn_cur # Allow clean known IPs to bypass the filter tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst } # Shut the new connection as long as the client has already 100 opened # tcp-request connection reject if { src_conn_cur ge 500 } tcp-request connection track-sc1 src backend aviator-app-pool option tcplog log /dev/log local0 debug balance roundrobin mode tcp option srvtcpka option http-server-close maxconn 50 # list each server server appserver1 10.0.1.205 maxconn 12 server appserver2 10.0.1.183 maxconn 12 server appserver3 10.0.1.75 maxconn 12 server appserver4 10.0.1.22 maxconn 12 # end of list listen stats bind *:8000 mode http log global maxconn 10 clitimeout 100s srvtimeout 100s contimeout 100s timeout queue 100s stats enable stats hide-version stats refresh 30s stats show-node stats auth username:password stats uri /haproxy?stats
當我以每秒大約 12-13 個 http 請求執行負載測試時,在測試的第一個小時左右我沒有看到任何錯誤。但是在測試大約 90 分鐘後,大量請求開始失敗。來自 jmeter 的錯誤消息通常顯示為“連接超時:連接”或“域名稱:4433”未能響應。以下是來自 haproxy.log 的一些日誌消息。我還看到上圖中突出顯示的大量“連接錯誤”和一些“響應錯誤”。
May 7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:55894 [07/May/2018:19:14:00.488] aviator-app~ aviator-app-pool/<NOSRV> 60123/-1/60122 0 sQ 719/718/717/0/0 0/672 May 7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:49905 [07/May/2018:19:12:53.483] aviator-app~ aviator-app-pool/appserver2 60022/1/127171 2283568 -- 719/718/716/11/0 0/666
我在後端伺服器上看不到任何錯誤或堆棧跟踪。在負載均衡器的測試期間,負載均衡器的 CPU 使用率很低(小於 10%),每個後端伺服器的 CPU 使用率約為 30%。感謝您對調試此問題的任何幫助。
您的後端有
maxconn 50
,所以 HAProxy 正在排隊等待現有 50 之一完成的溢出。當每個連接斷開時,允許另一個連接到後端…但是您的後端速度不夠快。請求在代理處備份,最終,代理在它們位於代理隊列中後將它們刪除timeout connect 60s
。日誌條目中的
sQ
解釋了這一點。
s
: 等待伺服器發送或接收數據時伺服器端超時。
Q
:代理在隊列中等待連接槽。這只有在伺服器設置了“maxconn”參數時才會發生。請參閱HAProxy 配置指南中的斷開連接時的會話狀態。