HAProxy: 저장된 상태를 사용하여 백엔드 IP를 복원할 수 있습니까?

HAProxy: 저장된 상태를 사용하여 백엔드 IP를 복원할 수 있습니까?

우리는 동적으로 할당된 백엔드(통계 소켓을 통해 할당된 백엔드 IP 및 포트)와 함께 Centos 7에서 HAProxy 1.8.13을 사용하고 있습니다. 이것은 잘 작동합니다.

동적으로 할당된 항목을 재시작 후에도 유지하는 방법이 필요하며 "파일에서 서버 상태 로드" 지시어입니다. 안타깝게도 상태 파일이 구성된 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가 다시 시작되면 가동/중단 상태 정보와 포트가 복원되지만 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는 적어도 우리가 테스트한 버전(1.8.7, 1.8.13, 1.9-dev)에서는 상태 파일의 백엔드 IP를 무시하는 것 같습니다. DNS 이름이 기본값으로 구성된 백엔드 서버는 적용된 상태 파일에서 IP를 가져옵니다.

우리는 코드를 자세히 살펴보고 HAProxy ML에 대한 패치로 버그를 열었습니다.여기.

관련 정보