Я использую 2 сервера поддержки активности с общим IP-адресом (Server1 и Server2). Server1 является главным, и всякий раз, когда haproxy умирает, Server2 должен его взять на себя. Если Server1 восстановится, Server2 должен освободить vIP и позволить Server1 снова взять на себя управление.
Мне удалось запустить это, используя 2 конфигурации ниже, однако недавно я заметил, что он перестал работать.
Серверы работают под управлением CentOS 7 и полностью обновлены. Если я вручную убью keepalived на Server1, он перейдет на Server2, а когда keepalived снова вернется, Server1 снова вступит во владение. Однако, если я убью haproxy, keepalived зарегистрирует, что проверка check_haproxy не удалась, но не переключится.
Чтобы убедиться, что это не FW или SELinux, я удалил все правила IPtables и отключил SELinux.
Конфиги:
Сервер1
global_defs {
# Keepalived process identifier
# Probably should be unique: http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
lvs_id haproxy_DH
}
# Script used to check if HAProxy is running
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
state EQUAL
interface eno16777984
virtual_router_id 51
notify /etc/keepalived/notify.sh
priority 100
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
10.9.17.20
10.9.17.19
}
track_script {
check_haproxy
}
}
Сервер2
global_defs {
# Keepalived process identifier
# Probably should be unique: http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
lvs_id haps2a
# Script used to check if HAProxy is running
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
state EQUAL
interface eno16777984
virtual_router_id 51
notify /etc/keepalived/notify.sh
priority 100
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
10.9.17.20
10.9.17.19
}
track_script {
check_haproxy
}
}
Помните, что помимо правильного синтаксиса в ваших файлах конфигурации, killall
по умолчанию теперь не устанавливается на CentOS 7. Вам нужно будет установить psmisc
пакет для этого или вы можете использовать script "pidof haproxy"
вместо.
Мне не удалось найти никакой документации, объясняющей значение state EQUAL
. Я обычно определяю начальное состояние как BACKUP
и позвольте процессу выбора выбрать главный экземпляр.
Я скопировал ваши файлы конфигурации в лабораторную среду и обнаружил, что закрывающая скобка для global_defs
отсутствует в файле keepalived.conf Сервера2. Тем не мение, отказоустойчивость работала хорошо, несмотря на отсутствие персонажа.
Пожалуйста, проверьте с помощью tcpdump -i eno16777984 vrrp
не связанные пакеты VRRP с VRID=51
присутствуют. Или попробуйте изменить virtual_router_id
на другой номер. Поскольку пакеты VRRP отправляются на многоадресный адрес 224.0.0.18
, каждый виртуальный IP-адрес в сети должен использовать уникальный VRID
.
Кроме того, если вы намерены позволить Server1 взять на себя виртуальный IP-адрес, я предлагаю вам установить priority 101
в его vrrp_instance
. RFC5798 раздел 6.4.3. Мастер говорит, что если IP-адрес Server1 больше IP-адреса Server2, и оба сервера имеют одинаковый приоритет, Server1 побеждает на выборах и получает виртуальный IP-адрес. Тем не мение, keepalived
вроде только приоритеты сравнивает.
РЕДАКТИРОВАТЬ: На самом деле я забыл убрать закрывающую скобку во втором тесте. Фактически, процесс запуска keepalived игнорирует отсутствующую скобку, но переключение при отказе не работает во время выполнения.