Last updated
Was this helpful?
Last updated
Was this helpful?
Для организации отказоустойчивого кластера PostgreSQL используется синхронная репликация master-standby, настроенная при помощи утилиты repmgr, и HAProxy. HAProxy используется для скрытия от клиента IP mastera, который изменится после автоматического failover. Для примера рассмотрим настройку кластера из 3-х нод.
Штатная работа кластера:
Выход из строя (недоступность) master:
Автоматический failover и реструктуризация кластера:
Штатная работа кластера с новым master:
Чтение и запись производится клиентом через HAProxy только в master *. Для определения, является ли нода master, HAProxy по порту 5445 вызывает http-сервисы, развернутые на всех нодах кластера. Если нода является master, сервис вернет http-статус 200, иначе 503.
* - Со standby возможно только чтение, но этот сценарий в данной статье не рассматривается.
https://www.youtube.com/watch?v=LvDHdgQqaQw
Установим PostgreSQL (локально из пакетов или из репозитория в интернет, см. «Руководство по установке TimescaleDB под CentOS 8») и repmgr12 на всех нодах:
На всех нодах настроим переменную окружения PATH для удобства работы с pgsql:
На всех нодах добавляем repmgr12 в автозапуск:
Добавляем настройки repmgr в postgresql.conf (достаточно для ноды 1):
Добавляем пользователей для репликации в pg_hba.conf (достаточно для ноды 1):
Назначаем владельца и права на конфигурационные файлы (достаточно для ноды 1):
Перезапускаем postgresql12 на ноде 1:
Теперь настраиваем repmgr:
Выполняем настройку схемы по умолчанию (достаточно для ноды 1):
Дальнейшая настройка repmgr происходит для каждой ноды. Полезно сначала сохранить оригинальный конфигурационный файл:
Для ноды 1:
Регистрируем ноду 1 как master:
Для ноды 2:
Регистрируем ноду 2 как standby:
Для ноды 3:
Регистрируем ноду 3 как standby:
Дальше на всех узлах создаем скрипты и службы для определения, является ли нода master.
Редактируем файл sudoers:
Устанавливаем socat (чтобы запускать скрипты в службах):
Копируем скрипт pg_ms.sh в /usr/local/bin и делаем его исполняемым:
Создаем службу, которая будет по http-запросу выполнять скрипт pg_ms.sh:
Перезагружаем юниты, добавляем созданную службу в автозагрузку, запускаем:
Проверяем отдачу службы для всех нод:
Добавляем правила в firewal:
Настраиваем конфигурацию haproxy:
Перезагружаем haproxy:
Устанавливаем HAProxy с .