Программа-агент, которая создаёт отказоустойчивый кластер PostgreSQL
Программа-агент запущена на каждом из хостов. Программа-агент в случае потери сетевой связности мастера делает promote локальной СУБД до мастера.
Для того чтобы проверить, что сетевая связность потеряна у M, а не у S, используется координирование с арбитром.
Promote не происходит, если у S нет связи ни с M, ни с А.
Promote происходит если у S нет связи с M и А подтверждает отсутствие связи с М.
За основу взят контейнер postgres:9.6, в который добавляется собранный агент, написанный на golang.
Кластер создается через bash скрипты при инициализации контейнера, агент осуществляет все остальное.
Конфигурация осуществляется через файл app.env.
Агент проверят работоспособность всех составляющих кластера, если проверка завершилась успешно, происходит запуск.
Раз в секунду агент проверяет доступность соотвестсвующих узлов. Логика работа при обнаружении проблем с доступностью аналогична тексту задания.
Блокировка master происходит через iptables (iptables -P INPUT DROP
) с дальнейшим сохранением через iptables-save > /etc/iptables/rules.v4
.
Повышение до master происходит посредством триггер файла /tmp/touch_me_to_promote_to_me_master.
docker compose up
// Тестирование master
pgbench.exe -h 127.0.0.1 -p 5432 -U postgres -i -s 150 benchmark
// Останавливаем master
docker compose stop pg-master
// Проверяем работу slave (повышенного до master)
pgbench.exe -h 127.0.0.1 -p 5433 -U postgres -i -s 150 benchmark