# Настройки динамической конфигурации

> Настройки динамической конфигурации, хранящиеся в DCS, применяются ко всему кластеру.

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

<a id="dynamic"></a>
Динамическая конфигурация хранится в DCS (распределённое хранилище конфигурации) и применяется ко всем узлам кластера.

Чтобы изменить динамическую конфигурацию, можно использовать либо инструмент [patronictl_edit_config](/ru/docs/patroni/patronictl#patronictl_edit_config), либо Patroni [REST API](/ru/docs/patroni/rest_api#rest_api).

- **loop_wait**: количество секунд, в течение которых цикл будет спать. Значение по умолчанию: 10, минимально возможное значение: 1
- **ttl**: TTL для получения блокировки лидера (в секундах). Представьте это как продолжительность времени до начала процесса автоматического переключения при отказе. Значение по умолчанию: 30, минимально возможное значение: 20
- **retry_timeout**: тайм-аут повторных попыток операций DCS и PostgreSQL (в секундах). DCS или сетевые проблемы, короче этого времени, не приведут к демотированию лидера. Значение по умолчанию: 10, минимально возможное значение: 3

> [!WARNING]
> при изменении значений **loop_wait**, **retry_timeout** или **ttl** необходимо соблюдать следующее правило:
>
> ```python
> loop_wait + 2 * retry_timeout <= ttl
> ```

- **maximum_lag_on_failover**: максимальное количество байт, на которое последовательный узел может отставать, чтобы участвовать в выборах лидера.
- **primary_race_backoff**: откладывает выбор лидера на резервных серверах на `primary_race_backoff` секунд, если репликация WAL с первичного сервера всё ещё продвигается. Это позволяет свести к минимуму ненужные переключения при отказе, вызванные кратковременной недоступностью Patroni. Значение по умолчанию: 0 (отключено).
- **maximum_lag_on_syncnode**: максимальное количество байт, на которое синхронная реплика может отставать, прежде чем она будет считаться нездоровым кандидатом на замену здоровой асинхронной репликой. Patroni использует максимальный LSN реплики, если имеется более одной реплики, в противном случае используется текущий LSN лидера WAL. Значение по умолчанию — -1; при установке значения 0 или ниже Patroni не будет предпринимать действия по замене синхронной нездоровой реплики. Установите значение достаточно высоким, чтобы Patroni не заменял синхронную реплику слишком часто при высокой нагрузке на транзакции.
- **max_timelines_history**: максимальное количество элементов истории временной шкалы, сохраняемых в DCS. Значение по умолчанию: 0. При установке в 0 история сохраняется полностью в DCS.
- **primary_start_timeout**: количество времени, в течение которого первичный сервер может восстановиться после сбоев, прежде чем будет запущено переключение при отказе (в секундах). Значение по умолчанию — 300 секунд. При установке значения 0 переключение при отказе выполняется немедленно после обнаружения сбоя, если это возможно. При асинхронной репликации переключение при отказе может привести к потере транзакций. Максимальное время переключения при отказе первичного сервера: loop_wait + primary_start_timeout + loop_wait, если primary_start_timeout не равно нулю; в противном случае — loop_wait. Установите значение с учётом баланса между надёжностью и доступностью.
- **primary_stop_timeout**: Количество секунд, в течение которых Patroni может ждать остановку Postgres, действует только при включённом synchronous_mode. При значении \> 0 и включённом synchronous_mode Patroni отправляет SIGKILL постмейстеру, если операция остановки выполняется дольше значения, установленного в primary_stop_timeout. Установите значение с учётом компромисса между надёжностью и доступностью. Если параметр не задан или установлен \<= 0, primary_stop_timeout не применяется.
- **synchronous_mode**: включает режим синхронной репликации. Допустимые значения: `off`, `on`, `quorum`. В этом режиме лидер отвечает за управление `synchronous_standby_names`, и в выборе лидера могут участвовать только последний известный лидер или одна из синхронных реплик. Режим синхронной репликации гарантирует, что успешно завершённые транзакции не будут потеряны при переключении при отказе, ценой потери доступности для записи, когда Patroni не может обеспечить неотказоустойчивость транзакций. Подробности см. в документации по режимам [репликации](/ru/docs/patroni/replication_modes#replication_modes).
- **synchronous_mode_strict**: запрещает отключение синхронной репликации при отсутствии синхронных реплик, блокируя все операции записи клиента на первичном сервере. При установке этого параметра и отсутствии доступной реплики, которая ведёт потоковую передачу, Patroni сохраняет `synchronous_standby_names`, указывающий на последний известный синхронный узел из ключа `/sync` DCS, либо использует внутренний заполнитель `__patroni_strict_sync_replica_placeholder__`, если до этого не существовало состояния синхронизации. Узел `name` в `patroni.yaml` не должен быть установлен в `__patroni_strict_sync_replica_placeholder__`. Подробности см. в документации по режимам [репликации](/ru/docs/patroni/replication_modes#replication_modes).
- **synchronous_node_count**: если включена опция [synchronous_mode](/ru/docs/patroni/replication_modes#synchronous_mode), этот параметр используется Patroni для управления точным количеством синхронных реплик и корректировки состояния в DCS и параметра `synchronous_standby_names` в PostgreSQL при подключении и отключении участников. Если значение параметра превышает количество допустимых узлов, оно будет автоматически скорректировано. Значение по умолчанию — `1`.
- **failsafe_mode**: включает [отказоустойчивый режим DCS](/ru/docs/patroni/dcs_failsafe_mode#dcs_failsafe_mode). По умолчанию — `false`.
- **postgresql**:
  - **use_pg_rewind**: использовать ли pg_rewind. Значение по умолчанию — `false`. Обратите внимание, что кластер должен быть инициализирован с использованием `data page checksums` (опция `--data-checksums` для `initdb`) и/или должно быть установлено значение `wal_log_hints`, равное `on`, иначе `pg_rewind` не будет работать.
  - **use_slots**: использовать ли слоты репликации. По умолчанию `true` при PostgreSQL 9.4+.
  - **recovery_conf**: дополнительные параметры конфигурации, записываемые в recovery.conf при настройке последователя. В PostgreSQL 12 больше нет recovery.conf, однако вы можете продолжать использовать этот раздел, поскольку Patroni обрабатывает его прозрачно.
  - **parameters**: параметры конфигурации (GUC) для Postgres в формате `{max_connections: 100, wal_level: "replica", max_wal_senders: 10, wal_log_hints: "on"}`. Многие из них необходимы для работы репликации.
  - **parameters_primary**: (необязательно) переопределения параметров, специфичных для роли, для первичного сервера. Эти значения объединяются с базовыми **parameters** и переопределяют их.
  - **parameters_replica**: (необязательно) переопределения параметров, специфичных для роли реплики. Эти значения объединяются с базовыми **parameters** и переопределяют их.
  - **parameters_standby_leader**: (необязательно) переопределения параметров, специфичных для роли, для standby_leader. Эти значения объединяются с базовыми **parameters** и переопределяют их.
  - **pg_hba**: список строк, которые Patroni будет использовать для генерации `pg_hba.conf`. Patroni игнорирует этот параметр, если параметр PostgreSQL `hba_file` установлен в непо умолчанию значение.
    - **- host all all 0.0.0.0/0 md5**
    - **- host replication replicator 127.0.0.1/32 md5**: Такая строка обязательна для репликации.
  - **pg_hba_primary**: (необязательно) записи pg_hba, специфичные для роли, для первичного сервера. Они полностью заменяют **pg_hba** (слияние не производится). Если не определены, используется **pg_hba**.
  - **pg_hba_replica**: (необязательно) записи pg_hba, специфичные для роли, для реплики. Они полностью заменяют **pg_hba** (слияние не происходит). Если не определены, используется **pg_hba**.
  - **pg_hba_standby_leader**: (необязательно) записи pg_hba, специфичные для роли, для standby_leader. Они полностью заменяют **pg_hba** (слияние не происходит). Если не определены, используется **pg_hba**.
  - **pg_ident**: список строк, которые Patroni будет использовать для генерации `pg_ident.conf`. Patroni игнорирует этот параметр, если параметр PostgreSQL `ident_file` установлен в непо умолчанию значение.
    - **- mapname1 systemname1 pguser1**
    - **- mapname1 systemname2 pguser2**
  - **pg_ident_primary**: (необязательно) записи pg_ident, специфичные для роли, для первичного сервера. Они полностью заменяют **pg_ident** (слияние не происходит). Если не определены, используется **pg_ident**.
  - **pg_ident_replica**: (необязательно) записи pg_ident, специфичные для роли, для реплики. Они полностью заменяют **pg_ident** (слияние не происходит). Если не определены, используется **pg_ident**.
  - **pg_ident_standby_leader**: (необязательно) записи pg_ident, специфичные для роли, для standby_leader. Они полностью заменяют **pg_ident** (слияние не происходит). Если не определены, используется **pg_ident**.
- **standby_cluster**: если этот раздел определён, необходимо выполнить начальную инициализацию резервного сервера кластера.
  - **host**: адрес удалённого узла
  - **port**: порт удалённого узла
  - **primary_slot_name**: указывает, какой slot на удаленном узле использовать для репликации. Этот параметр необязателен, значение по умолчанию извлекается из имени экземпляра (см. функцию `slot_name_from_member_name`).
  - **create_replica_methods**: упорядоченный список методов, которые могут быть использованы для начальной инициализации резервного сервера из удалённого первичного сервера, может отличаться от списка, определённого в [postgresql_settings](/ru/docs/patroni/config/yaml#postgresql_settings)
  - **restore_command**: команда для восстановления записей WAL с удалённого первичного сервера на узлы резервного кластера, может отличаться от списка, определённого в [postgresql_settings](/ru/docs/patroni/config/yaml#postgresql_settings)
  - **archive_cleanup_command**: команда очистки для резервного сервера-лидера
  - **recovery_min_apply_delay**: время ожидания перед фактическим применением записей WAL на резервном сервере, который является лидером
- **member_slots_ttl**: время удержания физических слотов репликации для реплик при их остановке. Значение по умолчанию: `30min`. Установите значение `0`, если хотите сохранить прежнее поведение (когда ключ участника истекает в DCS, слот удаляется немедленно). Данная функция работает только начиная с PostgreSQL 11.
- **slots**: определяет постоянные слоты репликации. Эти слоты сохраняются при плановом переключении/переключении при отказе. Постоянные слоты, которые отсутствуют, будут созданы Patroni. Начиная с PostgreSQL 11 постоянные физические слоты создаются на всех узлах, и их позиция обновляется каждые **loop_wait** секунд. Для версий PostgreSQL, более старых, чем 11, постоянные физические слоты репликации поддерживаются только на текущем первичном сервере. Логические слоты копируются с первичного сервера на резервный сервер при перезапуске, после чего их позиция обновляется каждые **loop_wait** секунд (при необходимости). Копирование файлов логических слотов выполняется через соединение `libpq` с использованием либо параметров rewind, либо суперпользователя (см. раздел **postgresql.authentication**). Всегда существует вероятность, что позиция логического слота на реплике немного отстает от бывшего первичного сервера, поэтому приложение должно быть готово к тому, что некоторые сообщения могут быть получены повторно после переключения при отказе. Самый простой способ решения — отслеживание `confirmed_flush_lsn`. Включение постоянных слотов репликации требует установки **postgresql.use_slots** в значение `true`. Если определены постоянные логические слоты репликации, Patroni автоматически включает `hot_standby_feedback`. Поскольку переключение при отказе логических слотов репликации является небезопасным в PostgreSQL 9.6 и более старых версиях, а версия PostgreSQL 10 отсутствует некоторые важные функции, эта функция работает только с PostgreSQL 11 и новее.
  - **my_slot_name**: имя постоянного слота репликации. Если имя постоянного слота совпадает с именем текущего узла, он не будет создан на этом узле. Если добавить постоянный физический слот репликации, имя которого совпадает с именем участника Patroni, Patroni обеспечит сохранение этого слота даже в случае, когда соответствующий участник станет недоступным, что в обычных условиях привело бы к удалению слота Patroni. Хотя это может быть полезно в некоторых ситуациях, например, при необходимости сохранения слотов репликации участников во время временных сбоев или при импорте существующих участников в новый кластер Patroni (см. [Преобразование автономного узла в кластер Patroni](/ru/docs/patroni/existing_data#existing_data) для подробностей), оператору следует проявлять осторожность, чтобы избежать сохранения таких конфликтов имён в DCS, когда слот больше не требуется, поскольку это может повлиять на нормальную работу Patroni.
    - **type**: тип слота. Может быть `physical` или `logical`. Если слот логический, необходимо дополнительно задать `database` и `plugin`. Если слот физический, можно необязательно задать `cluster_type`.
    - **database**: имя базы данных, в которой должны быть созданы логические слоты.
    - **plugin**: имя плагина для логического слота.
    - **cluster_type**: тип кластера (`primary` или `standby`), на котором должен быть создан слот, иначе слот не будет создан или будет удалён уже существующий слот.
- **ignore_slots**: список наборов свойств слота репликации, для которых Patroni должен игнорировать совпадающие слоты. Эта конфигурация/функция полезна в тех случаях, когда некоторые слоты репликации управляются вне Patroni. Любое подмножество совпадающих свойств приведёт к игнорированию слота.
  - **name**: имя слота репликации.
  - **type**: тип слота. Может быть `physical` или `logical`. Если слот логический, можно дополнительно задать `database` и/или `plugin`.
  - **database**: имя базы данных (при совпадении с slot `logical`).
  - **plugin**: плагин логического декодирования (при совпадении с slot `logical`).

Примечание: **slots** — это хешмапа, а **ignore_slots** — массив. Например:

```yaml
slots:
  permanent_logical_slot_name:
    type: logical
    database: my_db
    plugin: test_decoding
  permanent_physical_slot_name:
    type: physical
  ...
ignore_slots:
  - name: ignored_logical_slot_name
    type: logical
    database: my_db
    plugin: test_decoding
  - name: ignored_physical_slot_name
    type: physical
  ...
```

Примечание: при работе с PostgreSQL версии 11 или новее Patroni поддерживает физические слоты репликации на всех узлах, которые потенциально могут стать лидером, чтобы реплики сохраняли зарезервированными WAL сегментов, если они потребуются другим узлам. В случае, если узел отсутствует и его ключ участника в DCS истек, соответствующий слот репликации удаляется после `member_slots_ttl` (значение по умолчанию `30min`). Вы можете увеличить или уменьшить срок хранения в зависимости от своих потребностей. Альтернативно, если топология кластера статична (фиксированное количество узлов, имена которых никогда не меняются), можно настроить постоянные физические слоты репликации с именами, соответствующими именам узлов, чтобы избежать удаления слотов и повторного использования файлов WAL при временной недоступности реплики:

```yaml
slots:
  node_name1:
    type: physical
  node_name2:
    type: physical
  node_name3:
    type: physical
  ...
```

> [!WARNING]
> Постоянные слоты репликации синхронизируются только от `primary`/`standby_leader` к репликам. Это означает, что приложения должны использовать их только на лидере. Использование их на репликах приведёт к неограниченному росту `pg_wal` на всех остальных узлах кластера. Исключением из этого правила являются физические слоты, соответствующие именам участников Patroni (создаваемые и поддерживаемые Patroni). Они синхронизируются между всеми узлами, поскольку используются для репликации между ними.

> [!WARNING]
> Установка тега `nostream` на резервном сервере отключает копирование и синхронизацию постоянных слотов репликации на самом узле и на всех его каскадных репликах, если таковые имеются.

---

Обратные ссылки:

- [Поддержка Citus](/ru/docs/patroni/citus/)
- [Patroni конфигурация](/ru/docs/patroni/config/)
- [YAML Конфигурация](/ru/docs/patroni/config/yaml/)
- [DCS Отказоустойчивый режим](/ru/docs/patroni/dcs_failsafe_mode/)
- [Преобразование существующего кластера](/ru/docs/patroni/existing_data/)
- [Часто задаваемые вопросы](/ru/docs/patroni/faq/)
- [HA-кластер с несколькими центрами обработки данных](/ru/docs/patroni/ha_multi_dc/)
- [Примечания к выпускам](/ru/docs/patroni/releases/)
- [Режимы репликации](/ru/docs/patroni/replication_modes/)
- [Patroni REST API](/ru/docs/patroni/rest_api/)
