Конфигурирование Patroni
Эта страница переведена при помощи нейросети GigaChat.
Существует три типа конфигурации Patroni:
- Глобальная динамическая конфигурация. Эти параметры хранятся в DCS (распределенном хранилище конфигурации) и применяются на всех узлах кластера. Динамическую конфигурацию можно установить в любое время с помощью инструмента patronictl edit-config или через интерфейс Patroni REST API. Если измененные параметры не являются частью конфигурации запуска, они применяются асинхронно (при следующем цикле пробуждения) для каждого узла, который затем перезагружается. Если узел требует перезапуска для применения конфигурации (для параметров PostgreSQL с контекстом postmaster, если их значения были изменены), специальный флаг
pending_restart
указывающий на это, устанавливается в файле members.data JSON. Кроме того, статус узла указывает на это, отображая"restart_pending": true
. - Локальный файл конфигурации (patroni.yml). Эти параметры определены в файле конфигурации и имеют приоритет над динамической конфигурацией.
patroni.yml
может быть изменен и перезагружен во время выполнения (без перезапуска Patroni), отправив сигнал SIGHUP процессу Patroni, выполнив запросPOST /reload
к REST-API или выполнив команду patronictl reload. Локальная конфигурация может быть либо одним файлом YAML, либо каталогом. Когда это каталог, все файлы YAML в этом каталоге загружаются по одному в отсортированном порядке. В случае, если ключ определен в нескольких файлах, предпочтение отдается последнему файлу. - Конфигурация окружения. Позволяет установить/заменить некоторые из параметров локальной конфигурации с помощью переменных окружения. Конфигурация среды полезна, когда работа происходит в динамической среде и нет определенности по некоторым из параметров заранее (например, внешний IP-адрес может быть неизвестен при запуске внутри
docker
).
Важные правила
Параметры PostgreSQL, контролируемые Patroni
Некоторые из параметров PostgreSQL должны иметь одинаковые значения на основном сервере и репликах. Для них значения, установленные либо в локальных файлах конфигурации Patroni, либо через переменные окружения, не вступают в силу. Чтобы изменить или установить их значения, необходимо изменить общую конфигурацию в DCS. Ниже приведен фактический список таких параметров вместе со значениями по умолчанию:
max_connections
: 100;max_locks_per_transaction
: 64;max_worker_processes
: 8;max_prepared_transactions
: 0;wal_level
: hot_standby;track_commit_timestamp
: off.
Для параметров ниже PostgreSQL не требует одинаковых значений между основным и всеми репликами. Однако, учитывая возможность того, что реплика может стать основной в любое время, нет особого смысла устанавливать их по-разному; поэтому Patroni ограничивает установку их значений в динамической конфигурации.
max_wal_senders
: 5;max_replication_slots
: 5;wal_keep_segments
: 8;wal_keep_size
: 128MB.
Эти параметры проверяются, чтобы убедиться в их адекватности или соответствии минимальному значению.
Есть и другие параметры PostgreSQL, контролируемые Patroni:
listen_addresses
- устанавливается либо изpostgresql.listen
или из переменной окруженияPATRONI_POSTGRESQL_LISTEN
;порт
- устанавливается либо изpostgresql.listen
или из переменной окруженияPATRONI_POSTGRESQL_LISTEN
;имя_кластера
- устанавливается либо изscope
или из переменной окруженияPATRONI_SCOPE
;hot_standby: on
;wal_log_hints: on
- для PostgreSQL 9.4 и новее.
На всякий случай параметры из приведенных выше списков не записываются в postgresql.conf
, а передаются в качестве списка аргументов в pg_ctl start
, что дает им наивысший приоритет, даже выше, чем у ALTER SYSTEM.
Также есть некоторые параметры, такие как postgresql.listen
, postgresql.data_dir
, которые могут быть установлены только локально
, т.е. в файле конфигурации Patroni или через переменную конфигурации. В большинстве случаев локальная конфигурация будет переопределять динамическую конфигурацию.
При применении локальных или динамических параметров конфигурации выполняются следующие действия:
- Узел сначала проверяет, существует ли файл
postgresql.base.conf
или установлен ли параметрcustom_conf
. - Если установлен параметр
custom_conf
, то указанный им файл используется в качестве базовой конфигурации, игнорируяpostgresql.base.conf
иpostgresql.conf
. - Если параметр
custom_conf
не установлен и существует postgresql.base.conf, он содержит переименованную «оригинальную» конфигурацию и используется в качестве базовой конфигурации. - Если нет ни
custom_conf
, ниpostgresql.base.conf
, исходныйpostgresql.conf
переименовывается вpostgresql.base.conf
и используется в качестве базовой конфигурации. - Динамические параметры (за исключением вышеупомянутых) сбрасываются в
postgresql.conf
, а включение устанавливается вpostgresql.conf
для базовой конфигурации (либоpostgresql.base.conf
, либо файла по адресуcustom_conf
). Таким образом, сможете применять новые параметры без повторного чтения файла конфигурации для проверки наличия включения или его отсутствия. - Некоторые параметры, которые необходимы Patroni для управления кластером, переопределяются с помощью командной строки.
- Если изменяется опция, требующая перезапуска (необходимо посмотреть контекст в
pg_settings
и фактические значения этих опций), на этом узле устанавливается флагpending_restart
. Этот флаг сбрасывается при любом перезапуске.
Параметры будут применяться в следующем порядке (параметрам времени выполнения присваивается наивысший приоритет):
- Загрузить параметры из файла
postgresql.base.conf
(или из файлаcustom_conf
, если он установлен). - Загрузить параметры из файла
postgresql.conf
. - Загрузить параметры из файла
postgresql.auto.conf
. - Параметр времени выполнения с использованием
-o --name=value
.
Это позволяет настроить все узлы (2), настроить конкретный узел с помощью ALTER SYSTEM
(3) и гарантирует, что параметры, необходимые для работы Patroni, соблюдаются (4), а также оставляет место для инструментов настройки, которые управляют postgresql.conf
напрямую без участия Patroni (1).
Параметры PostgreSQL, которые касаются общей памяти
В PostgreSQL есть некоторые параметры, определяющие размер общей памяти, используемой ими:
max_connections
;max_prepared_transactions
;max_locks_per_transaction
;max_wal_senders
;max_worker_processes
.
Для изменения этих параметров требуется перезапуск PostgreSQL, а структуры общей памяти на резервных узлах не могут быть меньше, чем на основном узле.
Как объяснялось ранее, Patroni ограничивает изменение их значений с помощью динамической конфигурации, которая обычно состоит из:
- Внесения изменений через patronictl edit-config (или через конечную точку REST API
/config
) - Перезапуск узлов через patronictl перезагрузка (или через конечную точку REST API
/restart
)
Необходимо выполнить перезагрузку узлов PostgreSQL через команду patronictl перезагрузка или через конечную точку REST API /restart
. Попытка перезагрузки PostgreSQL путем перезапуска демона Patroni, например, выполнив systemctl restart patroni
, может привести к отказу в кластере, если перезагрузить основной узел.
Однако, поскольку эти настройки управляют общей памятью, при перезапуске узлов следует соблюдать особую осторожность:
-
Если нужно
увеличить
значение любой из этих настроек:- Сначала перезапустите все резервные копии.
- После этого перезапустите основную систему.
-
Если нужно
уменьшить
значение любой из этих настроек:- Сначала перезапустите главную систему.
- Перезапустите все резервные копии после этого.
Если попытаться перезагрузить все узлы одновременно после уменьшения
значения любого из этих параметров, Patroni проигнорирует изменение и перезапустит резервную копию с исходным значением параметра, что потребует от вас повторного перезапуска резервных копий позже. Patroni делает это для предотвращения бесконечного цикла сбоев резервного копирования, поскольку PostgreSQL завершает работу с сообщением о серьезной ошибке, если пытаться установить любой из этих параметров на значение ниже того, которое видно в pg_controldata
на узле резервного копирования. Другими словами, можно уменьшить настройку на резервном узле только тогда, когда его pg_controldata
обновляется по отношению к основному в отношении этих изменений в основном.
Дополнительную информацию об этом можно найти в разделе Обзор администратора PostgreSQL.
Конфигурационные параметры Patroni
Также следующие конфигурационные параметры Patroni могут быть изменены только динамически:
ttl
: 30;loop_wait
: 10;retry_timeouts
: 10;maximum_lag_on_failover
: 1048576;max_timelines_history
: 0;check_timeline
: false;postgresql.use_slots
: true.
При изменении этих параметров Patroni будет считывать соответствующий раздел конфигурации, хранящейся в DCS, и изменять свои значения во время выполнения.
Узлы Patroni сбрасывают состояние опций DCS на диск при каждом изменении конфигурации в файл patroni.dynamic.json
, расположенный в каталоге данных PostgreSQL. Только лидер имеет право восстанавливать эти параметры из дампа на диске, если они полностью отсутствуют в DCS или являются недействительными.
Создание и проверка конфигурации
Patroni предоставляет интерфейсы командной строки для генерации и проверки локальной конфигурации Patroni. Используя исполняемый файл patroni
, можно:
- Создать образец локальной конфигурации Patroni;
- Создать файл конфигурации Patroni для локально запущенного экземпляра PostgreSQL (например, в качестве подготовительного шага для интеграции с Patroni);
- Проверить заданный файл конфигурации Patroni.
Пример конфигурации Patroni
patroni --generate-sample-config [configfile]
Описание
Генерирует конфигурацию Patroni в формате yaml
для локально запущенного экземпляра PostgreSQL. Значения параметров определяются с использованием конфигурации среды, в противном случае, если они не установлены, используются значения по умолчанию в Patroni или строка #FIXME
для значений, которые должны быть позже определены пользователем.
Некоторые значения по умолчанию определяются на основе локальной настройки:
postgresql.listen
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и стандартного порта5432
;postgresql.connect_address
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и стандартного порта5432
;postgresql.authentication.rewind
– определяется только в том случае, если версия PostgreSQL может быть определена из двоичного файла и версия равна 11 или выше;restapi.listen
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и стандартного порта8008
;restapi.connect_address
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и стандартного порта8008
.
Параметры
configfile
– полный путь к файлу конфигурации, который используется для хранения результата. Если не указано, результат отправляется в stdout
.
Конфигурация Patroni для работающего экземпляра
patroni --generate-config [--dsn DSN] [configfile]
Описание
Генерирует конфигурацию Patroni в формате для локально запущенного экземпляра PostgreSQL. Будет использоваться либо предоставленный DSN (имеет приоритет), либо переменные среды PostgreSQL для подключения к PostgreSQL. Если пароль не указан, его следует ввести через запрос.
Все не внутренние параметры конфигурации, определенные в исходном экземпляре Postgres, независимо от того, были ли они установлены с помощью файла конфигурации, командной строки postmaster или переменных окружения, будут использованы в качестве источника для следующих параметров конфигурации Patroni:
scope
–cluster_name
значение GUC-параметра конфигурации;postgresql.listen
–listen_addresses
иport
значения GUC-параметров конфигурации;postgresql.datadir
–data_directory
значение GUC-параметра конфигурации;postgresql.parameters
–archive_command
,restore_command
,archive_cleanup_command
,recovery_end_command
,ssl_passphrase_command
,hba_file
,ident_file
,config_file
значения GUC-параметров конфигурации;bootstrap.dcs
– все остальные собранные GUC-параметры конфигурации PostgreSQL.
Если scope
, postgresql.listen
или postgresql.datadir
не заданы из GUC-параметров конфигурации Postgres, используется соответствующее значение конфигурации среды.
Другие правила применяются для определения значений:
name
–PATRONI_NAME
значение переменной среды, если установлено, в противном случае имя хоста текущей машины;postgresql.bin_dir
– путь к двоичным файлам PostgreSQL, собранным из работающего экземпляра;postgresql.connect_address
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и порта, используемого для подключения к экземпляру, или значения GUC-параметраport
;postgresql.authentication.superuser
– конфигурация, используемая для подключения к экземпляру;postgresql.pg_hba
– строки, собранные из исходного экземпляраhba_file
;postgresql.pg_ident
– строки, собранные из исходного экземпляраident_file
;restapi.listen
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и стандартного порта8008
;restapi.connect_address
– IP-адрес, возвращаемый вызовомgethostname
для имени хоста текущей машины и стандартного порта8008
.
Другие параметры, определенные с использованием конфигурация окружения, также включены в конфигурацию.
Параметры
configfile
Полный путь к файлу конфигурации, который используется для хранения результата. Если не предоставлено, результат отправляется в stdout
.
dsn
Необязательная строка DSN для локального экземпляра PostgreSQL для получения значений GUC.
Проверка конфигурации Patroni
patroni --validate-config [configfile]
Описание
Проверяет заданную конфигурацию Patroni и выводит информацию о неудачных проверках.
Параметры
configfile
Полный путь к файлу конфигурации для проверки. Если не указано или файл отсутствует, будет пытаться прочитать из переменной окружения PATRONI_CONFIG_VARIABLE
или, если она не установлена, из переменных окружения Patroni.