Я пытаюсь объединить 2 компьютера вместе с Pacemaker/Corosync. Единственный общий ресурс — это ocf:heartbeat:IPaddr, в этом основная проблема:
Поскольку есть только два узла, отработка отказа произойдет только в том случае, если no-quorum-policy=ignore
.
Когда сетевой кабель вытягивается из узла A, corosync на узле A привязывается к 127.0.0.1, и кардиостимулятор считает, что узел A все еще находится в сети, а узел B находится в автономном режиме.
Pacemaker пытается запустить IPaddr на узле A, но ему не удается запуститься из-за отсутствия сетевого подключения. Узел B, с другой стороны, распознает, что узел B находится в автономном режиме, и если служба IPaddr была запущена на узле A, он успешно запустит ее на себе (узле B).
Однако, поскольку сервису не удалось запуститься на узле A, он переходит в неустранимое состояние и должен быть перезагружен для повторного присоединения к кластеру. (вместо этого вы можете перезапустить некоторые из необходимых служб.)
1 обходной путь — это набор start-failure-is-fatal="false"
, который заставляет узел A продолжать попытки запустить службу IPaddr до тех пор, пока это не будет успешным. проблема заключается в том, что после успешного завершения у вас возникает конфликт IP-адресов между двумя узлами до тех пор, пока они не объединятся в кластер и один из них не откажется от ресурса.
Я играю с идеей иметь атрибут узла, который отражает cat /sys/class/net/eth0/carrier
, который равен 1, когда кабель подключен, и ноль, когда он отключен, а затем иметь правило местоположения, которое говорит, что если «подключен» == ноль, не запускайте вид службы вещь, но мы увидим.
Любые мысли или идеи будут очень признательны.