Параметры категории Репликация

В этом документе описаны параметры системной конфигурации в категории Репликация.

Предупреждение!
Для обеспечения стабильности и безопасности системы ручное изменение этих параметров должно выполняться с осторожностью.

Эти настройки управляют поведением потоковой репликации. Сервер может выступать в роли первичного (мастера) или резервного. Первичный сервер отправляет данные, а резервный всегда является получателем реплицируемых данных. Эти параметры в основном используются как на отправляющих серверах, так и на резервных, хотя некоторые из них имеют смысл только на мастере.


Отправляющие серверы

Параметры в этом разделе должны быть заданы на Мастере и на любом резервном сервере, который будет отправлять данные репликации.

max_replication_slots


Задаёт максимальное количество репликационных слотов, которые сервер может поддерживать.

  • Этот параметр можно задать только при запуске сервера.
  • Установка значения, меньшего текущего числа существующих репликационных слотов, препятствует запуску сервера.
  • Для включения использования репликационных слотов параметр wal_level должен быть установлен в значение replica или выше.
Тип данных Значение по умолчанию Диапазон Категория
int 10 1 ~ 262143 segments; system; restart

max_slot_wal_keep_size


Задаёт максимальный размер WAL (в МБ), который могут сохранять репликационные слоты.

  • Если на диске занимаемое место WAL достигает значения этого параметра, репликационный слот помечается как неисправный, а сегменты освобождаются для удаления или повторного использования.
  • Значение по умолчанию — -1, что отключает эту функцию.
Тип данных Значение по умолчанию Диапазон Категория
int -1 -1 ~ INT_MAX/1024 segments; system; reload

max_wal_senders


Задаёт максимальное количество одновременных соединений от резервных серверов или клиентов базового резервного копирования потоковой передачи (т.е. максимальное количество одновременно работающих процессов WAL sender).

  • Значение 0 отключает репликацию.
  • Внезапные отключения клиентов потоковой передачи могут оставлять изолированные слоты соединений (до истечения таймаута), поэтому этот параметр следует устанавливать немного выше максимального числа клиентских соединений, чтобы отключённые клиенты могли немедленно переподключиться.
  • Этот параметр можно задать только при запуске сервера. Кроме того, параметр wal_level должен быть установлен в значение replica или выше, чтобы разрешить соединения от резервных серверов.
  • При запуске резервного сервера необходимо установить этот параметр на то же или более высокое значение, чем на мастере. В противном случае запросы на резервном сервере не будут разрешены.
Тип данных Значение по умолчанию Диапазон Категория
int 10 0 ~ 262143 segments; system; restart

track_commit_timestamp


Включает отслеживание временных меток фиксации транзакций.

Тип данных Значение по умолчанию Категория
boolean off segments; system; restart

wal_init_zero


При установке в значение on заполняет новые файлы WAL нулями.

  • На некоторых файловых системах это гарантирует выделение места для файла до записи записей WAL.
  • Однако файловые системы с Copy-On-Write (COW) не получают выгоды от этой настройки, поэтому в таких случаях параметр пропускает ненужную работу.
  • Если установлено значение off, при создании файла записывается только последний байт, придавая файлу ожидаемый размер.
Тип данных Значение по умолчанию Категория
boolean on segments; session; reload; superuser

wal_keep_segments


Задаёт минимальное количество предыдущих сегментов файлов журнала, которые следует сохранять в каталоге pg_wal, на случай, если резервный сервер потребует их для потоковой репликации.

  • Каждый сегмент обычно имеет размер 16 МБ. Если подключённый резервный сервер отстаёт более чем на wal_keep_segments сегментов, отправляющий сервер может удалить сегмент WAL, который всё ещё нужен резервному серверу, разорвав соединение репликации. В конечном итоге соединение на стороне получателя также завершится сбоем (хотя при использовании архивирования WAL резервный сервер может восстановиться, получив сегменты из архива).
  • Этот параметр задаёт только минимальное количество сохраняемых сегментов в pg_wal; система может сохранять дополнительные сегменты для архивирования WAL или восстановления после контрольной точки.
  • Когда этот параметр равен 0 (по умолчанию), система не сохраняет дополнительных сегментов для резервных серверов. Таким образом, количество старых сегментов WAL, доступных резервному серверу, зависит от положения последней контрольной точки и состояния архивирования WAL.
