Мы используем HAProxy 1.8.13 на Centos 7 с динамически назначаемыми бэкэндами (бэкэнд-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 перезапускается, он восстанавливает информацию о состоянии и порте вверх / вниз, но сбрасывает 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
Мы играли с "init-addr"но это влияет только на внутренние адреса DNS. Мы что-то делаем не так? Это ожидаемое поведение? Или это какая-то ошибка?
Мы выяснили, что это работает, когда мы заменили 127.0.0.1 на localhost.
Кажется, что HAProxy игнорирует IP-адреса серверной части в файле состояния, по крайней мере, с версиями, которые мы тестировали (1.8.7, 1.8.13, 1.9-dev). Бэкэнд-серверы, для которых настроены имена DNS по умолчанию, получают IP-адреса из применяемого файла состояния.
Мы глубоко погрузились в код и обнаружили ошибку с патчем на HAProxy ML. Вот.