Load-Balancing

當場中的一台伺服器關閉時,haproxy 不會進行負載平衡

  • October 2, 2016

我有三台後端伺服器使用 HAProxy 進行負載平衡。

當所有 3 個都啟動時,我在 HTTPS 響應中連續看到每個伺服器 ID (1,2,3)。即 1,2,3,1,2,3。正如預期的那樣。

但是,如果我關閉一台後端伺服器,那麼我只會重複看到一個伺服器 ID。

即,如果我關閉伺服器 1,那麼當我應該看到伺服器 id 的 2,3 (2,3,2,3,2,3…) 時,我只會看到伺服器 id 2 (2,2,2,2…) ..)

我已經嘗試過最小連接和循環平衡,並且都表現出相同的行為

為什麼 HAProxy 會這樣?如何更改我的 HAProxy 配置以在剩餘的活動後端伺服器之間進行負載平衡?

HA 代理版本是 1.6.9。HA 代理伺服器是 ubuntu 14.04。

提供的 HTTP 是一個 API,它通過 HTTPS 返回一些 JSON。它是一個寧靜的 API,因此不需要或不需要會話持久性。

haproxy 的配置如下。

global
   log /dev/log    local0
   log /dev/log    local1 notice
   chroot /var/lib/haproxy
   stats socket /run/haproxy/admin.sock mode 660 level admin
   stats timeout 30s
   user haproxy
   group haproxy
   daemon
   maxconn 3072
   # Default SSL material locations
   ca-base /etc/ssl/certs
   crt-base /etc/ssl/private
   # Default ciphers to use on SSL-enabled listening sockets.
   # For more information, see ciphers(1SSL). This list is from:
   #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
   ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH$
   ssl-default-bind-options no-sslv3
defaults
   log     global
   mode    http
   option  httplog
   option  dontlognull
   option dontlog-normal
   option redispatch
   retries 3
   maxconn 3072
   timeout connect 5000
   timeout client  10000
   timeout server  10000

frontend apis-frontend
   bind x.x.x.x:443 ssl verify none crt /etc/haproxy/xxx
   mode http
   option forwardfor
   default_backend apis

backend apis
   balance leastconn
   mode http
   option httpchk GET /
   server 1 x.x.x.x:443 ssl verify none check
   server 2 x.x.x.x:443 ssl verify none check
   server 3 x.x.x.x:443 ssl verify none check

listen stats
   bind *:8181
   mode http
   stats enable
   stats uri /
   stats realm Haproxy\ Statistics
   stats auth xx

編輯:添加統計數據。

pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,comp_in,comp_out,comp_byp,comp_rsp,lastsess,last_chk,last_agt,qtime,ctime,rtime,ttime,
apis-frontend,FRONTEND,,,0,2,3072,24,9118,10021,0,0,19,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,4,,,,0,24,0,19,0,0,,0,6,43,,,0,0,0,0,,,,,,,,
apis,mt-wol-vlx-vps-01,0,0,0,1,,12,4863,3240,,0,,0,0,0,0,UP,1,1,0,1,0,12097,0,,1,3,1,,12,,2,0,,2,L7OK,200,36,0,12,0,0,0,0,0,,,,0,0,,,,,39,OK,,0,1,1,29,
apis,mt-lon-vlx-vps-01,0,0,0,1,,12,4255,3228,,0,,0,0,0,0,UP,1,1,0,0,0,12097,0,,1,3,2,,12,,2,0,,2,L7OK,200,23,0,12,0,0,0,0,0,,,,0,0,,,,,39,OK,,0,1,1,5,
apis,mt-cov-uks-vps-01,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,1,1,12094,12094,,1,3,3,,0,,2,0,,0,L4TOUT,,2001,0,0,0,0,0,0,0,,,,0,0,,,,,-1,,,0,0,0,0,
apis,BACKEND,0,0,0,1,308,24,9118,6468,0,0,,0,0,0,0,UP,2,2,0,,0,12097,0,,1,3,0,,24,,1,0,,3,,,,0,24,0,0,0,0,,,,,0,0,0,0,0,0,39,,,0,1,1,33,
stats,FRONTEND,,,1,4,3072,10,3811,169181,0,0,5,,,,,OPEN,,,,,,,,,1,4,0,,,,0,1,0,4,,,,0,9,0,5,0,0,,1,3,15,,,0,0,0,0,,,,,,,,
stats,BACKEND,0,0,0,0,308,0,3811,169181,0,0,,0,0,0,0,UP,0,0,0,,0,12097,0,,1,4,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,0,0,0,0,0,,,0,0,0,18,

編輯:不同瀏覽器中的負載平衡行為

在請求從不同的 ip 進行測試之後。我注意到第二個 ip 負載均衡如預期。然後我嘗試從第一個 IP 但使用不同的瀏覽器 edge 和 firefox。edge 和 firefox 的負載平衡符合預期。

然而,原來的瀏覽器 chrome 仍然堅持使用一個後端伺服器。即使在關閉所有 chrome 視窗並重新啟動 chrome 之後

經過進一步測試後,指示的行為僅在使用 Google 的 Chrome 瀏覽器時出現。為什麼 chrome 顯示此行為尚未確定。

觀察到的行為不是 HAProxy 問題。

這在其他瀏覽器和其他客戶端上進行了多次測試。最終證明是幾個小時的現場服務。

上面的 HAProxy 配置現在已經執行了幾個小時,並且在三台伺服器之間公平地分配了流量。這可以從我們記錄伺服器 ID 的數據庫記錄中得到證明。在幾個小時的時間裡,每台伺服器被分配了相同數量的請求,從大約 4,500 個請求到 +- 50 個。

更重要的是,考慮到最初的問題,如果其中一台伺服器發生故障,它還會繼續公平分配,其他兩台伺服器。我們的數據庫記錄再次證明了記錄伺服器 ID。當測量超過 15 分鐘時,可以在我們的數據庫記錄中看到同樣平衡的伺服器 ID 的清晰模式。

在假設問題出在解決方案中您還不太了解的部分之前,請務必設計測試以查明問題所在。

感謝您為實現這一認識而做出的許多回复。

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