Тип данных Значение по умолчанию Диапазон Категория
int 64 0 ~ INT_MAX segments; system; reload

wal_recycle


Включает повторное использование файлов WAL.

  • При установке в значение on файлы WAL переиспользуются путём переименования, чтобы избежать создания новых файлов.
  • На файловых системах с COW создание новых файлов может быть быстрее, поэтому этот параметр автоматически отключается.
Тип данных Значение по умолчанию Категория
boolean on segments; session; reload; superuser

wal_sender_timeout


Завершает репликационные соединения, неактивные дольше указанного времени (в миллисекундах).

  • Это помогает отправляющему серверу обнаруживать сбои резервных серверов или сетевые прерывания.
  • Значение 0 отключает таймаут.
  • Для географически распределённых кластеров использование разных значений для разных локаций обеспечивает большую гибкость в управлении кластером. Меньшие значения помогают быстрее обнаруживать сбои для резервных серверов с низкой задержкой сети; большие значения позволяют лучше оценивать состояние резервных серверов с высокой задержкой соединения.
  • Значение по умолчанию — 300000毫秒, то есть 5 минут.
Тип данных Значение по умолчанию Диапазон Категория
int 300000 0 ~ INT_MAX segments; session; reload; superuser


Мастер-сервер

Эти настройки игнорируются на резервных серверах.

Примечание!
Помимо этих параметров, на Мастере необходимо установить соответствующий параметр wal_level, а при необходимости включить архивирование WAL.


synchronous_standby_names


Задаёт список резервных серверов, поддерживающих синхронную репликацию.

  • Один или несколько резервных серверов могут быть активными. Как только эти резервные серверы подтверждают получение данных, ожидающие транзакции могут быть разрешены к выполнению.
  • Синхронный резервный сервер — это сервер, имя которого появляется рано в этом списке, в настоящее время подключён и потоково передаёт данные в реальном времени. Указание нескольких синхронных резервных серверов обеспечивает высокую доступность и предотвращает потерю данных.
  • Имя, используемое для этой цели, — это application_name, заданное в информации подключения. Элементы списка разделяются запятыми.
  • Для физических резервных серверов это должно быть задано в конфигурации primary_conninfo. Если не задано, по умолчанию используется cluster_name, иначе walreceiver.
  • Для логической репликации его можно задать в информации подключения подписки. Для других потребителей репликации обратитесь к их документации.
  • Специальная запись '*' соответствует любому имени резервного сервера.

Этот параметр использует один из следующих синтаксисов для указания списка резервных серверов:

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]
  • Где num_sync — количество синхронных резервных серверов, ответы от которых транзакция должна дождаться, а standby_name — имя резервного сервера. FIRST и ANY определяют, как выбираются синхронные резервные серверы из списка.
  • Ключевое слово FIRST с num_sync задаёт приоритетную синхронную репликацию. Фиксация транзакций ожидает, пока записи WAL не будут реплицированы на num_sync резервных сервера с наивысшим приоритетом, выбранных из списка. Например, FIRST 3 (s1, s2, s3, s4) заставляет каждую фиксацию ожидать ответов от трёх резервных серверов с наивысшим приоритетом, выбранных из s1, s2, s3 и s4.
  • Резервные серверы, появляющиеся ранее в списке, имеют более высокий приоритет и считаются синхронными. Остальные — потенциальные резервные серверы. Если текущий синхронный резервный сервер отключается, он немедленно заменяется следующим по приоритету. Ключевое слово FIRST является необязательным.
  • Ключевое слово ANY с num_sync задаёт кворумную синхронную репликацию. Фиксации ожидает, пока записи WAL не будут реплицированы как минимум на num_sync из перечисленных резервных серверов. Например, ANY 3 (s1, s2, s3, s4) позволяет фиксации продолжиться после получения ответов от любых трёх из s1, s2, s3 и s4.
  • FIRST и ANY не чувствительны к регистру. Если используются как имена резервных серверов, они должны быть заключены в двойные кавычки.
  • Третий синтаксис эквивалентен первому синтаксису с FIRST и num_sync, равными 1. Например, FIRST 1 (s1, s2) означает то же самое, что и s1, s2: либо s1, либо s2 будет выбран в качестве синхронного резервного сервера.
  • Нет механизма, обеспечивающего уникальность имён резервных серверов. Если существуют дубликаты, один из совпадающих резервных серверов будет рассматриваться как имеющий более высокий приоритет, но не определено, какой именно.
  • Примечание: Каждый standby_name должен быть допустимым SQL-идентификатором, если только это не *. Двойные кавычки могут использоваться при необходимости. Однако сравнение standby_name и имён приложений резервных серверов не чувствительно к регистру (независимо от кавычек).
  • Если имена резервных серверов не указаны, синхронная репликация не может быть включена, и фиксации транзакций не будут ждать репликации. Это значение по умолчанию. Даже при включённой синхронной репликации отдельные транзакции могут быть настроены на отсутствие ожидания путём установки параметра synchronous_commit в значение local или off.
