Моя цель — реализовать балансировщик нагрузки HTTP на 2 узла, используя виртуальный IP (VIP). Для этой задачи я выбрал pacemaker
(переключение виртуальных IP) иКэддидля HTTP-балансировщика нагрузки. Выбор балансировщика нагрузки не является предметом этого вопроса. :)
Мое требование простое: я хочу, чтобы виртуальный IP-адрес был назначен хосту, на котором запущен работоспособный экземпляр Caddy.
Вот как я это реализовал с помощью Pacemaker:
# Disable stonith feature
pcs property set stonith-enabled=false
# Ignore quorum policy
pcs property set no-quorum-policy=ignore
# Setup virtual IP
pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=123.123.123.123
# Setup caddy resource, using SystemD provider. By default it runs on one instance at a time, so clone it and cloned one by default runs on all nodes at the same time.
# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/configuring_the_red_hat_high_availability_add-on_with_pacemaker/ch-advancedresource-haar
pcs resource create caddy systemd:caddy clone
# Enable constraint, so both VirtualIP assigned and application running _on the same_ node.
pcs constraint colocation add ClusterIP with caddy-clone INFINITY
Однако если я подключусь по SSH к узлу, которому назначен виртуальный IP-адрес, испорчу файл конфигурации Caddy и сделаю это systemctl restart caddy
, то через некоторое время pacemaker обнаружит, что Caddy не удалось запуститься, и просто переведет его в stopped
состояние .
Как заставить pacemaker постоянно перезапускать мой ресурс SystemD вместо того, чтобы переводить его в stopped
состояние?
Вдобавок ко всему - если я исправлю файл конфигурации и сделаю systemctl restart caddy
, он запустится, но pacemaker просто дальше будет удерживать его в stopped
этом состоянии.
И вдобавок ко всему - если я остановлю другой узел, виртуальный IP нигде не будет назначен по следующим причинам:
# Enable constraint, so both VirtualIP assigned and application running _on the same_ node.
pcs constraint colocation add ClusterIP with caddy-clone INFINITY
Может ли кто-нибудь указать мне верное направление и указать, что я делаю неправильно?
решение1
В Pacemaker определенные сбои считаются фатальными, и после их обнаружения их необходимо устранить вручную (если только вы не настроили ограждение на уровне узлов, которое устранит их за вас, огородив неисправный узел).
Вам нужно сообщить Pacemaker, что start
сбои в работе не являются фатальными. Я обычно также устанавливаю тайм-аут сбоя, который автоматически очищает сбои в работе через некоторое количество секунд в кластерах без ограждения.
pcs property set start-failure-is-fatal=false
pcs property set failure-timeout=300