Назад | Перейти на главную страницу

Keepalived регистрирует сбой, но не выполняет аварийное переключение

Я использую 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 игнорирует отсутствующую скобку, но переключение при отказе не работает во время выполнения.