Преобразование Standalone-сервера в кластер Patroni
Эта страница переведена при помощи нейросети GigaChat.
В этом разделе описывается процесс преобразования автономного экземпляра PostgreSQL в кластер Patroni.
Чтобы развернуть кластер Patroni без использования существующего экземпляра PostgreSQL, смотрите вместо этого раздел Запуск и настройка.
Процедура
Ниже приведен обзор шагов для преобразования существующего кластера Postgres в кластер, управляемый Patroni. В шагах предполагается, что все узлы, входящие в существующий кластер, в настоящее время работают, и что нет намерений изменять конфигурацию Postgres во время миграции. Шаги:
-
Создайте пользователей Postgres, как объяснено в разделе аутентификация конфигурации Patroni. Примеры SQL-команд для создания пользователей можно найти в блоке кода ниже, в котором необходимо заменить имена пользователей и пароли в соответствии со средой. Если уже есть соответствующие пользователи, можно пропустить этот шаг.
-- Суперпользователь Patroni
-- Замените PATRONI_SUPERUSER_USERNAME и PATRONI_SUPERUSER_PASSWORD соответствующим образом
CREATE USER PATRONI_SUPERUSER_USERNAME WITH SUPERUSER ENCRYPTED PASSWORD 'PATRONI_SUPERUSER_PASSWORD';
-- Пользователь репликации Patroni
-- Замените PATRONI_REPLICATION_USERNAME и PATRONI_REPLICATION_PASSWORD соответствующим образом
CREATE USER PATRONI_REPLICATION_USERNAME WITH REPLICATION ENCRYPTED PASSWORD 'PATRONI_REPLICATION_PASSWORD';
-- Пользователь rewind Patroni, если намерены включить use_pg_rewind в конфигурации Patroni
-- Замените PATRONI_REWIND_USERNAME и PATRONI_REWIND_PASSWORD соответствующим образом
CREATE USER PATRONI_REWIND_USERNAME WITH ENCRYPTED PASSWORD 'PATRONI_REWIND_PASSWORD';
GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO PATRONI_REWIND_USERNAME;
GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO PATRONI_REWIND_USERNAME;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO PATRONI_REWIND_USERNAME;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO PATRONI_REWIND_USERNAME; -
Выполните следующие шаги на всех узлах Postgres. Выполните все шаги на одном узле, прежде чем переходить к следующему. Начните с первичного узла, затем перейдите к каждому standby-узлу:
-
Если Postgres запускается через systemd, отключите systemd-юнит Postgres. Это делается потому, что Patroni управляет запуском и остановкой демона Postgres.
-
Создайте YAML-файл конфигурации для Patroni. Можно использовать инструменты генерации и валидации конфигурации Patroni для этого.
примечание(специфично для первичного узла) Если используются слоты репликации для репликации между участниками кластера, рекомендуется включить
use_slotsи настроить существующие слоты репликации как постоянные через элемент конфигурацииslots. Имейте в виду, что Patroni автоматически создает слоты репликации для репликации между участниками и удаляет слоты репликации, которые он не распознает, когда включенuse_slots. Идея использования постоянных слотов здесь заключается в том, чтобы позволить существующим слотам сохраняться во время миграции на Patroni. Смотрите Динамические настройки конфигурации для подробностей. -
Запустите Patroni, используя systemd-юнит службы
patroni. Он автоматически обнаружит, что Postgres уже запущен, и начнет мониторинг экземпляра.
-
-
Передайте «процедуру запуска» Postgres под управление Patroni. Для этого необходимо перезапустить участники кластера с помощью команды patronictl restart cluster-name member-name. Для минимального времени простоя можно разделить этот шаг на:
- Немедленный перезапуск standby-узлов.
- Запланированный перезапуск первичного узла в рамках окна обслуживания.
-
Если были настроены постоянные слоты на шаге
1.2., их необходимо удалить из конфигурацииslotsс помощью команды patronictl edit-config cluster-name, как толькоrestart_lsnслотов, созданных Patroni, сможет догнатьrestart_lsnисходных слотов для соответствующих участников. Удалив слоты из конфигурацииslots, можно позволить Patroni удалить исходные слоты из кластера, когда они больше не понадобятся. Ниже можно найти пример запроса для проверкиrestart_lsnпары слотов, чтобы можно было сравнить их:-- Предположим, original_slot_for_member_x — это имя слота в исходном
-- кластере для репликации изменений на участник X, а slot_for_member_x — это
-- слот, созданный Patroni для этой цели. Необходимо, чтобы restart_lsn
-- slot_for_member_x был >= restart_lsn original_slot_for_member_x
SELECT slot_name,
restart_lsn
FROM pg_replication_slots
WHERE slot_name IN (
'original_slot_for_member_x',
'slot_for_member_x'
)
Мажорное обновление версии 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 на standby-узлах.
- Запустить Patroni на standby-узлах и дождаться завершения репликации.
Запуск pg_upgrade на standby-узлах не поддерживается PostgreSQL. Если требуется выполнить процедуру rsync, описанную в документации, вместо очистки data_dir на standby-узлах, это можно попробовать на свой страх и риск. Однако самый безопасный способ — позволить 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не был пустым, поэтому бутстрап не произошел. Этот файл должен существовать заранее.