Как настроить STONITH в 2-узловом активном / пассивном кластере HA Linux?

12

Я пытаюсь настроить активный / пассивный (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 узла. Но я не хочу добавлять третий узел только для расчета правильного кворума.

Есть какие-нибудь идеи для решения этой проблемы?

MMore
источник
Как crm_monвыглядят выходные данные, когда ваш кластер находится в состоянии сбоя?
Жаворонки
1
Сейчас я использую одно устройство Stonith, которое не работает на том же узле, как postgres. Эта работа, как и ожидалось!
MMore

Ответы:

21

Это немного более старый вопрос, но проблема, представленная здесь, основана на неправильном представлении о том, как и когда работает аварийное переключение в кластерах, особенно в двухузловых кластерах.

Суть в том, что вы не можете выполнить отказоустойчивое тестирование, отключив связь между двумя узлами. Это приведет именно к тому, что вы видите, к разделенному мозгу с дополнительным, взаимным 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 также разрешает имя узла узла, например node1172.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вместо этого. Сокращение кластерной связи приведет только к расколу сценария, который может и приведет к повреждению данных.

Дафф
источник
2

Вы можете попробовать добавить auto_tie_breaker: 1в раздел кворума /etc/corosync/corosync.conf

Когда ATB включен, кластер может пострадать до 50% узлов, отказывающих одновременно, детерминистическим способом. Раздел кластера, или набор узлов, которые все еще находятся в контакте с узлом с наименьшим идентификатором узла, останется неизменным. Другие узлы будут нечеткими.

1mi
источник
0

Попробуйте прочитать главу о кворуме и двухузловых кластерах в документации к Pacemaker.

larsks
источник
Думаю, вы имеете в виду «политика без кворума = игнорировать». Я уже установил его (отредактировал также мой первый пост). Не помогает мне здесь Можете ли вы поставить более тонкую точку, пожалуйста?
MMore
Что ж, документация предполагает, что кардиостимулятор будет регистрировать некоторые конкретные сообщения, если есть проблемы с кворумом в кластере. Вы видите это в своих журналах? Что crm_monпоказывает?
larsks
Я не могу найти что-нибудь интересно в логах. Я отредактировал свой первый пост с информацией о crm_mon -1.
MMore