ОБНОВЛЕНИЕ: кажется, нужен собственный сценарий отслеживания для фактического переключения и перезапуска, когда HAProxy умирает. Отправлено как ответ.
Я установил keepalived (плюс VIP) + haproxy + galera_node (на том же хосте, конфигурация ниже) с использованием того же скрипта отслеживания, который можно найти в десятках примеров в Интернете. Я не получаю, когда убиваю haproxy
процесс, запущенный на данном узле, это то, что отображается в /var/log/syslog
:
Keepalived_vrrp[29230]: VRRP_Instance(250) Entering MASTER STATE
Keepalived_vrrp[29230]: VRRP_Script(check_haproxy) failed
Имеет смысл. Это действительно не удалось. Но странная вещь keepalived
не отказывается от VIP и не входит в состояние BACKUP, что является желаемым поведением (ниже VIP все еще существует через несколько минут после выхода haproxy). Я не понимаю, как keepalived
предназначен для работы, или в моей конфигурации есть другая явная ошибка? (Версия KA - 1.2.7 в Ubuntu 14.04)
# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 0e:02:c6:83:82:74 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.202/24 brd 10.20.18.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.10.10.250/32 scope global eth0
valid_lft forever preferred_lft forever
keepalived.conf
global_defs
{
router_id mynode
}
vrrp_script check_haproxy
{
script "killall -0 haproxy"
interval 1
fall 2
weight 2
}
vrrp_instance 200
{
virtual_router_id 200
advert_int 1
nopreempt
priority 90
state BACKUP
interface eth0
notify /etc/keepalived/log_status.sh
virtual_ipaddress
{
10.10.10.250 dev eth0
}
track_script
{
check_haproxy
}
}
Теперь я использую собственный track_script, который это исправляет. Он перезапускает keepalived, если haproxy не запущен. Похоже, что keepalived входит в режим РЕЗЕРВНОГО КОПИРОВАНИЯ только при запуске / перезапуске сценария отслеживания по умолчанию, а не во время его работы ¯ \ _ (ツ) _ / ¯
#!/bin/sh
# restart keepalive if haproxy died
pid=`/bin/pidof haproxy`
test -z "$pid" && { service keepalived restart &>/dev/null; exit 1; }
exit 0