Как запустить кластер CentOS (Red Hat) в деградированном режиме?
Я установил кластерное программное обеспечение Red Hat на установку CentOS 6.5 и использую его для обеспечения избыточной маршрутизации из одной сети в другую. Это работает нормально, и у меня есть пара ящиков, предоставляющих сервис, так что если один из них выходит из строя (например, если я тестирую, удаляя его сетевые соединения), другой берет на себя маршрутизацию.
Однако, если мне нужно что-то сделать с оставшимся окном, я не могу перезапустить его из-за проблем с rgmanager:
service rgmanager stop
зависает, и единственный способ остановить процесс kill -9
Это. Это, очевидно, также влияет на любое действие, которое пытается остановить службу, как reboot
или же poweroff
,
Когда мне удается запустить сервер самостоятельно, хотя кластер запускается, rgmanager не отображается как запущенный в clustat
и ни одна из избыточных служб маршрутизации даже не видна, не говоря уже о запуске.
Это может вызвать проблемы, если, например, блоки развернуты в удаленном месте, и их необходимо отключить, прежде чем мы сможем заменить неисправный блок.
Вот мой cluster.conf:
<?xml version="1.0"?>
<cluster config_version="2" name="router-ha">
<fence_daemon/>
<clusternodes>
<clusternode name="router-01" nodeid="1"/>
<clusternode name="router-02" nodeid="2"/>
</clusternodes>
<cman expected_votes="1" two_node="1"/>
<fencedevices/>
<rm>
<failoverdomains/>
<resources>
<ip address="10.0.0.1" monitor_link="1" sleeptime="0"/>
<ip address="10.0.0.2" monitor_link="1" sleeptime="0"/>
<ip address="10.2.0.1" monitor_link="1" sleeptime="0"/>
<ip address="10.4.0.1" monitor_link="1" sleeptime="0"/>
</resources>
<service autostart="1" name="routing-a" recovery="restart">
<ip ref="10.0.0.1"/>
<ip ref="10.2.0.1"/>
</service>
<service autostart="1" name="routing-b" recovery="restart">
<ip ref="10.0.0.2"/>
<ip ref="10.4.0.1"/>
</service>
</rm>
</cluster>
Почему я не могу запустить службу на одной коробке, если она не видит другую? Конечно, это обязательная часть избыточной пары, чтобы вы не зависели от другой машины, чтобы иметь возможность запустить службу кластера?
1 ответ
Для запуска кластерных служб необходим кворум. Обычно, например, в трехузловом кластере каждый член имеет по одному голосу: если вы подключите плагин к одному, он будет знать, что он нечеткий, поскольку у него меньше половины доступных голосов (значение фактически настраивается). Кластер без кворума не подходит для запуска кластерных служб.
Этот принцип не только для кластеров Red Hat, но и общий принцип. Решения и реализации могут отличаться. Также реализации двухузловых кластеров, поскольку, если вы даете обоим узлам по одному голосу каждый, ни один из них, как правило, не будет квотным.
Конечно, это обязательная часть избыточной пары, чтобы вы не зависели от другой машины, чтобы иметь возможность запустить службу кластера?
В случае Red Hat в кластере с двумя узлами применяются специальные условия:
<cman expected_votes="1" two_node="1"/>
Когда вы отключите вилку, произойдет следующее: оба узла потеряют связь друг с другом.
Чтобы определить, у кого из них есть кворум, они оба будут пытаться ОСТАНОВИТЬ друг друга.
STONITH является аббревиатурой от Shoot-The-Other-Node-In-The-Head и защищает ваши данные от повреждения посторонними узлами или одновременного доступа. Тот факт, что узел не отвечает, не означает, что он не обращается к вашим данным. Единственный способ быть на 100% уверенным в том, что ваши данные в безопасности, - это оградить узел с помощью STONITH, чтобы мы могли быть уверены, что узел действительно отключен, прежде чем разрешить доступ к данным с другого узла.
Таким образом, ваше предположение верно, ваш кластер неправильно настроен и требует, чтобы агент защиты работал, потому что, потянув за вилку, вы не только делаете свой сервис недоступным, что обычно приводит к rgmanager
чтобы переключиться на другой узел (или как вы его настроили), вы также удаляете сердцебиение между кластерными узлами. Даже если rgmanager
может попытаться сделать то, что вы настроили, cman
до сих пор не могу понять, какой из этих узлов имеет кворум. Вместо этого он будет последовательно пытаться заблокировать другой узел, но так как у вас не настроен агент fence, он будет зависать на неопределенный срок.
Итак, вот два полезных совета для вас:
- отделите трафик кластера от сетевого трафика, добавив дополнительный интерфейс к узлам кластера в изолированной сети, чтобы при подключении к интерфейсу, обращенному к приложению, кластер выполнял чистое переключение при сбое
- Настроить ограждение.