Опыт построения High Availability для low-code платформы Totum на двух основных нодах с witness-сервером для кворума etcd. Решение обеспечивает автоматический фейловер PostgreSQL через Patroni и переключение приложения без изменения DNS.
Классическая схема High Availability подразумевает три полноценных сервера, балансировщик, кластер PostgreSQL и распределённое хранилище. Однако для переноса рабочей системы Totum в новую инфраструктуру требовалось избавиться от единственной точки отказа, не покупая третью мощную машину только ради кворума.
Архитектура «HA для бедных» заключается в использовании двух основных нод (Node A и Node B) с PostgreSQL в асинхронной репликации под управлением Patroni, и лёгкого witness-сервера для etcd. Witness не хранит копию базы и не запускает приложение — его задача быть третьим голосом для кворума. При падении одной основной ноды оставшаяся вместе с witness даёт большинство 2 из 3, что позволяет кластеру принимать решения.
Для координации роли приложения реализован механизм role-check: каждая нода периодически опрашивает локальный Patroni о статусе PRIMARY. Активная нода возвращает HTTP 200 на health-check эндпоинте, пассивная — 503. L7-балансировщик направляет трафик только на ACTIVE-ноду. При фейловере Patroni меняет лидера, role-check переключает роли, балансировщик перенаправляет трафик — DNS менять не требуется.
Пользовательские файлы реплицируются через lsyncd (на базе rsync + inotify), что обеспечивает синхронизацию почти в реальном времени. Вся инфраструктура разворачивается через Ansible. Выбор асинхронной репликации PostgreSQL — компромисс: возможна потеря незначительного объёма последних транзакций при аварийной потере primary, но запись не блокируется ожиданием второй ноды.




