HAProxy и PostgreSQL: как автоматически определять роли экземпляров и защититься от split brain
Отказоустойчивость PostgreSQL-кластера во многом зависит от того, насколько правильно балансировщик нагрузки распределяет входящие соединения между экземплярами. Если HAProxy не понимает, какой сервер сейчас выполняет роль мастера, а какой — реплики, клиентские запросы на запись могут попасть на реплику и завершиться ошибкой. Ещё опаснее ситуация, когда в кластере возникает split brain — два узла одновременно считают себя мастером, что ведёт к конфликтам и риску потери данных. Для предотвращения таких сценариев HAProxy должен выполнять регулярные проверки состояния каждого экземпляра и динамически направлять трафик на подходящие серверы.
Подробности
Существует несколько способов научить HAProxy различать роли экземпляров PostgreSQL. Первый и наиболее предпочтительный — использовать Patroni REST API. Patroni, как инструмент управления отказоустойчивым кластером, предоставляет endpoint, через который балансировщик может узнать текущую роль узла: мастер или реплика. Если Patroni работает и не находится на паузе, этот метод даёт наиболее точную и своевременную информацию о состоянии кластера.
Однако бывают ситуации, когда Patroni поставлен на паузу или вовсе не используется. В таких случаях на помощь приходят два альтернативных механизма. Первый — параметр in_hot_standby, который сервер PostgreSQL передаёт клиенту сразу после аутентификации. Этот параметр позволяет HAProxy определить, находится ли экземпляр в режиме горячего резерва, то есть является ли он репликой. Второй способ — выполнение SQL-запроса select pg_is_in_recovery();. Функция pg_is_in_recovery() возвращает true, если сервер находится в процессе восстановления и, следовательно, работает как реплика, и false — если это мастер.
Оба последних метода применяются именно тогда, когда Patroni недоступен, поставлен на паузу или не задействован в архитектуре. Они позволяют HAProxy продолжать корректно определять роли и не допускать отправки запросов на запись к репликам. Такой подход особенно важен для защиты от split brain: если балансировщик точно знает, кто является мастером, он не будет направлять трафик на потенциально конфликтующий узел.
Что делать
Для корректной настройки HAProxy следует выбрать подходящий механизм проверки ролей с учётом особенностей вашей инфраструктуры. Если вы используете Patroni, настройте health check через его REST API — это обеспечит наиболее надёжное определение ролей. Если Patroni не применяется или временно приостановлен, задействуйте проверку параметра in_hot_standby или запрос select pg_is_in_recovery(). Убедитесь, что проверки выполняются с достаточной частотой, чтобы HAProxy быстро реагировал на переключение ролей и изменения в кластере. Также стоит протестировать поведение балансировщика при плановом переключении (failover) и в сценариях сбоя, чтобы убедиться, что трафик на запись всегда попадает на актуальный мастер.
Грамотно настроенные проверки ролей в HAProxy — это не только удобство маршрутизации, но и важный элемент защиты от split brain. Автоматическое определение мастера и реплик позволяет снизить риск ошибок конфигурации и повысить общую отказоустойчивость кластера PostgreSQL.
Источник: Хабр — Системное администрирование

