Репликация

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



Передающие серверы

Эти параметры можно установить на любом сервере, который должен передавать данные репликации на один или несколько резервных серверов. Главный сервер всегда является передающим, поэтому на нем эти параметры должны задаваться всегда. Роль и значение этих параметров не меняются после того, как резервный сервер становится главным.

max_wal_senders (integer)

Задает максимально допустимое число одновременных подключений резервных серверов или клиентов потокового базового резервного копирования (т. е. максимальное число одновременно работающих процессов передачи WAL). Значение по умолчанию — 10. При значении 0 репликация выключается. При неожиданном отключении клиента потоковой передачи потерянный слот подключения может игнорироваться вплоть до истечения тайм-аута, поэтому значение этого параметра должно быть немного выше максимального числа ожидаемых клиентов, чтобы отключившиеся клиенты могли немедленно восстановить соединение. Этот параметр можно задать только при запуске сервера. Кроме того, чтобы к данному серверу могли подключаться резервные, значение параметра wal_level должно быть replica или выше.

При запуске резервного сервера следует установить для этого параметра значение большее или равное значению на главном сервере. В противном случае на резервном сервере не будут разрешены запросы.

max_replication_slots (integer)

Задает максимальное число слотов репликации (см. подраздел Слоты репликации), которое сможет поддерживать сервер. Значение по умолчанию — 10. Этот параметр можно задать только при запуске сервера. Если заданное значение будет меньше, чем число существующих в настоящее время слотов репликации, сервер не запустится. Кроме того, чтобы к данному серверу могли подключаться резервные, значение параметра wal_level должно быть replica или выше.

На стороне подписчика этот параметр определяет, сколько источников репликации (см. главу Отслеживание процесса репликации) можно отслеживать одновременно, по сути ограничивая количество подписок на логическую репликацию, которые можно создать на сервере. Если заданное значение будет меньше, чем текущее число отслеживаемых источников репликации (показываемое в представлении pg_replication_origin_status, а не в каталоге pg_replication_origin), сервер не запустится.

wal_keep_size (integer)

Задает минимальный объем прошлых сегментов файла журнала, которые будут сохраняться в каталоге pg_wal на случай, если резервному серверу понадобится выбрать их для потоковой репликации. Если резервный сервер, подключенный к передающему, отстает больше чем на wal_keep_size мегабайт, передающий сервер может удалить сегменты WAL, все еще нужные резервному, и в этом случае соединение репликации прервется. В результате этого впоследствии также будут прерваны зависимые соединения. (Однако резервный сервер может восстановиться, выбрав этот сегмент из архива, если осуществляется архивирование WAL.)

Этот параметр задает только минимальный объем сегментов, который будет сохраняться в каталоге pg_wal; для архивации WAL или для восстановления с момента контрольной точки системе может потребоваться сохранить больше сегментов. Если wal_keep_size равен нулю (это значение по умолчанию), система не сохраняет никакие дополнительные сегменты для резервных серверов, поэтому число доступных для них старых сегментов WAL зависит от положения предыдущей контрольной точки и состояния архивации WAL. Если это значение указано без единиц измерения, оно считается заданным в мегабайтах. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

max_slot_wal_keep_size (integer)

Задает максимальный объем файлов WAL, который может оставаться в каталоге pg_wal для слотов репликации после выполнения контрольной точки. Со значением max_slot_wal_keep_size, равным -1 (по умолчанию), для слотов репликации может сохраняться неограниченный объем файлов WAL. При неотрицательном значении, если позиция restart_lsn для слота репликации отстает от текущего LSN более чем на заданный объем, использующий этот слот резервный сервер может лишиться возможности продолжить репликацию вследствие удаления нужных ему файлов WAL. Доступность WAL для слотов репликации показывается в представлении pg_replication_slots. Если это значение указано без единиц измерения, оно считается заданным в мегабайтах. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

wal_sender_timeout (integer)

Задает промежуток времени, по истечении которого прерываются неактивные соединения репликации. Это помогает передающему серверу обнаружить сбой резервного сервера или разрывы сети. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 60 секунд. При значении 0 механизм тайм-аута выключается.

Если узлы кластера распределены по нескольким географическим местоположениям, его управление можно сделать более гибким, используя разные значения в разных расположениях. Маленькие значения помогают быстрее обнаружить потерю резервного сервера, подключенного через сеть с низкими задержками, а большие позволяют точнее определить состояние удаленного резервного сервера, соединение с которым характеризуется большими задержками.

track_commit_timestamp (boolean)

Включает запись времени фиксации транзакций. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — off (выключен).


Главный сервер

