Я пытаюсь настроить активный / пассивный (2 узла) кластер Linux-HA с Corosync и кардиостимулятором для поддержки и работы PostgreSQL-Database. Работает через DRBD и сервис-ip. Если узел 1 дает сбой, узел 2 должен вступить во владение. То же самое, если PG работает на узле 2 и не работает. Все отлично работает, кроме STONITH.
Между узлами находится выделенное HA-соединение (10.10.10.X), поэтому у меня есть следующая конфигурация интерфейса:
eth0 eth1 host
10.10.10.251 172.10.10.1 node1
10.10.10.252 172.10.10.2 node2
Stonith включен, и я тестирую ssh-агент для уничтожения узлов.
crm configure property stonith-enabled=true
crm configure property stonith-action=poweroff
crm configure rsc_defaults resource-stickiness=100
crm configure property no-quorum-policy=ignore
crm configure primitive stonith_postgres stonith:external/ssh \
params hostlist="node1 node2"
crm configure clone fencing_postgres stonith_postgres
crm_mon -1
шоу:
============
Last updated: Mon Mar 19 15:21:11 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
4 Resources configured.
============
Online: [ node2 node1 ]
Full list of resources:
Master/Slave Set: ms_drbd_postgres
Masters: [ node1 ]
Slaves: [ node2 ]
Resource Group: postgres
fs_postgres (ocf::heartbeat:Filesystem): Started node1
virtual_ip_postgres (ocf::heartbeat:IPaddr2): Started node1
postgresql (ocf::heartbeat:pgsql): Started node1
Clone Set: fencing_postgres
Started: [ node2 node1 ]
Проблема в том, что когда я разрываю соединение между eth0-интерфейсами, это убивает оба узла . Я думаю, что это проблема с кворумом, потому что есть только 2 узла. Но я не хочу добавлять третий узел только для расчета правильного кворума.
Есть какие-нибудь идеи для решения этой проблемы?
crm_mon
выглядят выходные данные, когда ваш кластер находится в состоянии сбоя?Ответы:
Это немного более старый вопрос, но проблема, представленная здесь, основана на неправильном представлении о том, как и когда работает аварийное переключение в кластерах, особенно в двухузловых кластерах.
Суть в том, что вы не можете выполнить отказоустойчивое тестирование, отключив связь между двумя узлами. Это приведет именно к тому, что вы видите, к разделенному мозгу с дополнительным, взаимным STONITH. Если вы хотите проверить возможности ограждения,
killall -9 corosync
подойдет простой на активном узле. Другие способыcrm node fence
илиstonith_admin -F
.Из не совсем полного описания вашего кластера (где вывод
crm configure show
иcat /etc/corosync/corosync.conf
?) Кажется, что вы используете адреса 10.10.10.xx для обмена сообщениями, то есть для связи с Corosync / cluster. Адреса 172.10.10.xx - это ваши обычные / служебные сетевые адреса, и вы будете обращаться к данному узлу, например, используя SSH, по его адресу 172.10.10.xx. Похоже, DNS также разрешает имя узла узла, напримерnode1
172.10.10.1.Вы настроили STONITH на использование SSH, что само по себе не очень хорошая идея, но вы, вероятно, просто тестируете. Я не использовал его сам, но я предполагаю, что агент SSH STONITH входит в систему на другом узле и выдает команду выключения, например
ssh root@node2 "shutdown -h now"
или что-то подобное.Теперь, что происходит, когда вы обрезаете кластерную связь между узлами? Узлы больше не видят каждый узел живым и здоровым, потому что между ними больше нет связи. Таким образом, каждый узел предполагает, что он является единственным выжившим после какого-либо неудачного события, и пытается стать (или остаться) активным или основным узлом. Это классический и страшный сценарий с раздвоенным мозгом .
Часть этого состоит в том, чтобы убедиться, что другой, очевидно и предположительно неисправный узел не работает навсегда, и именно здесь STONITH входит. Имейте в виду, что оба узла теперь играют в одну и ту же игру: пытаются стать (или остаться) активными и взять по всем ресурсам кластера, а также стрельба другим узлом в голову.
Вы, вероятно, можете догадаться, что происходит сейчас.
node1
делаетssh root@node2 "shutdown -h now"
иnode2
делаетssh root@node1 "shutdown -h now"
. При этом используется не сеть связи кластера 10.10.10.xx, а сеть обслуживания 172.10.10.xx. Поскольку оба узла на самом деле живы и здоровы, у них нет проблем с выдачей команд или получением SSH-соединений, поэтому оба узла снимают друг друга одновременно. Это убивает оба узла.Если вы не используете STONITH, то расщепление мозга может иметь еще худшие последствия, особенно в случае DRBD, когда вы можете получить оба узла, которые станут Первичными. Повреждение данных может произойти, и разделение мозга должно быть решено вручную.
Я рекомендую прочитать материал на http://www.hastexo.com/resources/hints-and-kinks, который написан и поддерживается парнями, которые внесли (и продолжают вносить) большую часть того, что мы сегодня называем «Linux HA». стек».
TL; DR : если вы обрезаете кластерную связь между вашими узлами, чтобы проверить настройки фехтования, вы делаете это неправильно . Используйте
killall -9 corosync
,crm node fence
илиstonith_admin -F
вместо этого. Сокращение кластерной связи приведет только к расколу сценария, который может и приведет к повреждению данных.источник
Вы можете попробовать добавить
auto_tie_breaker: 1
в раздел кворума /etc/corosync/corosync.confисточник
Попробуйте прочитать главу о кворуме и двухузловых кластерах в документации к Pacemaker.
источник
crm_mon
показывает?crm_mon -1
.Проверьте это для кластера высокой доступности с помощью Pacemaker: http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/index.html
источник