Преобразование отдельного экземпляра в кластер Patroni
В этом разделе описано преобразование отдельного экземпляра PostgreSQL в кластер Patroni.
Чтобы развернуть кластер Patroni без существующего экземпляра PostgreSQL, обратитесь к разделу Запуск и настройка .
Процедура
Ниже приведён обзор преобразования существующего кластера Postgres в кластер под управлением Patroni. Предполагается, что все узлы существующего кластера работают и во время миграции вы не намерены менять конфигурацию Postgres. Выполните следующие действия:
Создайте пользователей Postgres, как описано в разделе аутентификации конфигурации Patroni. В блоке SQL ниже приведены примеры команд; замените имена пользователей и пароли в соответствии со своим окружением. Если необходимые пользователи уже существуют, пропустите этот шаг.
Выполните следующие действия на всех узлах Postgres. Завершите все шаги на одном узле, прежде чем переходить к следующему. Начните с первичного узла, затем обработайте каждый резервный узел:
- Если Postgres запускается через systemd, отключите модуль systemd Postgres, поскольку запуском и остановкой демона Postgres будет управлять Patroni.
- Создайте файл конфигурации YAML Patroni. Для этого можно использовать средства создания и проверки конфигурации Patroni
.
- Примечание для первичного узла: если слоты репликации используются между участниками кластера, рекомендуется включить
use_slotsи настроить существующие слоты как постоянные через элемент конфигурацииslots. При включённомuse_slotsPatroni автоматически создаёт слоты для репликации между участниками и удаляет неизвестные ему слоты. Постоянные слоты позволяют сохранить существующие слоты на время миграции к Patroni. Подробнее см. Параметры динамической конфигурации .
- Примечание для первичного узла: если слоты репликации используются между участниками кластера, рекомендуется включить
- Запустите Patroni с помощью модуля службы systemd
patroni. Он автоматически обнаружит, что Postgres уже работает, и начнёт мониторинг экземпляра.
Передайте Patroni процедуру запуска Postgres. Для этого перезапустите участников кластера командой patronictl restart cluster-name member-name . Чтобы свести простой к минимуму, можно разделить шаг на две части:
- Немедленный перезапуск резервных узлов.
- Запланированный перезапуск первичного узла в окно обслуживания.
Если на шаге
1.2.настроены постоянные слоты, удалите их из конфигурацииslotsкомандой patronictl edit-config cluster-name , когдаrestart_lsnсозданных Patroni слотов догонитrestart_lsnисходных слотов соответствующих участников. После удаления слотов из конфигурацииslotsPatroni сможет удалить исходные слоты из кластера, когда они перестанут быть нужны. Ниже приведён пример запроса для сравненияrestart_lsnпары слотов:
Обновление основной версии PostgreSQL
В настоящее время обновить основную версию можно только следующим способом:
- Остановите Patroni
- Обновите двоичные файлы PostgreSQL и выполните pg_upgrade на первичном узле
- Обновите patroni.yml
- Удалите ключ initialize из DCS либо полностью очистите состояние кластера в DCS. Второй вариант выполняется командой patronictl remove cluster-name . Это необходимо, поскольку pg_upgrade запускает initdb, фактически создающий новую базу данных с новым системным идентификатором PostgreSQL.
- Если на предыдущем шаге состояние кластера очищено, можно скопировать patroni.dynamic.json из старого каталога данных в новый. Это поможет сохранить некоторые ранее заданные параметры PostgreSQL.
- Запустите Patroni на первичном узле.
- Обновите двоичные файлы PostgreSQL и patroni.yml, затем очистите data_dir на резервных узлах.
- Запустите Patroni на резервных узлах и дождитесь завершения репликации.
PostgreSQL не поддерживает запуск pg_upgrade на резервных узлах. Если вы уверены в своих действиях, вместо очистки data_dir можно попробовать процедуру rsync, описанную в https://www.postgresql.org/docs/current/pgupgrade.html . Однако безопаснее всего позволить Patroni реплицировать данные.
Часто задаваемые вопросы
При запуске Patroni сообщает, что не может привязаться к порту PostgreSQL.
Проверьте
listen_addressesиportвpostgresql.conf, а такжеpostgresql.listenвpatroni.yml. Не забудьте, чтоpg_hba.confдолжен разрешать такой доступ.После запроса Patroni на перезапуск узла PostgreSQL выводит ошибку
could not open configuration file "/etc/postgresql/10/main/pg_hba.conf": No such file or directoryЗначение зависит от способа управления конфигурацией PostgreSQL. Если указан
postgresql.config_dir, Patroni создаётpg_hba.confпо параметрам раздела bootstrap только при начальной инициализации нового кластера. В этом сценарииPGDATAне был пуст, поэтому инициализация не выполнялась. Файл должен существовать заранее.