Эти параметры можно задать на главном (основном) сервере, который должен передавать данные репликации на один или несколько резервных серверов. Обратите внимание, что помимо этих параметров на главном сервере должен быть надлежащим образом установлен wal_level, а также может быть включено архивирование WAL (см. подраздел Архивирование). Значения этих параметров на резервных серверах не важны, хотя их можно задать там заранее, на случай, если понадобится сделать резервный сервер главным.

synchronous_standby_names (string)

Задает список резервных серверов, которые могут поддерживать синхронную репликацию, как описано в разделе Синхронная репликация. Активных синхронных резервных серверов может быть один или несколько; транзакциям, ожидающим фиксации, будет позволено завершиться только после того, как эти резервные серверы подтвердят получение своих данных. Синхронными резервными серверами будут те, имена которых указаны в этом списке и которые в настоящее время подключены и передают данные в режиме реального времени (что показывает характеристика streaming в представлении pg_stat_replication). Указание более одного синхронного резервного сервера может обеспечить очень высокую доступность и защиту от потери данных.

Именем резервного сервера в этом контексте является значение параметра application_name резервного сервера, задаваемое в его свойствах подключения. В случае осуществления физической репликации его следует задавать в параметре primary_conninfo; по умолчанию это значение параметра cluster_name, если оно задано, иначе — walreceiver. Для логической репликации его можно задать в свойствах подключения подписки; по умолчанию это имя подписки. Чтобы узнать, как задать его для других потребителей потока репликации, ознакомьтесь с их документацией.

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

[FIRST] число_синхронных ( имя_резервного [, ...] )
ANY число_синхронных ( имя_резервного [, ...] )
имя_резервного [, ...]

где число_синхронных — это число синхронных резервных серверов, от которых транзакции должны дождаться ответов, а имя_резервного — это имя резервного сервера. FIRST и ANY указывают способ выбора синхронных резервных из перечисленных серверов.

Ключевое слово FIRST в сочетании с числом_синхронных задает синхронную репликацию согласно приоритетам, и транзакции не фиксируются, пока их записи WAL не будут реплицированы на число_синхронных синхронных резервных серверов, выбранных, исходя из их приоритетности. Например, если задать FIRST 3 (s1, s2, s3, s4), то каждая фиксация будет происходить только после получения ответов от трех наиболее приоритетных из резервных серверов s1, s2, s3 и s4. Резервные серверы, имена которых стоят в списке выше, имеют более высокий приоритет и будут рассматриваться как синхронные. Серверы, следующие в списке за ними, считаются потенциальными синхронными. Если какой-либо из текущих синхронных резервных серверов по какой-то причине отключится, он будет немедленно заменен следующим резервным сервером с наивысшим приоритетом. Ключевое слово FIRST является необязательным.

Ключевое слово ANY в сочетании с числом_синхронных задает синхронную репликацию согласно кворуму, и транзакции не фиксируются, пока их записи WAL не будут реплицированы как минимум на число_синхронных перечисленных резервных серверов. Например, если задать ANY 3 (s1, s2, s3, s4), то каждая фиксация будет происходить сразу после получения ответов от как минимум трех из резервных серверов s1, s2, s3 и s4.

Ключевые слова FIRST и ANY нечувствительны к регистру. Если эти же слова используются в качестве имени резервного сервера, его имя_резервного следует заключить в кавычки.

Третья форма считается устаревшей, но до сих пор поддерживается QHB. Она равнозначна первой форме с FIRST и числом_синхронных, равным 1. Например, FIRST 1 (s1, s2) и s1, s2 означают одно и то же: в качестве синхронного резервного сервера выбирается либо s1, либо s2.

Специальному элементу * соответствует имя любого резервного сервера.

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

Примечание
Каждое имя_резервного должно задаваться в форме действительного идентификатора SQL, кроме *. При необходимости его можно заключать в кавычки. Но обратите внимание, что имена_резервного сравниваются с именами приложений резервных серверов без учета регистра, независимо от того, заключены они в кавычки или нет.

Если не задать в этом параметре имена синхронных резервных серверов, то синхронная репликация не включится и фиксируемые транзакции не будут ждать репликации. Это конфигурация по умолчанию. Даже когда синхронная репликация включена, отдельные транзакции можно настроить так, чтобы они не ожидали репликации, задав для параметра synchronous_commit значение local или off.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

vacuum_defer_cleanup_age (integer)

Задает число транзакций, на которое будут откладывать очистку неиспользуемых версий строк команда VACUUM и изменения HOT. По умолчанию это число равно нулю, то есть неиспользуемые версии строк могут быть удалены сразу, как только перестанут быть видимыми для любой открытой транзакции. Можно установить ненулевое значение на основном сервере, который работает с серверами горячего резерва, как описано в разделе Горячий резерв. Это дает больше времени для выполнения запросов на резервном сервере без возникновения конфликтов из-за преждевременной очистки строк. Тем не менее поскольку это значение определяется числом записывающих транзакций, выполняющихся на основном сервере, трудно предсказать, сколько дополнительного времени получат резервные серверы. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

