Patroni сам не хранит состояние кластера — кто сейчас лидер, список реплик, таймстемп последнего обновления лежат в etcd, отдельном распределённом key-value хранилище. На каждом цикле HA-проверки Patroni ходит в etcd, читает и продлевает lease лидера; без доступного DCS Patroni не может быть уверен, кто сейчас главный, и не имеет права безопасно переизбирать лидера.

Список участников etcd-кластера:

etcdctl --write-out=table --endpoints=localhost:2379 member list

Таблица покажет ID, статус, имя и адреса (peer и client) каждого узла. Кворум считается как (N-1)/2 + 1 живых участников: кластеру из 3 узлов нужно 2 живых, из 5 — 3. Это стандартная устойчивость Raft-консенсуса, на котором построен etcd.

Если кворум потерян — например, остался 1 узел из 3 — etcd не «разваливается» на части с разными данными, а просто перестаёт принимать запись и выбирать нового лидера, пока кворум не восстановится. Commit в Raft невозможен без голосов большинства, так что кластер скорее замирает, чем противоречит сам себе.

Для Patroni это означает конкретное поведение: если текущий primary теряет связь с etcd (сам etcd недоступен или вне кворума), Patroni демоутит его сам, переводя в standby, не дожидаясь, пока кто-то извне зафиксирует потерю лидерства. Это защита от split-brain — временно остаться без primary безопаснее, чем получить два узла, одновременно считающих себя лидером.

#postgresql #patroni #etcd