Я пытаюсь настроить поддержку активности нескольких экземпляров, чтобы управлять парой серверов tarantool, управляющей репликой, и настраивать виртуальные IP-адреса. Само состояние сервера управляется вне поддержки активности. Keepalived должен управлять только VIP: он должен установить VIP1 на dummy1 iface в случае, если сервер находится в состоянии master, и VIP2 на том же dummy1 iface в случае, если сервер находится в состоянии реплики, и гарантировать, что один и тот же VIP не установлен на двух серверах в случае неправильной конфигурации. Серверы находятся в центрах обработки данных с отложенным доступом, поэтому многоадресная рассылка невозможна. Роли выделенного сервера отсутствуют, оба сервера могут быть ведущими или репликами в исходном состоянии, поэтому я использую BACKUP-BACKUP с равным приоритетом конфигурации. Вот мой конфиг:
global_defs {
enable_script_security # 1)
dynamic_interfaces
}
vrrp_script chk_trntl_db1_pri {
script "/bin/sh -c '/usr/bin/echo lua box.info.status | /usr/bin/tarantool -p 11011 | /usr/bin/grep -q primary'"
interval 1
fall 3
rise 2
}
vrrp_script chk_trntl_db1_rpl {
script "/bin/sh -c '/usr/bin/echo lua box.info.status | /usr/bin/tarantool -p 11011 | /usr/bin/grep -q connected'"
interval 1
fall 3
rise 2
}
vrrp_instance TRNTL_DB1_PRI {
interface eth0
state BACKUP # 3)
nopreempt # 4)
virtual_router_id 03
priority 100
advert_int 1
authentication {
auth_type PASS # TODO: test AH method
auth_pass XXXXXX
}
unicast_src_ip 10.161.133.20
unicast_peer {
10.161.133.19
}
virtual_ipaddress {
10.161.133.21/32 dev dummy1
}
track_script {
chk_trntl_db1_pri
}
}
vrrp_instance TRNTL_DB1_RPL {
interface eth0
state BACKUP # 3)
nopreempt # 4)
virtual_router_id 04
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass XXXXXX
}
unicast_src_ip 10.161.133.20
unicast_peer {
10.161.133.19
}
virtual_ipaddress {
10.161.133.22/32 dev dummy1
}
track_script {
chk_trntl_db1_rpl
}
}
Конфигурация пары отличается только unicast_src_ip
и unicast_peer
- они противоположны. Вы можете заметить, что virtual_router_id
уникален для каждого экземпляра.
Я обнаружил, что keepalived никогда не будет переводить экземпляр BACKUP в состояние MASTER и устанавливать VIP в случае наличия более одного экземпляра. Ни TRNTL_DB1_PRI, ни TRNTL_DB1_PRI, даже соответствующие скрипты не выполняются все время с самого начала, и экземпляр остается в состоянии BACKUP.
Вот тестовый пример: тарантоол SERVER1 находится в состоянии master, TRNTL_DB1_RPL
экземпляр закомментирован (конфигурация одного экземпляра для тестирования),chk_trntl_db1_pri
возвращает 0, TRNTL_DB1_PRI становится BACKUP, получает тайм-аут объявления и повышается до MASTER, устанавливается VIP. В то же время тарантул SERVER2 находится в состоянии реплики, chk_trntl_db1_pri
возвращает 1, TRNTL_DB1_RPL
поэтому находится в состоянии ОТКАЗ - как и ожидалось. Но поскольку tarantool находится в состоянии реплики, chk_trntl_db1_rpl
возвращает 0, экземпляр TRNTL_DB1_RPL становится BACKUP и остается в этом состоянии навсегда, даже если он не получает никаких рекламных объявлений от другого узла для его virtual_router_id. Я даже отключил поддержку активности SERVER1, чтобы предотвратить отправку каких-либо рекламных объявлений - нет, TRNTL_DB1_RPL
останется в состоянии РЕЗЕРВНОЕ КОПИРОВАНИЕ. Вот журналы:
Starting LVS and VRRP High Availability Monitor...
Starting Keepalived v2.0.7 (08/23,2018)
Running on Linux 3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 (built for Linux 3.10.0)
Command line: '/usr/sbin/keepalived' '-D'
Opening file '/etc/keepalived/keepalived.conf'.
Starting VRRP child process, pid=14851
Registering Kernel netlink reflector
Registering Kernel netlink command channel
LVS and VRRP High Availability Monitor.
Opening file '/etc/keepalived/keepalived.conf'.
Assigned address 10.255.160.193 for interface eth0
Assigned address fe80::21a:4aff:fe16:12a for interface eth0
Registering gratuitous ARP shared channel
(TRNTL_DB1_PRI) removing VIPs.
(TRENT_DB1_RPL) removing VIPs.
VRRP sockpool: [ifindex(2), proto(112), unicast(1), fd(8,9)]
Script `chk_trntl_db1_pri` now returning 1
VRRP_Script(chk_trntl_db1_pri) failed (exited with status 1)
(TRNTL_DB1_PRI) Entering FAULT STATE
VRRP_Script(chk_trntl_db1_rpl) succeeded
(TRNTL_DB1_RPL) Entering BACKUP STATE
Если я добавлю TRENT_DB1_RPL
в конфигурацию SERVER1 он не будет продвигать TRNTL_DB1_PRI
в состояние MASTER и оставаться в состоянии BACKUP просто TRNTL_DB1_RPL
делает на СЕРВЕРЕ2.
Я обнаружил, что если я удалю все параметры, связанные с одноадресной передачей, из одного из разделов, он будет переведен в состояние MASTER, но только в том случае, если один экземпляр является одноадресным, а другой - многоадресным. Но если и многоадресная, и одноадресная рассылка, BACKUP никогда не будет повышена до MASTER, независимо от того, что сценарий проверки завершился успешно и на другой стороне нет мастера.
Похоже, что даже VIP-адреса установлены на одном интерфейсе и проверяют сценарии, проверяющие один и тот же демон, это два разных независимых экземпляра, если virtual_router_id
разные, и они должны работать вместе.
Итак, я что-то неправильно понимаю или это ошибка в keepalived?
ОБНОВЛЕНИЕ: исправлено в 2.0.16. После сборки текущей версии из исходников VRRP работает точно так, как ожидалось.