Преобразование Standalone-сервера в кластер Patroni
Эта страница переведена при помощи нейросети GigaChat.
В этом разделе описывается процесс преобразования отдельного экземпляра PostgreSQL в кластер Patroni.
Процедура
Ниже приведен обзор шагов по преобразованию существующего кластера PostgreSQL в управляемый кластером Patroni. В этих шагах предполагается, что все узлы, которые являются частью существующего кластера, в настоящее время работают и запущены, и не планируется изменять конфигурацию PostgreSQL во время миграции. Шаги:
-
Создайте пользователей PostgreSQL, как объяснено для раздела аутентификации конфигурации Patroni. Ниже приведен пример SQL-команд для создания пользователей в блоке кода, где нужно заменить имена пользователей и пароли в соответствии с текущей средой. Если соответствующие пользователи уже настроены, то можно пропустить этот шаг:
-- Patroni superuser
-- Replace PATRONI_SUPERUSER_USERNAME and PATRONI_SUPERUSER_PASSWORD accordingly
CREATE USER PATRONI_SUPERUSER_USERNAME WITH SUPERUSER ENCRYPTED PASSWORD 'PATRONI_SUPERUSER_PASSWORD';
-- Patroni replication user
-- Replace PATRONI_REPLICATION_USERNAME and PATRONI_REPLICATION_PASSWORD accordingly
CREATE USER PATRONI_REPLICATION_USERNAME WITH REPLICATION ENCRYPTED PASSWORD 'PATRONI_REPLICATION_PASSWORD';
-- Patroni rewind user, if you intend to enable use_pg_rewind in your Patroni configuration
-- Replace PATRONI_REWIND_USERNAME and PATRONI_REWIND_PASSWORD accordingly
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; -
Выполните следующие шаги на всех узлах PostgreSQL. Выполняйте все шаги на одном узле перед переходом к следующему узлу. Начните с основного узла, затем перейдите к каждому резервному узлу:
-
Если запуск PostgreSQL происходит через
systemd
, то отключите системный блок PostgreSQL. Это необходимо сделать, поскольку Patroni управляет запуском и остановкой сервиса PostgreSQL. -
Создайте файл конфигурации YAML для Patroni. Можно использовать инструменты генерации и проверки конфигурации Patroni для этого.
Примечание (специфично для основного узла)Если в системе есть слоты репликации, которые используются для репликации между членами кластера, рекомендуется включить
use_slots
и настроить существующие слоты репликации как постоянные с помощью элемента конфигурацииslots
. Обратите внимание, что Patroni автоматически создает слоты репликации для репликации между участниками и удаляет слоты репликации, которые он не распознает, когдаuse_slots
включен. Идея использования постоянных слотов здесь заключается в том, чтобы позволить существующим слотам сохраняться во время миграции на Patroni. Подробная информация приведена в разделе «Параметры настройки YAML». -
Запустите Patroni с помощью блока службы
patroni
systemd
. Он автоматически обнаружит, что PostgreSQL уже запущен, и начнет мониторинг экземпляра.
-
-
Передайте процедуру запуска PostgreSQL в Patroni. Для этого перезапустите участников кластера через команду patronictl restart cluster-name member-name. Для минимального времени простоя можно разделить этот шаг на:
- Немедленный перезапуск узлов резервного копирования.
- Плановый перезапуск основного узла в течение окна обслуживания.
-
Если были настроены постоянные слоты на шаге
1.2.
, то удалите их из конфигурацииslots
с помощью команды patronictl edit-config cluster-name member-name после того, какrestart_lsn
слотов, созданных Patroni, сможет догнатьrestart_lsn
исходных слотов для соответствующих членов. Удаляя слоты из конфигурацииslots
позволяет Patroni удалить исходные соответствующие слоты из кластера, когда они больше не понадобятся. Ниже приведен пример запроса для проверкиrestart_lsn
пары слотов, чтобы можно было сравнить их:-- Assume original_slot_for_member_x is the name of the slot in your original
-- cluster for replicating changes to member X, and slot_for_member_x is the
-- slot created by Patroni for that purpose. You need restart_lsn of
-- slot_for_member_x to be >= restart_lsn of 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
. - Удалите ключ инициализации из DCS или полностью удалите состояние кластера из DCS. Второго можно достичь, запустив patronictl remove cluster-name. Это необходимо потому, что
pg_upgrade
запускаетinitdb
, который фактически создает новую базу данных с новым системным идентификатором PostgreSQL. - Если очистить состояние кластера на предыдущем шаге, скопировать
patroni.dynamic.json
из старого каталога данных в новый. Это поможет сохранить некоторые параметры PostgreSQL, которые были установлены ранее. - Запустите Patroni на главном узле.
- Обновите бинарные файлы PostgreSQL, обновите файл
patroni.yml
и очистите каталог данных на узлах-резервных копиях. - Запустите Patroni на узлах-резервных копиях и дождитесь завершения репликации.
Запуск pg_upgrade
на узлах-резервных копиях не поддерживается PostgreSQL. Если знаете, что делаете, то можете попробовать процедуру rsync
, описанную по адресу https://www.postgresql.org/docs/current/pgupgrade.html вместо очистки каталога данных на узлах-резервных копиях. Однако самым безопасным способом является позволить Patroni выполнить репликацию данных самостоятельно.
Часто задаваемые вопросы
-
При запуске 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
не был пустым, поэтому начальная загрузка не произошла. Этот файл должен существовать заранее.