← К программе курса

Модуль 23 / 24

Потеря quorum и runbooks

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы распознаете потерю manager quorum, отделите control plane от data plane и выберете между возвратом исходных managers и disaster recovery.

  • считать majority
  • проверять Raft write
  • не путать stale reads с quorum
  • следовать runbook без импровизации
02

2. Теория: поведение без quorum

Три managers требуют два голоса. При потере двух оставшийся manager не может подтвердить Raft write, выбрать новый leader или выполнять reconciliation. Некоторые read-only команды возвращают локально известное состояние и не доказывают наличие quorum.

Уже запущенные containers продолжают работать автономно. Это временная работа data plane: task failure не будет надёжно компенсирован без control plane.

03

3. Возврат узлов или disaster recovery

Первый выбор — вернуть хотя бы один исходный manager с его Raft identity и state. Это восстанавливает majority и сохраняет историю без изменения cluster ID.

Force-new-cluster применяют только когда majority исходных managers потеряно безвозвратно и есть выбранный surviving state либо backup. Он создаёт новую конфигурацию Raft из одного manager; старые managers нельзя возвращать как прежних членов.

04

4. Runbook и fencing

Объявите incident, заморозьте изменения, подтвердите число живых voters, восстановите сеть, питание, disk или Engine исходных managers. Перед DR докажите необратимость потери majority, выберите самый свежий state и изолируйте старые managers.

Fencing предотвращает появление двух control planes. После DR заново присоединяют nodes, ротируют tokens, проверяют services, configs, secrets, networks и application data.

05

5. Методические указания

  • Снимите baseline
  • Останавливайте followers, сохраняя SSH
  • Проверяйте именно write
  • Не меняйте service без quorum
  • Измеряйте data-plane requests
  • Возвращайте один manager, затем второй
06

6. Лабораторная работа: baseline

Подтвердите три voters, leader и service 3/3.

terminal
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker service ps swarm-ingress-demo
07

7. Лабораторная работа: потеря quorum

Остановите два followers. Read может вернуть stale state, но создание config должно завершиться ошибкой или timeout, а объект не должен появиться.

terminal
ssh swarm-manager-1 sudo systemctl stop docker
ssh swarm-manager-2 sudo systemctl stop docker
sleep 15
ssh swarm-manager-3 timeout 8 docker node ls
ssh swarm-manager-3 timeout 8 docker service ls
printf 'quorum-write-probe\n' | ssh swarm-manager-3 timeout 8 docker config create swarm-m23-should-not-exist -
ssh swarm-manager-3 docker config inspect swarm-m23-should-not-exist
08

8. Лабораторная работа: data plane

Два endpoints недоступны, один отвечает. Traefik исключает отказавшие backends; десять публичных запросов должны пройти при условии, что surviving task здоров.

terminal
for ip in 10.77.0.11 10.77.0.12 10.77.0.13; do curl --connect-timeout 2 --max-time 4 "http://$ip:18080/" || true; done
failures=0
for n in $(seq 1 10); do curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/ || failures=$((failures+1)); done
printf 'http_failures=%s\n' "$failures"
09

9. Восстановление и диагностика

Запуск одного исходного manager возвращает majority. После проверки верните третий и убедитесь, что probe config отсутствует.

terminal
ssh swarm-manager-2 sudo systemctl start docker
sleep 20
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
ssh swarm-manager-1 sudo systemctl start docker
sleep 15
ssh swarm-manager-3 docker node ls
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 'docker config rm swarm-m23-should-not-exist 2>/dev/null || true'
curl --fail --show-error --output /dev/null https://swarm-demo.goretskiy.pro/
  • reads работают, writes нет — нет quorum
  • нет leader после возврата — проверяйте 2377/TCP, time и state
  • HTTP работает без quorum — не объявляйте cluster healthy
  • HTTP упал — surviving task или ingress path недоступен
10

10. Контроль, критерии освоения и cleanup

  • Сколько голосов нужно из трёх?
  • Почему read не доказывает quorum?
  • Что происходит с running tasks?
  • Когда выбирать force-new-cluster?
  • Зачем fencing?
  • Что проверить после DR?

Модуль освоен, если Raft write отказал без quorum, 10 запросов прошли через surviving data plane, а возврат исходного voter восстановил writes и все три managers. Recover-команды являются cleanup.