В качестве альтернативы использованию этого параметра следует также рассмотреть возможность установки hot_standby_feedback на резервных серверах.

Этот параметр не предотвращает очистку неиспользуемых строк, которые достигли возраста, заданного параметром old_snapshot_threshold.


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

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

primary_conninfo (string)

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

В строке подключения должно задаваться имя хоста (или адрес) передающего сервера, а также номер порта, если он не совпадает с номером по умолчанию для резервного сервера. Также указывается имя пользователя, соответствующее роли с требуемыми правами на передающем сервере (см. подраздел Аутентификация). Кроме того, если передающий сервер требует аутентификации по паролю, следует дополнительно задать пароль. Его можно указать в строке primary_conninfo или в отдельном файле ~/.qhbpass на резервном сервере (для базы данных с именем replication). Имя базы данных в строке primary_conninfo указывать не нужно.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Если значение этого параметра меняется во время работы процесса, принимающего WAL, этот процесс получает сигнал завершиться, и ожидается, что он перезапустится с новой настройкой (за исключением случаев, когда значением primary_conninfo является пустая строка). Этот параметр действует, только если сервер работает в резервном режиме.

primary_slot_name (string)

Дополнительно задает существующий слот репликации, который будет использоваться при подключении к передающему серверу посредством потоковой репликации для управления удалением ресурсов в вышестоящем узле (см. подраздел Слоты репликации). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Если значение этого параметра меняется во время работы процесса, принимающего WAL, этот процесс получает сигнал завершиться, и ожидается, что он перезапустится с новой настройкой. Этот параметр действует, только если задан параметр primary_conninfo и сервер работает в режиме резерва.

promote_trigger_file (string)

Задает триггерный файл, присутствие которого завершает восстановление на резервном сервере. Даже если это значение не задано, резервный сервер все равно можно назначить главным с помощью команды qhb_ctl promote или вызова функции pg_promote. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

hot_standby (boolean)

Определяет, можно ли будет подключаться к серверу и выполнять запросы в процессе восстановления, как описано в разделе Горячий резерв. Значение по умолчанию — on (подключения разрешены). Этот параметр можно задать только при запуске сервера. Он действует только во время восстановления архива или в режиме резервного сервера.

max_standby_archive_delay (integer)

В режиме горячего резерва этот параметр определяет, как долго резервный сервер должен ждать, прежде чем отменять свои запросы, конфликтующие с готовыми к применению записями WAL, как описано в подразделе Обработка конфликтов запросов. Задержка max_standby_archive_delay применяется, когда данные WAL считываются из архива (то есть не являются текущими). Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 30 секунд. При значении -1 клиент может ждать завершения конфликтующих запросов неограниченное время. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Обратите внимание, что max_standby_archive_delay — это не максимальное время, которое отводится на выполнение каждому запросу; скорее это максимальное общее время, за которое должны применяться данные из одного сегмента WAL. Таким образом, если один запрос привел к значительной задержке, у последующих конфликтующих запросов отсрочка будет гораздо меньше.

max_standby_streaming_delay (integer)

В режиме горячего резерва этот параметр определяет, как долго резервный сервер должен ждать, прежде чем отменять свои запросы, конфликтующие с готовыми к применению записями WAL, как описано в подразделе Обработка конфликтов запросов. Задержка max_standby_streaming_delay применяется, когда данные WAL поступают при потоковой репликации. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 30 секунд. При значении -1 клиент может ждать завершения конфликтующих запросов неограниченное время. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Обратите внимание, что max_standby_streaming_delay — это не максимальное время, которое отводится на выполнение каждому запросу; скорее это максимальное общее время, за которое должны применяться данные из одного сегмента WAL после получения от главного сервера. Таким образом, если один запрос привел к значительной задержке, у последующих конфликтующих запросов будет гораздо меньше времени, пока резервный сервер снова не догонит главный.

wal_receiver_create_temp_slot (boolean)

Определяет, должен ли процесс, принимающий WAL, создавать временный слот репликации на удаленном сервере, если постоянный слот репликации не был сконфигурирован (с помощью primary_slot_name). Значение по умолчанию — off (выключен). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Если значение этого параметра меняется во время работы процесса, принимающего WAL, этот процесс получает сигнал завершиться, и ожидается, что он перезапустится с новой настройкой.

wal_receiver_status_interval (integer)

