Плавающий IP адрес (или виртуальный, далее VIP) используется для обеспечения отказоустойчивости в кластерах.
Кластер конфигурируется таким образом, что плавающий IP присвоен только одному узлу
в каждый момент времени. Если узел с VIP стал недоступен, то VIP присваивается standby узлу.
Тогда standby узел посылает оповещение (gratuitous ARP), чтобы оповестить остальных участников сети
о смене MAC адреса интерфейса с присвоенным VIP.
Простыми словами, standby узел "забирает" IP адрес себе, и все запросы начинают идти ему.
Описание примера
Сегодня мы настроим HAProxy без единой точки отказа.
Предположим, что у нас есть 2 узла с установленным HAProxy на них:
| Hostname | web-node-1 | web-node-2 |
| IP address | 192.168.20.10 | 192.168.20.11 |
| OS | CentOS 7 | CentOS 7 |
| Web server | HAProxy | HAProxy |
Ниже будет предполагаться, что в качестве VIP выбран: 192.168.20.15
Установка keepalived
Установим keepalived на оба узла:
# yum install keepalived
Далее, нам нужно следующий параметр Linux Kernel, чтобы включить поддержку
плавающих IP. На обоих узлах:
# echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
# sysctl -p
Теперь займемся конфигурацией keepalived, поместим в файл /etc/keepalived/keepalived.conf
на web-node-1:
! Configuration File for keepalived
vrrp_script chk_haproxy {
script "killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens160 # interface to monitor
state MASTER # MASTER on web-node-1, BACKUP on web-node-2
virtual_router_id 51
priority 101 # 101 on web-node-1, 100 on web-node-2
virtual_ipaddress {
192.168.20.15/24 # virtual ip address
}
track_script {
chk_haproxy
}
}
На web-node-2, соответственно, следующее:
! Configuration File for keepalived
vrrp_script chk_haproxy {
script "killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens160 # interface to monitor
state BACKUP # MASTER on web-node-1, BACKUP on web-node-2
virtual_router_id 51
priority 100 # 101 on web-node-1, 100 on web-node-2
virtual_ipaddress {
192.168.20.15/24 # virtual ip address
}
track_script {
chk_haproxy
}
}
killall -0 haproxy
проверяет запущен ли процесс HAProxy.
Узел web-node-1 имеет приоритет 101, поэтому он всегда будет "забирать" VIP себе, если жив.
Таким образом, VIP будет назначен web-node-2, только если web-node-1 перестал отвечать.
Запуск keepalived
Настроим автозапуск сервиса keepalived и запустим его. На обоих узлах:
# systemctl enable --now keepalived.service
Проверка
Проверим, что VIP присвоился интерфейсу ens160. Выполним на web-node-1:
# ip addr | grep "inet" | grep "ens160"
inet 192.168.20.10/24 brd 192.168.20.255 scope global ens160
inet 192.168.20.15/24 scope global secondary ens160
Убьем HAProxy на web-node-1 и посмотрим, что будет. На web-node-1:
# systemctl stop haproxy.service
На web-node-2:
# ip addr | grep "inet" | grep "ens160"
inet 192.168.20.11/24 brd 192.168.20.255 scope global ens160
inet 192.168.20.15/24 scope global secondary ens160
Как можем заметить, VIP успешно переназначен узлу web-node-2.
При запуске сервиса haproxy на web-node-1, keepalived автоматически
"перенесет" VIP на него, потому что он имеет выше приоритет.