HAProxy:可以使用已儲存的狀態恢復後端IP嗎?

HAProxy:可以使用已儲存的狀態恢復後端IP嗎?

我們在 Centos 7 上使用 HAProxy 1.8.13,並具有動態分配的後端(透過統計套接字分配的後端 IP 和連接埠)。這很好用。

我們需要一種方法來使動態分配的內容在重新啟動時保持不變,並希望使用“從檔案載入伺服器狀態「指令。遺憾的是,我們遇到了一個錯誤(或者可能是設計使然?),狀態檔不會恢復配置的 IP 位址:

我們的測試配置:

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    nbproc      2
    stats socket /run/haproxy/1.sock mode 0744 level admin process 1
    stats socket /run/haproxy/2.sock mode 0744 level admin process 2
    server-state-file /run/haproxy/server_state

defaults
    load-server-state-from-file global
    timeout server 10s
    timeout client 15s
    timeout queue 6s
    timeout connect 10s

frontend  main
    bind *:5000
    default_backend             app

backend app
    balance     roundrobin
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

我們透過腳本配置 IP,然後使用以下命令儲存狀態:

echo "show servers state" | socat /run/haproxy/1.sock - > /run/haproxy/server_state

例如產生:

1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port
7 app 1 app1 127.0.0.1 0 1 1 1 60 8 2 0 14 0 0 0 - 5001
7 app 2 app2 10.10.10.115 2 0 1 1 23 6 3 4 6 0 0 0 - 31501
7 app 3 app3 10.10.10.113 2 0 1 1 22 6 3 4 6 0 0 0 - 31375
7 app 4 app4 10.10.10.114 2 0 1 1 22 6 3 4 6 0 0 0 - 31400

當 haproxy 重新啟動時,它會恢復 up/down 狀態資訊和端口,但將 IP 重設為 127.0.0.1:

1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port
7 app 1 app1 127.0.0.1 0 1 1 1 7 8 2 0 14 0 0 0 - 5001
7 app 2 app2 127.0.0.1 0 0 1 1 2 8 2 0 6 0 0 0 - 31501
7 app 3 app3 127.0.0.1 0 0 1 1 2 8 2 0 6 0 0 0 - 31375
7 app 4 app4 127.0.0.1 0 0 1 1 1 8 2 0 6 0 0 0 - 31400

我們玩弄「初始化地址「但這只會影響基於 DNS 的後端位址。我們做錯了什麼嗎?這是預期的行為嗎?還是這是某種錯誤?

答案1

當我們將“127.0.0.1”替換為“localhost”時,我們發現它有效。

HAProxy 似乎忽略了狀態檔案中的後端 IP,至少在我們測試的版本(1.8.7、1.8.13、1.9-dev)中是如此。具有預設配置的 DNS 名稱的後端伺服器確實從應用程式的狀態檔案中取得 IP。

我們深入研究了程式碼,並透過 HAProxy ML 上的補丁打開了一個錯誤這裡

相關內容