linux-labs

Вики / Службы и systemd

keepalived (VRRP, плавающий IP)

Сервис Ubuntu 24.04 · keepalived СлужбыСеть

Высокая доступность через виртуальный IP — failover между узлами по VRRP.

keepalived обеспечивает отказоустойчивость: два+ узла делят виртуальный IP (VIP) по протоколу VRRP. В норме VIP «висит» на MASTER; если он падает — VIP автоматически переезжает на BACKUP. Часто в паре с haproxy/nginx.

systemctl status keepalived
ip a | grep <VIP>                 # на каком узле сейчас VIP (см. ip)
journalctl -u keepalived -f       # переходы MASTER/BACKUP в реальном времени

/etc/keepalived/keepalived.conf (на MASTER):

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51        # ОДИНАКОВЫЙ на всех узлах группы, уникальный в L2
    priority 100                # выше = предпочтительный MASTER
    advert_int 1
    authentication { auth_type PASS; auth_pass secret }
    virtual_ipaddress { 10.0.0.10/24 }
}

На BACKUP — то же, но state BACKUP и priority 90.

Директива Смысл
priority вес в выборах MASTER (выше побеждает)
nopreempt не отбирать VIP обратно при возврате (избежать лишних переездов)
unicast_peer VRRP по unicast (облака/сети без мультикаста)
vrrp_script + track_script проверка сервиса → снижение priority при падении

Чтобы VIP уезжал при падении приложения (а не только всего узла):

vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"   # 0 = жив
    interval 2
    weight -20                              # упал → priority -20 → BACKUP выигрывает
}
vrrp_instance VI_1 {
    ...
    track_script { chk_haproxy }
}

VIP на обоих узлах одновременно (split-brain)

Узлы не видят VRRP-объявления друг друга. Причина — firewall блокирует VRRP (протокол 112, мультикаст 224.0.0.18) или разные virtual_router_id. Разреши VRRP между узлами; в облаке без мультикаста — unicast_peer.

VIP не переезжает при падении приложения

Нет track_script — VIP держится, пока жив узел, даже если сервис умер. Добавь vrrp_script/track_script с weight.

VIP «скачет» туда-сюда (flapping)

Слишком чувствительный vrrp_script или восстановившийся MASTER отбирает VIP. Ставь nopreempt на BACKUP-узлах или увеличь interval/fall/rise.

Конфликт virtual_router_id

В одном L2-сегменте virtual_router_id уникален на группу; совпадение с чужой группой ломает выборы.

Где сейчас VIP / что происходит

ip a на каждом узле (VIP виден только на MASTER), journalctl -u keepalived — переходы состояний (см. ip).

ip a | grep VIP                   # кто сейчас MASTER
journalctl -u keepalived -f       # переходы состояний
# conf: state MASTER/BACKUP · virtual_router_id (одинаков) · priority · virtual_ipaddress
# проверка сервиса: vrrp_script + track_script (weight -N)
# split-brain → firewall на VRRP (proto 112, 224.0.0.18) или unicast_peer

См. также