Документация pgfailover

pgfailover наблюдает за состоянием кластера PostgreSQL и выступает для клиентов как TCP-прокси к текущему Primary. При смене Primary pgfailover разрывает соединения с клиентами, и они должны переподключиться.

Параметры подключения задаются через переменные окружения с префиксом PGFAILOVER_:

export PGFAILOVER_BIND_ADDRESS=":5432"
export PGFAILOVER_SERVERS="postgres://repuser@pg0.example.com/database?sslmode=disable&connect_timeout=5 postgres://repuser@pg1.example.com/database?sslmode=disable&connect_timeout=5"
./pgfailover

Роль сервера (Primary/Standby) проверяется pg_is_in_recovery() по умолчанию раз в 5 секунд (PGFAILOVER_INTERVAL), количество попыток подключения регулируется переменной PGFAILOVER_ATTEMPTS (по умолчанию 1).

pgfailover может автоматически переводить локальный PostgreSQL в Primary. Предполагается, что задан порядок серверов, участвующих в кластере. pgfailover работает на каждом сервере, и ему задан индекс этого сервера. Когда с Primary пропадает связь, pgfailover на первом по порядку сервере, где работает Standby, переводит его в Primary. Индекс текущего сервера задается переменной окружения PGFAILOVER_INDEX, начиная с 0. Перевод в Primary выполняется путём вызова SQL-функции pg_promote() и может быть отключён установкой PGFAILOVER_DISABLE_PROMOTION=true. Экземпляры pgfailover должны иметь одинаковый список серверов PostgreSQL и уникальные номера без пропусков.

Пример для первого сервера (индекс 0):

export PGFAILOVER_INDEX=0
export PGFAILOVER_SERVERS="postgres://repuser@pg0.example.com/database?sslmode=disable&connect_timeout=5 postgres://repuser@pg1.example.com/database?sslmode=disable&connect_timeout=5"
./pgfailover

Пример для второго сервера (индекс 1):

export PGFAILOVER_INDEX=1
export PGFAILOVER_SERVERS="postgres://repuser@pg0.example.com/database?sslmode=disable&connect_timeout=5 postgres://repuser@pg1.example.com/database?sslmode=disable&connect_timeout=5"
./pgfailover