Load-Balancing

如何解決 haproxy 負載均衡器上的後端連接錯誤?

  • February 11, 2019

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 配置指南中的斷開連接時的會話狀態。

引用自:https://serverfault.com/questions/911155