HAProxy: Ist es möglich, gespeicherten Status zur Wiederherstellung von Backend-IPs zu verwenden?

HAProxy: Ist es möglich, gespeicherten Status zur Wiederherstellung von Backend-IPs zu verwenden?

Wir verwenden HAProxy 1.8.13 auf Centos 7 mit dynamisch zugewiesenen Backends (Backend-IPs und Ports werden über den Stats-Socket zugewiesen). Das funktioniert einwandfrei.

Wir brauchen eine Methode, um die dynamisch zugewiesenen Daten auch nach Neustarts beizubehalten und wollten dazu die Funktion "Serverstatus aus Datei laden"-Direktive. Leider tritt bei uns ein Fehler auf (oder ist das vielleicht Absicht?), der darin besteht, dass die Statusdatei die konfigurierte IP-Adresse nicht wiederherstellt:

Unsere Testkonfiguration:

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

Wir konfigurieren die IPs per Skript und speichern dann den Status mit:

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

Das ergibt zum Beispiel:

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

Beim Neustart von Haproxy werden die Informationen zum Up-/Down-Status und der Port wiederhergestellt, die IP wird jedoch auf 127.0.0.1 zurückgesetzt:

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

Wir spielten mit „Init-Adresse", aber das betrifft nur DNS-basierte Backend-Adressen. Machen wir etwas falsch? Ist das das erwartete Verhalten? Oder ist das eine Art Fehler?

Antwort1

Wir haben herausgefunden, dass es funktioniert, wenn wir „127.0.0.1“ durch „localhost“ ersetzen.

HAProxy scheint Backend-IPs in der Statusdatei zu ignorieren, zumindest bei den von uns getesteten Versionen (1.8.7, 1.8.13, 1.9-dev). Backend-Server, die standardmäßig DNS-Namen konfiguriert haben, erhalten die IPs aus der Statusdatei.

Wir haben uns eingehend mit dem Code befasst und einen Fehler mit einem Patch für HAProxy ML gemeldet.Hier.

verwandte Informationen