當場中的一台伺服器關閉時,haproxy 不會進行負載平衡
我有三台後端伺服器使用 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 的清晰模式。
在假設問題出在解決方案中您還不太了解的部分之前,請務必設計測試以查明問題所在。
感謝您為實現這一認識而做出的許多回复。