18.6. Репликация#
18.6. Репликация #
Эти настройки управляют поведением встроенной функции потоковой репликации (см. Раздел 25.2.5), и встроенной функции логической репликации (см. Глава 29).
Для потоковой репликации серверы будут либо основными, либо резервными. Основные серверы могут отправлять данные, в то время как резервные всегда являются получателями реплицированных данных. Когда используется каскадная репликация (см. Раздел 25.2.7), резервные серверы могут быть как отправителями, так и получателями. Параметры в основном предназначены для отправляющих и резервных серверов, хотя некоторые параметры имеют значение только на основном сервере. Настройки могут различаться в кластере без проблем, если это необходимо.
Для логической репликации, издатели
(серверы, которые выполняют CREATE PUBLICATION
)
реплицируют данные на подписчиков
(серверы, которые выполняют CREATE SUBSCRIPTION
).
Серверы могут быть одновременно и издателями, и подписчиками. Обратите внимание,
что в следующих разделах издатели упоминаются как "отправители". Для получения
дополнительной информации о настройках конфигурации логической репликации обратитесь к
Раздел 29.10.
18.6.1. Отправляющие серверы #
Эти параметры могут быть установлены на любом сервере, который должен отправлять данные репликации на один или несколько серверов-стендбай. Основной сервер всегда является отправляющим сервером, поэтому эти параметры всегда должны быть установлены на основном сервере. Роль и значение этих параметров не изменяются после того, как стендбай становится основным.
max_wal_senders
(integer
) #Определяет максимальное количество одновременных соединений от серверов-реплик или клиентов потокового резервного копирования базы данных (т.е. максимальное количество одновременно работающих процессов отправки WAL). Значение по умолчанию -
10
. Значение0
означает отключение репликации. Внезапное отключение потокового клиента может оставить за собой неиспользуемый слот соединения до достижения тайм-аута, поэтому этот параметр должен быть установлен немного выше максимального количества ожидаемых клиентов, чтобы отключенные клиенты могли сразу же повторно подключиться. Этот параметр может быть установлен только при запуске сервера. Кроме того, параметрwal_level
должен быть установлен на значениеreplica
или выше, чтобы разрешить соединения от серверов-реплик.При работе с резервным сервером необходимо установить этот параметр на такое же или более высокое значение, чем на основном сервере. В противном случае запросы на резервном сервере не будут разрешены.
max_replication_slots
(integer
) #Определяет максимальное количество слотов репликации (см. Раздел 25.2.6) , которое сервер может поддерживать. По умолчанию значение равно 10. Этот параметр может быть установлен только при запуске сервера. Установка значения меньше количества существующих слотов репликации приведет к невозможности запуска сервера. Кроме того, параметр
wal_level
должен быть установлен на значениеreplica
или выше, чтобы использовать слоты репликации.Обратите внимание, что этот параметр также применяется на стороне подписчика, но с другим значением.
wal_keep_size
(integer
) #Указывает минимальный размер прошлых файлов WAL, хранящихся в
pg_wal
каталоге, на случай, если резервному серверу потребуется их получить для потоковой репликации. Если резервный сервер, подключенный к отправляющему серверу, отстает более чем наwal_keep_size
мегабайт, отправляющий сервер может удалить сегмент WAL, который все еще нужен резервному серверу, в этом случае соединение репликации будет разорвано. В конечном итоге, нижестоящие соединения также потерпят неудачу в результате. (Однако, резервный сервер может восстановиться, получив сегмент из архива, если используется архивирование WAL.)Это устанавливает только минимальный размер сегментов, сохраняемых в
pg_wal
; система может потребоваться сохранить больше сегментов для архивирования WAL или для восстановления после контрольной точки. Еслиwal_keep_size
равно нулю (по умолчанию), система не сохраняет дополнительные сегменты для целей ожидания, поэтому количество старых сегментов WAL, доступных для серверов ожидания, является функцией расположения предыдущей контрольной точки и статуса архивирования WAL. Если это значение указано без единиц измерения, оно принимается в мегабайтах. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.max_slot_wal_keep_size
(integer
) #Укажите максимальный размер файлов журнала предзаписи, которые разрешено сохранять слотам репликации в каталоге
pg_wal
во время контрольной точки. Еслиmax_slot_wal_keep_size
равно -1 (по умолчанию), слоты репликации могут сохранять неограниченное количество файлов журнала предзаписи. В противном случае, если restart_lsn слота репликации отстает от текущего LSN на более чем заданный размер, стендбай, использующий этот слот, может больше не иметь возможности продолжать репликацию из-за удаления необходимых файлов журнала предзаписи. Вы можете увидеть доступность файлов журнала предзаписи для слотов репликации в представлении pg_replication_slots. Если это значение указано без единиц измерения, оно считается в мегабайтах. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.wal_sender_timeout
(integer
) #Прекращение соединений репликации, неактивных в течение более указанного времени. Это полезно для отправляющего сервера для обнаружения сбоя резервного сервера или сбоя сети. Если это значение указано без единиц измерения, оно считается в миллисекундах. Значение по умолчанию - 60 секунд. Значение ноль отключает механизм тайм-аута.
С кластером, распределенным по нескольким географическим местоположениям, использование разных значений для каждого местоположения приносит большую гибкость в управлении кластером. Меньшее значение полезно для более быстрого обнаружения сбоя с резервным экземпляром, имеющим низколатентное сетевое подключение, а большее значение помогает лучше оценить состояние резервного экземпляра, если он находится в удаленном месте с высоколатентным сетевым подключением.
track_commit_timestamp
(boolean
) #Записывает время коммита транзакций. Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера. Значение по умолчанию -off
.
18.6.2. Основной сервер #
Эти параметры могут быть установлены на основном сервере, который должен отправлять данные репликации на один или несколько резервных серверов. Обратите внимание, что помимо этих параметров, wal_level должен быть правильно установлен на основном сервере, а также может быть включена архивация WAL (см. Раздел 18.5.3). Значения этих параметров на резервных серверах не имеют значения, хотя вы можете захотеть установить их там в предвидении возможности превращения резервного сервера в основной.
synchronous_standby_names
(string
) #Определяет список резервных серверов, которые могут поддерживать синхронную репликацию, как описано в Раздел 25.2.8. Будет один или более активных синхронных резервов; транзакции, ожидающие коммита, будут разрешены к выполнению после того, как эти резервные серверы подтвердят получение их данных. Синхронные резервные серверы будут назнаечены, чьи имена указаны в этом списке и которые в настоящее время подключены и передают данные в режиме реального времени (как показано состоянием
streaming
в представленииpg_stat_replication
). Указание более одного синхронного резервного сервера может обеспечить очень высокую доступность и надежную защиту от потери данных.В качестве имени сервера-резерва для этой цели используется параметр
application_name
на стенде, установленный в информации о подключении стенда. В случае физической репликации стенда это должно быть установлено в параметреprimary_conninfo
; по умолчанию используется значение параметра cluster_name, если оно установлено, иначеwalreceiver
. Для логической репликации это может быть установлено в информации о подписке, и по умолчанию используется имя подписки. Для других потребителей потока репликации обратитесь к их документации.Этот параметр определяет список резервных серверов с использованием одного из следующих синтаксисов:
[FIRST]
num_sync
(standby_name
[, ...] ) ANYnum_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
нечувствительны к регистру. Если эти ключевые слова используются в качестве имени резервного сервера, егоstandby_name
должно быть заключено в двойные кавычки.Третий синтаксис использовался до версии PostgreSQL 9.6 и до сих пор поддерживается. Он аналогичен первому синтаксису с
FIRST
иnum_sync
, равными 1. Например,FIRST 1 (s1, s2)
иs1, s2
имеют одно и то же значение: либо выбираетсяs1
, либоs2
в качестве синхронного резервного сервера.Специальная запись
*
соответствует любому имени резервного сервера.Отсутствует механизм для обеспечения уникальности имен резервных серверов. В случае дубликатов один из совпадающих резервных серверов будет считаться более приоритетным, хотя точно определить, какой именно, невозможно.
Примечание
Каждое имя
standby_name
должно иметь форму допустимого идентификатора SQL, если только оно не является*
. При необходимости можно использовать двойные кавычки. Однако следует отметить, что именаstandby_name
сравниваются с именами standby-приложений без учета регистра, независимо от наличия двойных кавычек.Если здесь не указаны имена синхронных резервных копий, то синхронная репликация не включена и коммит транзакций не будет ожидать репликации. Это конфигурация по умолчанию. Даже когда синхронная репликация включена, отдельные транзакции могут быть настроены не ожидать репликации, установив параметр synchronous_commit в значение
local
илиoff
.Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера.
18.6.3. Резервные серверы #
Эти настройки управляют поведением резервного сервера, который предназначен для получения данных репликации. Их значения на основном сервере не имеют значения.
primary_conninfo
(string
) #Указывает строку подключения, которая будет использоваться для резервного сервера для подключения к отправляющему серверу. Эта строка имеет формат, описанный в Раздел 31.1.1. Если какая-либо опция не указана в этой строке, то проверяется соответствующая переменная среды (см. Раздел 31.15). Если переменная среды также не установлена, то используются значения по умолчанию.
Соединительная строка должна указывать имя хоста (или адрес) отправляющего сервера, а также номер порта, если он не совпадает с портом по умолчанию на сервере-реплике. Также необходимо указать имя пользователя, соответствующее привилегированной роли на отправляющем сервере (см. Раздел 25.2.5.1). Также требуется указать пароль, если отправитель требует аутентификацию по паролю. Он может быть указан в строке
primary_conninfo
, или в отдельном~/.pgpass
файле на сервере-реплике (используйтеreplication
в качестве имени базы данных). Не указывайте имя базы данных в строкеprimary_conninfo
.Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера. Если этот параметр изменяется во время работы приемника WAL, этот процесс получает сигнал о завершении работы и ожидается, что он перезапустится с новыми настройками (за исключением случая, когдаprimary_conninfo
является пустой строкой). Эта настройка не имеет эффекта, если сервер не находится в режиме ожидания.primary_slot_name
(string
) #Параметр, который опционально указывает существующий слот репликации, который будет использоваться при подключении к отправляющему серверу через потоковую репликацию для контроля удаления ресурсов на узле-источнике (см. Раздел 25.2.6). Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера. Если этот параметр изменяется во время работы приемника WAL, этот процесс получает сигнал о завершении работы и ожидается его перезапуск с новыми настройками. Эта настройка не имеет эффекта, еслиprimary_conninfo
не установлен или сервер не находится в режиме ожидания.hot_standby
(boolean
) #Определяет, можете ли вы подключаться и выполнять запросы во время восстановления, как описано в Раздел 25.4. Значение по умолчанию -
on
. Этот параметр может быть установлен только при запуске сервера. Он имеет эффект только во время восстановления из архива или в режиме ожидания.max_standby_archive_delay
(integer
) #Когда горячий режим ожидания активен, этот параметр определяет, как долго резервный сервер должен ждать, прежде чем отменить запросы резервного режима, которые конфликтуют с записями WAL, которые собираются примениться, как описано в Раздел 25.4.2.
max_standby_archive_delay
применяется, когда данные WAL считываются из архива WAL (и, следовательно, не являются актуальными). Если это значение указано без единиц измерения, оно считается в миллисекундах. По умолчанию установлено значение 30 секунд. Значение -1 позволяет резервному серверу ждать бесконечно долго, пока конфликтующие запросы не завершатся. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.Обратите внимание, что
max_standby_archive_delay
не является тем же самым, что и максимальное время выполнения запроса перед отменой; это скорее максимальное общее время, разрешенное для применения данных любого сегмента WAL. Таким образом, если один запрос привел к значительной задержке ранее в сегменте WAL, последующие конфликтующие запросы будут иметь гораздо меньше времени для выполнения.max_standby_streaming_delay
(integer
) #Когда горячий резервный сервер активен, этот параметр определяет, как долго резервный сервер должен ждать, прежде чем отменить запросы резервного сервера, которые конфликтуют с записями WAL, которые собираются примениться, как описано в Раздел 25.4.2.
max_standby_streaming_delay
применяется, когда данные WAL принимаются через потоковую репликацию. Если это значение указано без единиц измерения, оно считается в миллисекундах. По умолчанию установлено значение 30 секунд. Значение -1 позволяет резервному серверу ждать бесконечно долго, чтобы завершить конфликтующие запросы. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.Обратите внимание, что
max_standby_streaming_delay
не является тем же самым, что и максимальное время выполнения запроса до его отмены; это скорее максимальное общее время, разрешенное для применения данных WAL после их получения от основного сервера. Таким образом, если один запрос вызвал значительную задержку, последующие конфликтующие запросы будут иметь гораздо меньше времени для ожидания, пока резервный сервер не догонит основной снова.wal_receiver_create_temp_slot
(boolean
) #Определяет, должен ли процесс получения WAL создавать временный слот репликации на удаленном экземпляре, когда не настроен постоянный слот репликации (с использованием primary_slot_name). По умолчанию отключено. Этот параметр можно установить только в файле
postgresql.conf
или в командной строке сервера. Если этот параметр изменяется во время работы приемника WAL, этот процесс получает сигнал о завершении работы и ожидается, что он перезапустится с новыми настройками.wal_receiver_status_interval
(integer
) #Определяет минимальную частоту, с которой приемник WAL на резервном сервере отправляет информацию о ходе репликации на основной сервер или на другой резервный сервер, где она может быть просмотрена с помощью представления
pg_stat_replication
. Резервный сервер будет сообщать о последней записанной позиции журнала предварительной записи, последней позиции, которая была записана на диск, и последней позиции, которая была применена. Значение этого параметра является максимальным временным интервалом между отчетами. Обновления отправляются каждый раз, когда изменяются позиции записи или сброса, или так часто, как указано в этом параметре, если он установлен в ненулевое значение. Есть дополнительные случаи, когда обновления отправляются, игнорируя этот параметр; например, когда обработка существующего WAL завершается или когдаsynchronous_commit
установлено вremote_apply
. Таким образом, позиция применения может немного отставать от реальной позиции. Если это значение указано без единиц измерения, оно считается в секундах. Значение по умолчанию - 10 секунд. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.hot_standby_feedback
(boolean
) #Определяет, будет ли горячий резервный экземпляр отправлять обратную связь основному или вторичному резервному экземпляру о текущих выполняющихся запросах на резервном экземпляре. Этот параметр может использоваться для предотвращения отмены запросов, вызванных записями очистки, но может вызывать раздутие базы данных на основном экземпляре для некоторых рабочих нагрузок. Сообщения обратной связи не будут отправляться чаще, чем один раз за интервал
wal_receiver_status_interval
. Значение по умолчанию -off
. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.Если используется каскадная репликация, обратная связь передается вверх по цепочке, пока она не достигнет основного сервера. Резервные серверы не используют полученную обратную связь ни для каких других целей, кроме передачи ее вверх по цепочке.
Эта настройка не переопределяет поведение
old_snapshot_threshold
на основном сервере; снимок на резервном сервере, который превышает пороговое значение возраста на основном сервере, может стать недействительным, что приведет к отмене транзакций на резервном сервере. Это происходит потому, чтоold_snapshot_threshold
предназначен для установки абсолютного предела времени, в течение которого мертвые строки могут способствовать раздутию, что в противном случае нарушалось бы из-за конфигурации резервного сервера.wal_receiver_timeout
(integer
) #Прекращайте соединения репликации, которые неактивны в течение времени, превышающего эту величину. Это полезно для приемного сервера резервной копии для обнаружения сбоя основного узла или сбоя сети. Если это значение указано без единиц измерения, оно принимается в качестве миллисекунд. Значение по умолчанию - 60 секунд. Значение нуль отключает механизм тайм-аута. Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера.wal_retrieve_retry_interval
(integer
) #Указывает, как долго резервный сервер должен ждать, когда данные WAL недоступны из любых источников (потоковая репликация, локальный файл
pg_wal
или архив WAL), прежде чем повторно попытаться получить данные WAL. Если это значение указано без единиц измерения, оно считается в миллисекундах. Значение по умолчанию - 5 секунд. Этот параметр может быть установлен только в файлеpostgresql.conf
или в командной строке сервера.Этот параметр полезен в конфигурациях, где узел в процессе восстановления должен контролировать время ожидания появления новых данных WAL. Например, при восстановлении из архива можно сделать восстановление более оперативным в обнаружении нового файла WAL, уменьшив значение этого параметра. В системе с низкой активностью WAL увеличение этого значения уменьшает количество запросов, необходимых для доступа к архивам WAL, что полезно, например, в облачных средах, где учитывается количество обращений к инфраструктуре.
В логической репликации этот параметр также ограничивает частоту, с которой будет перезапускаться неудачный рабочий процесс применения репликации.
recovery_min_apply_delay
(integer
) #По умолчанию, резервный сервер восстанавливает записи WAL с отправляющего сервера как можно скорее. Может быть полезно иметь копию данных с задержкой по времени, что предоставляет возможности для исправления ошибок потери данных. Этот параметр позволяет задержать восстановление на указанное количество времени. Например, если вы установите этот параметр в
5min
, резервный сервер будет воспроизводить каждый коммит транзакции только тогда, когда системное время на резервном сервере будет отстаивать от времени коммита, сообщенного основным сервером, как минимум на пять минут. Если это значение указано без единиц измерения, оно принимается в миллисекундах. По умолчанию значение равно нулю, то есть задержка отсутствует.Возможно, задержка репликации между серверами превышает значение этого параметра, в таком случае задержка не добавляется. Обратите внимание, что задержка рассчитывается между временной меткой WAL, записанной на основном сервере, и текущим временем на резервном сервере. Задержки при передаче из-за сетевой задержки или конфигураций каскадной репликации могут значительно сократить фактическое время ожидания. Если системные часы на основном и резервном серверах не синхронизированы, это может привести к применению записей восстановления раньше ожидаемого; но это не является серьезной проблемой, поскольку полезные значения этого параметра гораздо больше типичных отклонений времени между серверами.
Задержка происходит только на записях WAL для коммита транзакций. Остальные записи воспроизводятся как можно быстрее, что не является проблемой, потому что правила видимости MVCC гарантируют, что их эффекты не становятся видимыми до применения соответствующей записи коммита.
Задержка происходит один раз, когда база данных восстановления достигает согласованного состояния, до тех пор, пока резервный экземпляр не будет продвинут или запущен. После этого резервный экземпляр завершит восстановление без дальнейшего ожидания.
WAL-записи должны быть сохранены на резервном сервере до тех пор, пока они не будут готовы к применению. Поэтому, более длительные задержки приведут к большему накоплению файлов журнала предзаписи, увеличивая требования к дисковому пространству для каталога
pg_wal
на резервном сервере.Этот параметр предназначен для использования в развертываниях потоковой репликации; однако, если параметр указан, он будет учитываться во всех случаях, кроме восстановления после сбоя.
hot_standby_feedback
будет задерживаться при использовании этой функции, что может привести к раздутию на основном сервере; используйте оба параметра вместе с осторожностью.Предупреждение
Синхронная репликация зависит от этой настройки, когда значение
synchronous_commit
установлено вremote_apply
; каждыйCOMMIT
будет ожидать применения.Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера.
18.6.4. Подписчики #
Эти настройки управляют поведением подписчика логической репликации. Их значения на издателе не имеют значения. См. Раздел 29.10 для получения дополнительных сведений.
max_replication_slots
(integer
) #Указывает, сколько репликационных источников (см. Глава 47) можно отслеживать одновременно, эффективно ограничивая количество логических подписок на репликацию, которые можно создать на сервере. Установка значения ниже текущего количества отслеживаемых репликационных источников (отражено в pg_replication_origin_status) предотвратит запуск сервера.
max_replication_slots
должно быть установлено как минимум на количество подписок, которые будут добавлены к подписчику, плюс некоторый резерв для синхронизации таблиц.Обратите внимание, что этот параметр также применяется на сервере отправки, но с другим значением.
max_logical_replication_workers
(integer
) #Указывает максимальное количество рабочих процессов логической репликации. Это включает ведущих рабочих процессов применения, параллельных рабочих процессов применения и рабочих процессов синхронизации таблиц.
Рабочие процессы логической репликации берутся из пула, определенного параметром
max_worker_processes
.Значение по умолчанию равно 4. Этот параметр может быть установлен только при запуске сервера.
max_sync_workers_per_subscription
(integer
) #Максимальное количество рабочих процессов синхронизации на подписку. Этот параметр контролирует объем параллельной обработки данных при копировании начальных данных во время инициализации подписки или при добавлении новых таблиц.
В настоящее время может быть только один рабочий процесс синхронизации на таблицу.
Рабочие процессы синхронизации берутся из пула, определенного параметром
max_logical_replication_workers
.Значение по умолчанию равно 2. Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера.max_parallel_apply_workers_per_subscription
(integer
) #Максимальное количество параллельных рабочих процессов для каждой подписки. Этот параметр контролирует объем параллельной обработки данных для потоковой передачи незавершенных транзакций с параметром подписки
streaming = parallel
.Параллельные рабочие применяются из пула, определенного
max_logical_replication_workers
.Значение по умолчанию равно 2. Этот параметр может быть установлен только в файле
postgresql.conf
или в командной строке сервера.