Итак, я запускаю keepalived на двух серверах и не могу переключить его на другой.
Ниже у меня есть мой конфиг для одного из серверов. Единственное различие между ними заключается в том, что главный номер приоритета равен 110, а задний - 109.
Но когда я прекращаю свой процесс с помощью /etc/init.d/process stop, keepalived не перестает работать. Я просто получил VRRP_Script (chk_script) не удалось и ничего больше. Нет переходов или ничего.
vrrp_script chk_script {
script "/usr/local/bin/failover.sh"
interval 2
weight 2
}
vrrp_instance HAInstance {
state BACKUP
interface eth0
virtual_router_id 8
priority 109
advert_int 1
nopreempt
vrrp_unicast_bind 10.10.10.8
vrrp_unicast_peer 10.10.10.9
virtual_ipaddress {
10.10.10.10/16 dev eth0
}
notify /usr/local/bin/keepalivednotify.sh
track_script {
chk_script weight 20
}
}
Это мой chk_script ниже. Та же проблема возникает и при выполнении процесса killall -0 в качестве сценария.
!/bin/bash
SERVICE='process'
STATUS=$(ps ax | grep -v grep | grep $SERVICE)
if [ "$STATUS" != "" ]
then
exit 0
else
exit 1
fi
Кто-нибудь знает решение для этого? Спасибо.
linux
keepalived
ное вторжение
источник
источник
Ответы:
У меня была точно такая же проблема, но моя проблема была не в брандмауэре и не в адаптере Ethernet, а в настройках «веса» сценария проверки.
Это была моя конфигурация:
МАСТЕР:
РЕЗЕРВНОЕ КОПИРОВАНИЕ:
Check_script:
}
Причина, по которой мастер отказывался освободить VIP, заключалась в том, что, несмотря на сбой сценария, мастер по-прежнему имел номер с более высоким приоритетом с сервера BACKUP. Это произошло из-за того, что настройки «weight» в check_script было недостаточно, чтобы покрыть «GAP» между номером приоритета, что означает повышение номера приоритета сервера BACKUP по сравнению с номером сервера MASTER. Я объясню дополнительно:
Согласно руководству keepalived, положительное число в настройке «вес» добавит это число к приоритету, если проверка прошла успешно.
Отрицательное число вычтет это число из номера приоритета, если проверка не удалась.
Итак, согласно моей конфигурации:
Приоритеты сервера Предыдущий сбой сценария:
MASTER: 152
РЕЗЕРВНОЕ КОПИРОВАНИЕ: 100
Failover_IP: MASTER
Отказоустойчивый IP-адрес правильно «захватывается» главным сервером, поскольку главный сервер имеет более высокий приоритет по сравнению с резервным сервером (152> 100)
Приоритеты сервера ПОСЛЕ отказа скрипта:
MASTER сервер: 148
BACKUP сервер: 102
Failover_IP: STILL ON MASTER
Отказоустойчивый IP-адрес все еще находится на главном сервере, потому что мастер снова имеет более высокий приоритет по сравнению с BACKUP (148> 102). Сервер MASTER отказывался освободить IP-адрес, и он правильно сделал, поскольку его приоритет был выше, чем у другого сервера.
Решение в моей ситуации было:
Решение -1: Измените номер приоритета обоих серверов, чтобы у них не было большого «GAP».
Например:
главный приоритет: 150
резервный приоритет: 149
вес контрольного сценария: как есть (2).
В приведенной выше конфигурации при успешном выполнении сценария (то есть все в порядке) приоритеты будут следующими:
Master: 152
Backup: 149
IP_Location: On Master (152> 149)
При сбое сценария:
Мастер: 150
Резервное копирование: 151
IP_Расположение: В резервном хранилище (151> 150)
Решение - 2: Измените весовой номер сценария с 2 на -60
источник
У меня была та же проблема - два сервера CentOS 7.1 с track_script и сбой vrrp_script на MASTER приведет только к сообщению об одиночном журнале «VRRP_Script (chk_script) fail», а не к отказоустойчивости. Однако на сервере BACKUP я получал много сообщений keepalived, пытаясь захватить виртуальный IP-адрес до тех пор, пока на сервере MASTER произошел сбой track_script.
Решение в моем случае: брандмауэр (iptables) на сервере MASTER не был настроен правильно для разрешения пакетов VRRP / многоадресных пакетов, в то время как брандмауэр на другом сервере, BACKUP, был настроен правильно.
Я ввел одинаковые правила iptables на оба сервера следующим образом:
Это работало на одном из серверов (сервер BACKUP VRRP), но не на сервере MASTER, потому что я забыл, что интерфейс не был назван eth0 на сервере MASTER, поэтому эти два правила не имели никакого эффекта.
Это объяснило поведение, которое я наблюдал:
Если keepalived не может видеть какой-либо другой динамик VRRP для определенного virtual_router_id, он по-прежнему считает себя тем, у кого наивысший приоритет (таким образом, законный MASTER), даже после модификации с отрицательным весом, поскольку он никогда не получает сообщения VRRP с приоритетом выше, чем его собственный ( потому что объявления других ораторов блокируются брандмауэром и никогда не могут достичь процесса keepalived, чтобы он узнал о них). Вот почему вы не видите, чтобы выпустить VIP.
Сервер BACKUP, тем не менее, смог увидеть рекламу (теперь потерпевшего неудачу) MASTER, обнаружил, что приоритет в этих пакетах уменьшен до значения, меньшего его собственного, и продолжил объявлять себя MASTER и отправлять безвозмездные ARP для запроса VIP. Таким образом, мы оказались в ситуации, когда оба сервера решили, что им нужно будет обслуживать VIP как МАСТЕРА.
Выводы: - Всегда проверяйте конфигурацию брандмауэра на всех динамиках VRRP, если вы испытываете странное поведение (нет аварийного переключения, несколько мастеров). Журналирование с поддержкой активности не так полезно, как могло бы быть (простое сообщение «VIP не выпущен, потому что я все еще наивысший приоритет» после строки «VRRP_Script (chk_script) fail») значительно облегчило бы устранение неполадок.
источник
Я просто столкнулся с той же ситуацией, что и вы, и немного изучил keepalived. Давайте подумаем, что происходит на каждом сервере. Предполагая, что вы хотите реализовать архитектуру восстановления после отказа вручную,
На 1-м узле BACKUP
Каждый раз, когда track_script терпит неудачу количество падений, он отправляет объявление на второй узел BACKUP. Точкой здесь является Приоритет, установленный внутри рекламы. В твоем случае,
129 (109 + 20)
отправляется на 2-й сервер BACKUP.
На 2-м сервере BACKUP
Далее на втором узле BACKUP.
Согласно RFC ,
Поскольку вы включили nopreempt и получили vrrp с более высоким приоритетом, 2-й узел BACKUP не собирается переходить в состояние.
Решение
Так что если вы хотите, чтобы переход состояния происходил на втором узле, вы можете,
Установите вес в 0 на 1-м узле BACKUP. Это отправит объявление с приоритетом 0 на второй узел BACKUP. док описывает больше о весе 0.
Отключите запрет на втором узле BACKUP.
Установите вес как минимум -2 на 1-м узле BACKUP.
источник