Задает минимальную частоту, с которой процесс, принимающий WAL на резервном сервере, будет отправлять информацию о ходе выполнения репликации на главный или вышестоящий резервный сервер, где эту информацию можно будет увидеть в представлении pg_stat_replication. В сообщении резервного сервера будут передаваться сведения о последней позиции, которую он записал в журнал упреждающей записи, о последней позиции, которую он сохранил на диск, и о последней позиции, которую он применил. Значение этого параметра — максимальный интервал между отчетами. Сообщения отправляются при каждом изменении позиции записи или сохранения или с частотой, указанной в этом параметре (если в нем установлено ненулевое значение). Существуют отдельные случаи, при которых изменения отправляются, игнорируя этот параметр; например, когда завершается обработка существующего WAL или когда synchronous_commit имеет значение remote_apply. Таким образом, последняя переданная позиция может немного отставать от фактической. Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию — 10 секунд. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

hot_standby_feedback (boolean)

Определяет, будет ли сервер горячего резерва передавать главному или вышестоящему резервному серверу отчет о запросах, выполняющихся на нем в данный момент. Этот параметр позволяет исключить необходимость отмены запросов, вызванную очисткой записей, но при некоторых рабочих нагрузках может вызвать раздувание базы данных на главном сервере. Сообщения с отчетом о запросах будут отправляться не чаще, чем один раз за интервал, задаваемый параметром wal_receiver_status_interval. Значение по умолчанию — off (выключен). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Если используется каскадная репликация, сообщения о запросах передаются выше, пока в конце концов не достигнут главного сервера. Промежуточные резервные серверы эту информацию больше никак не используют.

Этот параметр не переопределяет поведение old_snapshot_threshold на главном сервере; снимок на резервном сервере, возраст которого превышает порог, заданный на главном, может стать недействительным, что приведет к отмене транзакций на резервном сервере. Это связано с тем, что параметр old_snapshot_threshold предназначен для указания абсолютного ограничения времени, в течение которого могут накапливаться неиспользуемые строки, которое иначе было бы нарушено из-за конфигурации резервного сервера.

wal_receiver_timeout (integer)

Задает промежуток времени, по истечении которого прерываются неактивные соединения репликации. Это позволяет принимающему резервному серверу обнаружить сбой главного сервера или разрыв сети. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 60 секунд. При нулевом значении механизм тайм-аута выключается. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

wal_retrieve_retry_interval (integer)

Определяет, как долго резервный сервер должен ждать поступления данных WAL из любых источников (потоковая репликация, локальный pg_wal или архив WAL), прежде чем снова попытаться получить данные WAL. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 5 секунд. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.

Этот параметр полезен в конфигурациях, где узлу в процессе восстановления необходимо контролировать время ожидания новых данных WAL. Например, при восстановлении архива можно ускорить реакцию при обнаружении нового файла WAL, уменьшив значение этого параметра. В системе с низкой активностью WAL увеличение этого параметра уменьшает количество запросов, необходимых для доступа к архивам WAL, что полезно, например, в облачных средах, где учитывается число обращений к инфраструктуре.

recovery_min_apply_delay (integer)

По умолчанию резервный сервер восстанавливает записи WAL с передающего сервера в максимально сжатые сроки. Может быть полезно задавать задержку при копировании этих данных, получая тем самым возможность исправить ошибки, связанные с потерей данных. Этот параметр позволяет отложить восстановление на указанное количество времени. Например, если установить для этого параметра значение 5min, резервный сервер будет воспроизводить фиксацию каждой транзакции не раньше, чем через 5 минут (согласно его системным часам) после времени фиксации, сообщенного главным сервером. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — ноль, то есть задержка не добавляется.

Бывает так, что задержка репликации между серверами превышает значение этого параметра, и в этом случае дополнительная задержка не добавляется. Обратите внимание, что задержка рассчитывается как разница между отметкой времени, записанной в WAL на главном сервере, и текущим временем на резервном сервере. Задержки передачи из-за запаздывания в сети или каскадной репликации могут значительно сократить фактическое время ожидания. Если системные часы на главном и резервном серверах не синхронизированы, это может привести к применению записей ранее ожидаемого; но это не столь важно, потому что полезные значения этого параметра намного выше обычной разницы во времени между серверами.

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

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

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

ПРЕДУПРЕЖДЕНИЕ!

Этот параметр влияет на синхронную репликацию, когда для synchronous_commit задано значение remote_apply; каждой команде COMMIT придется ожидать применения.

Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.


Подписчики

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

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

max_logical_replication_workers (int)

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

Рабочие процессы логической репликации берутся из пула, заданного параметром max_worker_processes.

Значение по умолчанию — 4. Этот параметр можно задать только при запуске сервера.

max_sync_workers_per_subscription (integer)

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

В настоящее время одну таблицу может обрабатывать только один рабочий процесс синхронизации.

Рабочие процессы синхронизации берутся из пула, заданного параметром max_logical_replication_workers*.

Значение по умолчанию — 2. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.