Вопрос или проблема
У меня есть три узла и три виртуальных IP-адреса в одной подсети. Не имеет значения, какой адрес назначен какому узлу. IP-адреса являются публичными адресами. Узлы являются балансировщиками нагрузки, которые распределяют веб-запросы по нескольким бекенд-системам.
Если все три узла работают, три адреса будут сбалансированы на трех узлах так, чтобы каждый узел имел ровно один адрес.
Если в сети только два узла, один узел будет иметь один адрес, а другой – два адреса.
Если в сети только один узел, он будет иметь все три адреса.
Это работает нормально с этой конфигурацией ресурсов:
primitive IP_10 ocf:heartbeat:IPaddr2 params ip="x.x.x.10" cidr_netmask="24" nic="eth1" primitive IP_11 ocf:heartbeat:IPaddr2 params ip="x.x.x.11" cidr_netmask="24" nic="eth1" primitive IP_12 ocf:heartbeat:IPaddr2 params ip="x.x.x.12" cidr_netmask="24" nic="eth1"
Однако у меня есть один шлюз по умолчанию (x.x.x.1), который необходимо настроить на каждом узле после назначения одного из IP-адресов. Очевидно, что невозможно настроить шлюз по умолчанию до назначения адреса.
Первое, что я попробовал, это создать второй ресурс для каждого адреса, ocf:heartbeat:Route:
primitive default_gw_1 ocf:heartbeat:Route params destination="default" device="eth1" gateway="x.x.x.1" primitive default_gw_2 ocf:heartbeat:Route params destination="default" device="eth1" gateway="x.x.x.1" primitive default_gw_3 ocf:heartbeat:Route params destination="default" device="eth1" gateway="x.x.x.1"
А затем объединить эти ресурсы в группы:
group net_10 IP_10 default_gw_1 group net_11 IP_11 default_gw_2 group net_12 IP_12 default_gw_3
Это работает, шлюз по умолчанию настраивается правильно после назначения адреса. В случае переключения на резервный узел все работает так, как и ожидалось. Этот пример демонстрирует возможное распределение ресурсов после того, как Node1 вышел из строя:
Node1: offline Node2: net_10, net_11 Node3: net_12
Проблемы возникают, когда Node1 снова выходит на связь. Один из ресурсов на Node2, скажем, net_10, будет затем перемещен на Node1. Теперь менеджер ресурсов ocf:heartbeat:Route останавливается на Node2, удаляет шлюз по умолчанию и фактически прекращает доступ к Node2, так как у него больше нет шлюза по умолчанию. Таким образом, оставшийся адрес на Node2 (net_11) больше недоступен.
Я тогда попытался изменить менеджер ресурсов ocf:heartbeat:Route, чтобы отключить удаление маршрута. Это, похоже, работает, но выглядит очень неаккуратно.
Я полагаю, что должно быть лучшее решение для этого. Как я могу настроить систему так, чтобы шлюз по умолчанию оставался настроенным на узле до тех пор, пока как минимум один IP-адрес назначен этому узлу?
(Pacemaker 1.1.7 на Debian Wheezy)
Может быть, поздно, но на всякий случай, если кто-то другой может из этого извлечь пользу.
В этом случае вам следует создать только один шлюз, а затем клонировать его на всех ваших узлах. Пример ниже демонстрирует этот сценарий с использованием синтаксиса pcs
.
pcs cluster setup --name MyCluster node1 node2 node3 --start
pcs cluster cib cluster_cfg
pcs -f cluster_cfg property set stonith-enabled="false"
pcs -f cluster_cfg resource create IP_10 ocf:heartbeat:IPaddr2 ip="x.x.x.10" cidr_netmask="24" nic="eth1"
pcs -f cluster_cfg resource create IP_20 ocf:heartbeat:IPaddr2 ip="x.x.x.11" cidr_netmask="24" nic="eth1"
pcs -f cluster_cfg resource create IP_30 ocf:heartbeat:IPaddr2 ip="x.x.x.12" cidr_netmask="24" nic="eth1"
pcs -f cluster_cfg resource create default_gw ocf:heartbeat:Route destination="default" device="eth1" gateway="x.x.x.1"
pcs -f cluster_cfg resource clone default_gw
pcs -f cluster_cfg constraint order IP_10 then default_gw-clone
pcs -f cluster_cfg constraint order IP_20 then default_gw-clone
pcs -f cluster_cfg constraint order IP_30 then default_gw-clone
pcs -f cluster_cfg constraint colocation add IP_10 with IP_20 -1
pcs -f cluster_cfg constraint colocation add IP_10 with IP_30 -1
pcs -f cluster_cfg constraint colocation add IP_20 with IP_30 -1
pcs cluster cib-push cluster_cfg
Ответ или решение
Настройка маршрутизатора по умолчанию для виртуального IP в Pacemaker
Введение
В управлении высокодоступными системами важным компонентом является корректная настройка сети, особенно для виртуальных IP-адресов, которые должны быть доступны независимо от состояния узлов. В данной статье рассмотрим, как правильно настроить маршрутизатор по умолчанию для виртуальных IP в кластере Pacemaker с использованием трех узлов.
Исходные данные
У вас есть:
- Три узла (Node1, Node2, Node3)
- Три виртуальных IP (x.x.x.10, x.x.x.11, x.x.x.12) в одной подсети
- Один маршрутизатор по умолчанию (x.x.x.1), который нужно настроить на каждом узле после назначения одного из виртуальных IP
Проблема
При использовании ресурса ocf:heartbeat:Route
для каждого IP-адреса, возникла проблема: когда узел возвращается в сеть, удаление маршрута по умолчанию на узле, где его не было, приводит к потере доступа к этому узлу. Это связано с тем, что при остановке маршрута удаляется основной маршрут, необходимый для связи с остальными узлами.
Решение
Рекомендуется создать один общий ресурс маршрута и клонировать его на все узлы, чтобы избежать проблем с удалением маршрута. Это позволит сохранить маршрутизатор по умолчанию на узлах, когда хотя бы один виртуальный IP-адрес активен.
Пример настройки
Следующий пример демонстрирует настройку с использованием команды pcs
:
pcs cluster setup --name MyCluster node1 node2 node3 --start
pcs cluster cib cluster_cfg
pcs -f cluster_cfg property set stonith-enabled="false"
pcs -f cluster_cfg resource create IP_10 ocf:heartbeat:IPaddr2 ip="x.x.x.10" cidr_netmask="24" nic="eth1"
pcs -f cluster_cfg resource create IP_20 ocf:heartbeat:IPaddr2 ip="x.x.x.11" cidr_netmask="24" nic="eth1"
pcs -f cluster_cfg resource create IP_30 ocf:heartbeat:IPaddr2 ip="x.x.x.12" cidr_netmask="24" nic="eth1"
pcs -f cluster_cfg resource create default_gw ocf:heartbeat:Route destination="default" device="eth1" gateway="x.x.x.1"
pcs -f cluster_cfg resource clone default_gw
pcs -f cluster_cfg constraint order IP_10 then default_gw-clone
pcs -f cluster_cfg constraint order IP_20 then default_gw-clone
pcs -f cluster_cfg constraint order IP_30 then default_gw-clone
pcs -f cluster_cfg constraint colocation add IP_10 with IP_20 -1
pcs -f cluster_cfg constraint colocation add IP_10 with IP_30 -1
pcs -f cluster_cfg constraint colocation add IP_20 with IP_30 -1
pcs cluster cib-push cluster_cfg
Объяснение настроек
- Создание ресурсов: Все три виртуальных IP адреса создаются как отдельно управляемые ресурсы.
- Общий маршрут по умолчанию: Создается один ресурс для маршрута по умолчанию, который затем клонируется на все узлы. Это предотвращает удаление маршрута для узлов, которые по-прежнему должны оставаться доступными.
- Упорядочивание и совместное размещение: Используются команды
order
иcolocation
, чтобы гарантировать, что маршрутизатор по умолчанию активируется сразу после назначения соответствующих IP-адресов. Это позволяет обеспечить доступ к сети до того, как ресурсы будут полностью активированы.
Заключение
Эта настройка обеспечивает стабильное восстановление и необходимость поддержания подключения к сети на каждом узле при изменении состояния виртуальных IP-адресов. Следуя рекомендациям, вы сможете избежать потери сетевого доступа к узлам, что критично для высокодоступных систем. Правильная настройка ресурсов в Pacemaker — ключ к построению надежной архитектуры для обеспечения непрерывности бизнес-процессов.