Получить IP-адрес узла, на котором запущен определенный ресурс, при переходе от главных узлов к подчиненным
Настроить
Я настраиваю кластер высокой доступности для веб-приложения с 2 узлами (2 физических сервера):
- узел1 (текущий
master
узел) - узел2 (текущий
slave
узел)
Используя Corosync & Pacemaker, я смог создать кластер и некоторые агенты ресурсов, включая аварийное переключение IP-адресов и веб-сервер (apache).
Ресурсы
Failover
ресурс существует только на одном узле за раз
Использует скрипт Python для вызова API моего хостинг-провайдера с целью обновления места назначения аварийного переключения IP
WebServer
ресурс существует (как клон) на каждом доступном узле
Стандартный ресурс OCF с использованием Apache
server-status
обработчик
Ограничения
- Существует ограничение, которое говорит, что
Failover
а такжеWebServer
должен одновременно выполняться на сервере, чтобы считать его доступным.
Проблема
Теперь я хотел бы создать пользовательский агент ресурсов (как я сделал для аварийного переключения IP), который будет:
- Переключите экземпляр mysql текущего подчиненного узла на главный узел
- Переключите экземпляр mysql текущего главного узла на подчиненный узел нового главного узла
- В основном сделайте то же самое для экземпляра Redis
В идеале ресурс должен быть запущен только на одном узле (ведущем) и остановлен на всех других узлах (ведомых). Следовательно, запуск ресурса поместит текущий узел в master
режим и его остановка slave
Режим.
Я сделал сценарий, который может легко выполнить все эти операции. Вот как это работает.
Включите локальный узел в режиме мастера:
# /usr/local/bin/db_failover_switch.sh master
Перевести локальный узел в подчиненный режим:
# /usr/local/bin/db_failover_switch.sh slave 123.45.67.89
Синопсис довольно прост для понимания. Проблема, с которой я сталкиваюсь, заключается в том, что мне, очевидно, необходимо установить главный IP-адрес, чтобы подчиненный мог соответствующим образом настроить службы MySQL и Redis.
TL; DR
В случае сбоя, я хочу:
- Ресурс начинается с
node2
который становитсяmaster
узел - Ресурс останавливается на
node1
который становитсяslave
узел
Чтобы остановить ресурс (т. Е. Установить его в подчиненный режим), мне нужно знать IP-адрес (имя хоста подойдет) узла, на котором запущен ресурс.
Есть ли способ получить динамический параметр, который Pacemaker передаст моему агенту ресурсов? Или, может быть, я могу получить информацию о кластерах непосредственно из сценария моего агента ресурса, чтобы узнать, на каком узле выполняется определенный ресурс?
1 ответ
После прочтения вашего комментария я не уверен, что вы все еще хотите пойти по маршруту, который вы запланировали изначально, но в любом случае, вот что для этого есть:
С помощью crm_mon --group-by-node -1
вы можете получить "одноразовое" представление о текущем состоянии вашего кластера, сгруппированное по вашим узлам. -1
Параметр делает этот параметр неинтерактивным, что означает, что он просто отображает данные и затем завершает работу.
(Изменить: возможно, используя crm_mon -1
облегчает анализ в вашем конкретном случае.)
Вы можете проанализировать этот вывод и действовать соответственно.
(Личное примечание: я бы также пошел по пути, который вы описали в своем комментарии. В конце концов, это два демона, поэтому два ресурса кажутся разумными. Кроме того, агенты ресурсов для использования уже существуют. Удачи!)