Patroni конфигурация
Существует 3 типов конфигурации Patroni:
Глобальная динамическая конфигурация .
Эти параметры хранятся в DCS (распределённое хранилище конфигурации) и применяются ко всем узлам кластера. Динамическая конфигурация может быть установлена в любой момент с помощью инструмента patronictl_edit_config или Patroni REST API . Если изменённые параметры не входят в начальную конфигурацию, они применяются асинхронно (при следующем цикле пробуждения) на каждом узле, после чего узел перезагружается. Если узлу требуется перезапуск для применения конфигурации (для параметров PostgreSQL с контекстом postmaster, если их значения изменились), в members.data JSON устанавливается специальный флагpending_restart. Кроме того, состояние узла указывает на это, отображая"restart_pending": true.Локальный файл конфигурации (patroni.yml).
Эти параметры определяются в файле конфигурации и имеют приоритет перед динамической конфигурацией.patroni.ymlможно изменить и повторно загрузить во время выполнения (без перезапуска Patroni), отправив SIGHUP процессу Patroni, выполнив запросPOST /reloadREST-API или команду patronictl_reload . Локальная конфигурация может представлять собой один файл YAML или каталог. Если указан каталог, все файлы YAML в нём загружаются по одному в отсортированном порядке. Если ключ определён в нескольких файлах, приоритет имеет его значение в последнем файле.Конфигурация среды .
Возможна установка/переопределение некоторых параметров конфигурации «Локальная» с помощью переменных среды. Конфигурация среды особенно полезна при работе в динамической среде, когда некоторые параметры заранее неизвестны (например, невозможно определить внешний IP-адрес при запуске внутриdocker).
Важные правила
Параметры PostgreSQL, контролируемые Patroni
Некоторые параметры PostgreSQL должны иметь одинаковые значения на первичном сервере и репликах. Для этих параметров значения, установленные либо в локальных файлах конфигурации Patroni, либо через переменные среды, не влияют. Чтобы изменить или установить их значения, необходимо изменить общую конфигурацию в DCS. Ниже приведён список таких параметров вместе с их значениями по умолчанию и минимальными значениями:
- max_connections: значение по умолчанию 100, минимальное значение 25
- max_locks_per_transaction: значение по умолчанию 64, минимальное значение 32
- max_worker_processes: значение по умолчанию 8, минимальное значение 2
- max_prepared_transactions: значение по умолчанию 0, минимальное значение 0
- wal_level: значение по умолчанию hot_standby, допустимые значения: hot_standby, реплика, логическая
- track_commit_timestamp: значение по умолчанию off
Для параметров, указанных ниже, PostgreSQL не требует одинаковых значений между первичным сервером и всеми репликами. Однако с учётом возможности превращения реплики в первичный сервер в любой момент, установка различных значений не имеет смысла; следовательно, Patroni ограничивает установку их значений в динамическую конфигурацию .
- max_wal_senders: значение по умолчанию 10, минимальное значение 3
- max_replication_slots: значение по умолчанию 10, минимальное значение 4
- wal_keep_segments: значение по умолчанию 8, минимальное значение 1
- wal_keep_size: значение по умолчанию 128MB, минимальное значение 16MB
- wal_log_hints: включено
Эти параметры проверяются на корректность или соответствие минимальному значению.
Существуют и другие параметры Postgres, контролируемые Patroni:
- listen_addresses — устанавливается либо из переменной среды
postgresql.listen, либо из переменной средыPATRONI_POSTGRESQL_LISTEN - port — устанавливается либо из переменной среды
postgresql.listen, либо из переменной средыPATRONI_POSTGRESQL_LISTEN - cluster_name — устанавливается либо из переменной среды
scope, либо из переменной средыPATRONI_SCOPE - hot_standby: on
Для обеспечения безопасности параметры из приведённых выше списков записываются в postgresql.conf и передаются в виде списка аргументов в postgres, что придаёт им наибольший приоритет (за исключением wal_keep_segments и wal_keep_size), даже выше, чем у ALTER SYSTEM
Существуют также некоторые параметры, такие как postgresql.listen, postgresql.data_dir, которые можно задать только локально, i.e. в файле конфигурации Patroni config или с помощью переменной окружения configuration . В большинстве случаев локальная конфигурация переопределяет динамическую конфигурацию.
При применении параметров локальной или динамической конфигурации выполняются следующие действия:
- Узел сначала проверяет наличие файла
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_restart
(или через конечную точку REST API
/restart)
Примечание: имейте в виду, что перезапуск узлов PostgreSQL следует выполнять с помощью команды patronictl_restart
или через конечную точку REST API /restart. Попытка перезапуска PostgreSQL путём перезапуска демона Patroni, e.g. путём выполнения команды systemctl restart patroni, может привести к переключению при отказе в кластере, если перезапускается первичный сервер.
Однако, поскольку эти параметры управляют общей памятью, при перезапуске узлов следует проявлять дополнительную осторожность:
- Если вы хотите увеличить значение одного из этих параметров:
- Сначала перезапустите все резервные серверы
- Затем перезапустите первичный сервер
- Если вы хотите уменьшить значение одного из этих параметров:
- Перезапустите первичный сервер сначала
- Затем перезапустите все резервные серверы
Примечание: если вы попытаетесь перезапустить все узлы одновременно после уменьшения значения любого из этих параметров, Patroni проигнорирует изменение и перезапустит резервный сервер с исходным значением параметра, что потребует последующего повторного перезапуска резервных серверов. Patroni поступает так, чтобы предотвратить попадание резервного сервера в бесконечный цикл сбоев, поскольку PostgreSQL завершается с сообщением FATAL, если попытаться установить любой из этих параметров на значение ниже, чем то, что отображается в pg_controldata на узле резервного сервера. Иными словами, мы можем уменьшить значение параметра на резервном сервере только после того, как его pg_controldata будет синхронизировано с первичным сервером относительно этих изменений на первичном сервере.
Дополнительную информацию об этом можно найти в Обзоре администратора PostgreSQL .
Patroni параметры конфигурации
Также следующие параметры конфигурации Patroni могут быть изменены только динамически:
- ttl: 30
- loop_wait: 10
- retry_timeout: 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 local configuration
. С помощью исполняемого файла patroni вы можете:
- Создайте образец локальной конфигурации Patroni;
- Создайте файл конфигурации Patroni для локально запущенного экземпляра PostgreSQL (e.g в качестве подготовительного шага к интеграции с Patroni );
- Проверьте заданный файл конфигурации Patroni.
Пример конфигурации Patroni
Описание
Создайте образец файла конфигурации Patroni в формате yaml. Значения параметров задаются с помощью конфигурации Environment
, в противном случае, если не заданы, используются значения по умолчанию в 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 в формате yaml для локально запущенного экземпляра PostgreSQL. Для соединения с PostgreSQL будет использоваться либо указанный DSN (он имеет приоритет), либо переменные окружения
PostgreSQL. Если пароль не указан, его следует ввести по запросу.
Все не внутренние параметры GUC, определённые в исходном экземпляре PostgreSQL, независимо от того, были ли они установлены через файл конфигурации, через командную строку postmaster или через переменные среды, будут использованы в качестве источника для следующих параметров конфигурации Patroni:
- scope:
cluster_nameGUC значение;- postgresql.listen:
listen_addressesиportGUC значения;- postgresql.datadir:
data_directoryGUC значение;- postgresql.parameters:
archive_command,restore_command,archive_cleanup_command,recovery_end_command,ssl_passphrase_command,hba_file,ident_file,config_fileGUC значения;- bootstrap.dcs: все остальные собранные параметры GUC PostgreSQL.
Если параметр scope, postgresql.listen или postgresql.datadir не задан через GUC PostgreSQL, используется соответствующее значение конфигурации Environment
.
Другие правила, применяемые для определения значений:
- name: значение переменной среды
PATRONI_NAME, если установлена, иначе имя хоста текущей машины.- postgresql.bin_dir: путь к бинарным файлам PostgreSQL, извлечённый из работающего экземпляра.
- postgresql.connect_address: IP-адрес, возвращённый вызовом
gethostnameдля имени хоста текущей машины, и порт, используемый для соединения с экземпляром, или значениеportGUC.- 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 и выведите сведения о неудавшихся проверках.
Параметры
configfile
Полный путь к файлу конфигурации для проверки. Если не указан или файл отсутствует, будет попытка прочитать из переменной среды PATRONI_CONFIG_VARIABLE, или, если она не установлена, из переменных среды Patroni
.
--ignore-listen-port | -i
Необязательный флаг для игнорирования ошибок привязки к портам listen, которые уже заняты при проверке configfile.
--print | -p
Необязательный флаг для вывода локальной конфигурации (включая переопределения конфигурации из переменных среды) после её успешной валидации.
Полная справка по параметрам и разделам конфигурации Patroni YAML.
Настройки динамической конфигурации, хранящиеся в DCS, применяются ко всему кластеру.
Переменные среды для переопределения параметров конфигурации Patroni.