Тип данных Значение по умолчанию Категория
string segments; system; reload

vacuum_defer_cleanup_age


Задаёт, на сколько (в количестве транзакций) следует откладывать очистку мёртвых версий строк в VACUUM и HOT.

  • Значение по умолчанию — 0 транзакций, что означает, что мёртвые строки очищаются как можно быстрее — как только они больше не видны ни одной открытой транзакции.
  • На мастере, поддерживающем горячий резервный сервер, возможно, стоит установить это значение в ненулевое, чтобы дать больше времени для завершения запросов на резервном сервере без конфликтов из-за ранней очистки строк. Однако, поскольку это значение измеряется в транзакциях записи на мастере, трудно предсказать точное дополнительное время, доступное для запросов на резервном сервере.
  • Вы также можете рассмотреть возможность установки hot_standby_feedback на резервном сервере в качестве альтернативы.
  • Это не препятствует очистке строк, достигших возраста, указанного в old_snapshot_threshold.
Тип данных Значение по умолчанию Диапазон Категория
int 0 0 ~ 1000000 segments; system; reload


Резервные серверы

Эти настройки игнорируются на мастер-сервере.

hot_standby


Задаёт, можно ли выполнять подключения и запросы во время восстановления](https://www.postgresql.org/docs/12/hot-standby.html).

  • Этот параметр можно задать только при запуске сервера.
  • Он действителен только во время архивного восстановления или режима резервного сервера.
Тип данных Значение по умолчанию Категория
boolean off segments; system; restart

hot_standby_feedback


Задаёт, отправляет ли горячий резервный сервер обратную связь мастеру или вышестоящему резервному серверу о текущих выполняемых запросах на резервном сервере.

  • Это может помочь избежать отмены запросов из-за вакуумирования, но может вызвать раздувание базы данных на мастере при определённых нагрузках.
  • Сообщения обратной связи отправляются не чаще одного раза за цикл wal_receiver_status_interval.
  • При каскадной репликации обратная связь передаётся вверх по цепочке до достижения мастера. Резервные серверы только пересылают обратную связь и не предпринимают никаких других действий при её получении.
  • Эта настройка не переопределяет поведение old_snapshot_threshold на мастере. Снимок на резервном сервере, превышающий порог возраста мастера, может стать недействительным, что приведёт к отмене транзакции на резервном сервере. Это связано с тем, что old_snapshot_threshold устанавливает абсолютный предел, насколько долго могут существовать мёртвые строки, предотвращая сбои из-за конфигурации резервного сервера.
Тип данных Значение по умолчанию Категория
boolean off segments; system; reload

max_standby_archive_delay


При активном горячем резервном сервере этот параметр задаёт максимальное время (в миллисекундах), в течение которого резервный сервер ждёт, прежде чем отменить запросы, конфликтующие с записями WAL, которые собираются применить. См. Обработка конфликтов запросов.

  • -1 применяется, когда данные WAL читаются из архивов WAL (а не из текущих WAL).
  • Если единица не указана, значение задаётся в миллисекундах.
  • Значение max_standby_archive_delay позволяет резервному серверу ждать неограниченно долго, пока не завершится конфликтующий запрос.
  • Примечание: max_standby_streaming_delay — это не максимальное время, в течение которого один запрос может выполняться до отмены; это максимальное общее время, разрешённое для применения любого сегмента WAL. Таким образом, если ранний запрос вызывает значительную задержку, последующие конфликтующие запросы получат меньше времени.
Тип данных Значение по умолчанию Диапазон Категория
int 30000 -1 ~ INT_MAX segments; system; reload

max_standby_streaming_delay


При активном горячем резервном сервере этот параметр задаёт максимальное время (в миллисекундах), в течение которого резервный сервер ждёт, прежде чем отменить запросы, конфликтующие с записями WAL, которые собираются применить. См. Обработка конфликтов запросов.

  • max_standby_streaming_delay применяется, когда данные WAL получены через потоковую репликацию.
  • Если единица не указана, значение задаётся в миллисекундах.
  • Значение -1 позволяет резервному серверу ждать неограниченно долго, пока не завершится конфликтующий запрос.
  • Примечание: Этот параметр не является максимальным временем, в течение которого один запрос может выполняться до отмены; это максимальное общее время, разрешённое между получением данных WAL от мастера и их применением. Если запрос вызывает значительную задержку, последующие конфликтующие запросы получат меньше времени, пока резервный сервер не догонит.
Тип данных Значение по умолчанию Диапазон Категория
int 30000 -1 ~ INT_MAX segments; system; reload

primary_conninfo


Указывает строку подключения, используемую резервным сервером для подключения к серверу-источнику.

  • Если какой-либо параметр не указан в строке, проверяется соответствующая переменная окружения. Если переменная окружения также не установлена, используется значение по умолчанию.
  • Строка подключения должна содержать хост (или адрес) и порт (если отличается от порта по умолчанию резервного сервера) сервера-источника, а также имя пользователя, соответствующее роли с необходимыми правами на сервере-источнике.
  • Если сервер-источник требует аутентификации по паролю, пароль также должен быть указан. Его можно включить непосредственно в строку primary_conninfo или в отдельный файл ~/.pgpass на резервном сервере (используя replication в качестве имени базы данных).
  • Не указывайте имя базы данных в строке primary_conninfo.
  • Этот параметр можно задать только при запуске сервера. Он не имеет эффекта, если сервер не находится в режиме резервного копирования.
Тип данных Значение по умолчанию Категория
string segments; system; restart; superuser

primary_slot_name


Опционально указывает существующий репликационный слот, который следует использовать при подключении через потоковую репликацию, чтобы управлять удалением ресурсов на узле-источнике.

  • Этот параметр можно задать только при запуске сервера.
  • Этот параметр не оказывает эффекта, если primary_conninfo не установлен.
Тип данных Значение по умолчанию Категория
string segments; system; restart

promote_trigger_file


Указывает файл триггера, существование которого завершает восстановление на резервном сервере.

  • Даже без установки этого параметра вы можете перевести резервный сервер в режим основного с помощью pg_ctl promote или вызовом pg_promote.
Тип данных Значение по умолчанию Категория
string segments; system; reload

recovery_min_apply_delay


По умолчанию резервный сервер применяет записи WAL от сервера-источника как можно быстрее.

  • Задержанная копия данных может быть полезна для исправления ошибок потери данных. Этот параметр позволяет системе задерживать восстановление на указанное время. Например, установка этого параметра в 5 мин означает, что транзакция будет воспроизведена на резервном сервере только тогда, когда системное время резервного сервера превысит время фиксации, сообщённое мастером, как минимум на 5 минут.
  • Если единица измерения не указана, значение задаётся в миллисекундах.
  • Задержка репликации между серверами может превышать значение этого параметра — в этом случае дополнительная задержка не добавляется. Примечание: Задержка рассчитывается на основе временной метки, когда WAL был записан на мастере, и текущего времени на резервном сервере. Задержки сети или каскадной репликации могут значительно сократить фактическое время ожидания.
  • Если системные часы на мастере и резервном сервере не синхронизированы, восстановление может применять записи раньше ожидаемого. Однако это не является серьёзной проблемой, поскольку преимущество этого параметра обычно значительно превышает рассогласование времени между серверами.
  • Задержка применяется только к записям WAL для фиксации транзакций. Другие записи воспроизводятся как можно быстрее. Это безопасно, потому что правила видимости MVCC гарантируют, что их эффекты не станут видимыми до применения соответствующей записи фиксации.
  • Задержка включается, когда восстанавливаемая база данных достигает согласованного состояния, и продолжается до тех пор, пока резервный сервер не будет переведён в режим основного или не будет активирован триггер. После этого восстановление завершается, и дальнейшая задержка не применяется.
  • Примечание: Этот параметр предназначен для использования с потоковой репликацией. Однако если он установлен, он применяется во всех случаях, кроме аварийного восстановления. Использование этой функции также задерживает hot_standby_feedback, что может привести к раздуванию мастера — используйте с осторожностью, если оба параметра включены.
  • Значение по умолчанию — 0, что означает отсутствие задержки.

Примечание!
При установке synchronous_commit в remote_apply синхронная репликация受到影响 — каждый COMMIT должен ждать завершения задержки перед применением.

Тип данных Значение по умолчанию Диапазон Категория
int 0 0 ~ INT_MAX segments; system; reload

wal_receiver_status_interval


Задаёт минимальную частоту (в секундах), с которой процесс WAL-приёмника на резервном сервере отправляет информацию о прогрессе репликации на мастер или промежуточный резервный сервер.

  • Резервный сервер сообщает последнюю позицию WAL, записанную, сброшенную на диск и применённую.
  • Этот параметр задаёт максимальное время между отчётами о статусе. Обновления статуса отправляются при каждом изменении позиции записи или сброса, либо не реже, чем указано в этом параметре. Таким образом, позиция применения может немного отставать от реальности.
  • Установка этого параметра в 0 полностью отключает обновления статуса.
Тип данных Значение по умолчанию Диапазон Категория
int 10 0 ~ INT_MAX/1000 segments; system; reload

wal_receiver_timeout


Завершает репликационные соединения, которые были неактивны дольше указанного времени (в миллисекундах).

  • Это помогает резервному серверу обнаруживать сбои мастера или разрывы сети.
  • Если единица измерения не указана, значение задаётся в миллисекундах.
  • Значение 0 отключает таймаут.
Тип данных Значение по умолчанию Диапазон Категория
int 60000 0 ~ INT_MAX segments; system; reload

wal_retrieve_retry_interval


Указывает, сколько миллисекунд резервный сервер должен ждать перед повторной попыткой получения данных WAL, если данные недоступны ни от одного источника (потоковая репликация, локальный pg_wal или архив WAL).

  • Этот параметр настраивает, сколько времени восстанавливающийся узел ждёт появления новых данных WAL. Например, при архивном восстановлении уменьшение этого значения делает восстановление более агрессивным в обнаружении новых файлов WAL. На системах с низкой активностью WAL увеличение этого значения снижает количество запросов к архиву WAL, что полезно в средах, таких как облако, где важна временная координация доступа к инфраструктуре.
Тип данных Значение по умолчанию Диапазон Категория
int 5000 1 ~ INT_MAX segments; system; reload


Подписчики

Эти параметры управляют поведением подписчиков логической репликации. Их значения на издателе не имеют значения.

Примечание!
Параметры конфигурации wal_receiver_timeout, wal_receiver_status_interval и wal_retrieve_retry_interval также влияют на рабочие процессы логической репликации.

max_logical_replication_workers


Задаёт максимальное количество рабочих процессов логической репликации. Это включает как рабочие процессы применения, так и рабочие процессы синхронизации таблиц.

  • Рабочие процессы логической репликации берутся из пула, определённого параметром max_worker_processes.
Тип данных Значение по умолчанию Диапазон Категория
int 4 0 ~ 262143 segments; system; restart

max_sync_workers_per_subscription


Задаёт максимальное количество рабочих процессов синхронизации на одну подписку.

  • Этот параметр управляет параллелизмом начальной копии данных при инициализации подписки или при добавлении новых таблиц.
  • В настоящее время разрешён только один рабочий процесс синхронизации на таблицу.
  • Рабочие процессы синхронизации берутся из пула, определённого параметром max_logical_replication_workers.
Тип данных Значение по умолчанию Диапазон Категория
int 2 0 ~ 262143 segments; system; reload