51.3. Протокол потоковой репликации
Чтобы инициировать потоковую репликацию, клиент передаёт в стартовом сообщении параметр replication. Логическое значение true этого параметра указывает обслуживающему процессу перейти в режим передачи WAL (walsender), в котором вместо SQL-операторов клиент может выдавать только ограниченный набор команд репликации. В режиме walsender можно использовать только протокол простых запросов. Команды репликации будут записываться в журнал сообщений сервера, если включён режим log_replication_commands. Если этот параметр имеет значение database, процесс walsender должен подключиться к базе данных, указанной в параметре dbname, что позволит использовать это подключение для логической репликации с указанной базой данных.
Для тестирования команд репликации вы можете установить соединение для репликации, запустив psql или другую программу на базе libpq со строкой подключения, включающей параметр replication, например так:
psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
Однако часто полезнее использовать pg_receivexlog (для физической репликации) или pg_recvlogical (для логической).
В режиме walsender принимаются следующие команды:
IDENTIFY_SYSTEMЗапрашивает идентификационные данные сервера. Сервер возвращает набор результатов с одной строкой, содержащей четыре поля:
systemid(text)Уникальный идентификатор системы, идентифицирующий кластер. По нему можно определить, что базовая резервная копия, из которой инициализировался резервный сервер, получена из того же кластера.
timeline(int4)Идентификатор текущей линии времени. Также полезен для того, чтобы убедиться, что резервный сервер согласован с главным.
xlogpos(text)Текущее положение сохранённых данных в xlog. Позволяет узнать, с какой позиции в журнале транзакций может начаться потоковая передача.
dbname(text)Подключённая база данных или NULL.
TIMELINE_HISTORYtliЗапрашивает с сервера файл истории для линии времени
лин_врем. Сервер возвращает набор результатов в одной строке, содержащей два поля. Эти поля обозначены как имеющие типыtextиbytea, но фактически они содержат просто байты, не в текстовой кодировке и без экранирования:filename(text)Имя файла с историей линии времени, например
00000002.history.content(bytea)Содержимое файла с историей линией времени.
CREATE_REPLICATION_SLOTимя_слота{PHYSICAL[RESERVE_WAL] |LOGICALмодуль_вывода}Создаёт слот физической или логической репликации. Слоты репликации описаны подробно в Подразделе 26.2.6.
имя_слотаИмя создаваемого слота. Заданное имя должно быть допустимым для слота репликации (см. Подраздел 26.2.6.1).
модуль_выводаИмя модуля вывода, применяемого для логического декодирования (см. Раздел 47.6).
RESERVE_WALУказывает, что этот слот физической репликации резервирует WAL немедленно. Без этого указания WAL резервируется только при подключении клиента потоковой репликации.
START_REPLICATION[SLOTимя_слота] [PHYSICAL]XXX/XXX[TIMELINEлин_врем]Указывает серверу начать потоковую передачу WAL, начиная с позиции
XXX/XXXв WAL. Если указывается параметрTIMELINE, передача начинается на линии временилин_врем, иначе выбирается текущая линия времени сервера. Сервер может вернуть в ответ ошибку, например, если запрошенный сегмент WAL уже потерян. Если проблем не возникает, сервер возвращает сообщение CopyBothResponse, а затем начинает передавать поток WAL клиенту.Если в параметрах передаётся
имя_слота, сервер будет отражать состояние репликации в этом слоте и отслеживать, какие сегменты, а если включён режимhot_standby_feedback, то и в каких транзакциях, всё ещё нужны этому резервному серверу.Если клиент запрашивает не последнюю, но существующую в истории сервера линию времени, сервер будет передавать весь WAL на этой линии времени, начиная с запрошенной стартовой точки до момента, когда сервер переключился на другую линию времени. Если клиент запрашивает передачу с начальной позицией точно в конце старой линии времени, сервер немедленно отвечает CommandComplete, не переходя в режим COPY.
После передачи всех записей WAL на линии времени, не являющейся текущей, сервер завершает потоковую передачу, выходя из режима копирования. Когда клиент подтверждает завершение передачи, также выходя из режима копирования, сервер возвращает набор результатов в одной строке с двумя столбцами, сообщая таким образом о следующей линии времени в истории сервера. В первом столбце передаётся идентификатор следующей линии времени (типа
int8), а во втором — позиция в WAL, в которой произошло переключение (типаtext). Обычно в этой же позиции завершается передача потока WAL, но возможны исключения, когда сервер может передавать записи WAL из старой линии времени, которые он сам ещё не воспроизвёл до переключения. Наконец сервер передаёт сообщение CommandComplete, после чего он готов принять следующую команду.Данные WAL передаются в серии сообщений CopyData. (Это позволяет перемежать их с другой информацией; в частности, сервер может передать сообщение ErrorResponse, если он столкнулся с проблемами, уже начав передачу потока.) Полезная нагрузка каждого сообщения CopyData от сервера к клиенту содержит данные в одном из следующих форматов:
- XLogData (B) — данные журнала транзакций
- Byte1('w')
Указывает, что в этом сообщении передаются данные WAL.
- Int64
Начальная точка данных WAL в этом сообщении.
- Int64
Текущее положение конца WAL на сервере.
- Int64
Показания системных часов сервера в момент передачи, в микросекундах с полуночи 2000-01-01.
- Byte
n Фрагмент потока данных WAL.
Одна запись WAL никогда не разделяется на два сообщения XLogData. Когда запись WAL пересекает границу страницы WAL, и таким образом от неё уже оказывается отделена продолжающая запись, её можно разделить на сообщения по границе страницы. Другими словами, первая основная запись WAL и продолжающие её записи могут быть переданы в различных сообщениях XLogData.
- Primary keepalive message (B) — Сообщение об активности ведущего
- Byte1('k')
Указывает, что это сообщение об активности отправителя.
- Int64
Текущее положение конца WAL на сервере.
- Int64
Показания системных часов сервера в момент передачи, в микросекундах с полуночи 2000-01-01.
- Byte1
Значение 1 означает, что клиент должен ответить на это сообщение как можно скорее, во избежание отключения по тайм-ауту. Со значением 0 это не требуется.
Принимающий процесс может передавать ответы отправителю в любое время, используя один из следующих форматов данных (также в полезной нагрузке сообщения CopyData):
- Standby status update (F) — Обновление состояния резервного сервера
- Byte1('r')
Указывает, что это сообщение передаёт обновлённое состояние получателя.
- Int64
Положение следующего за последним байтом WAL, полученным и записанным на диск на резервном сервере.
- Int64
Положение следующего за последним байтом WAL, сохранённым на диске на резервном сервере.
- Int64
Положение следующего за последним байтом WAL, применённым на резервном сервере.
- Int64
Показания системных часов клиента в момент передачи, в микросекундах с полуночи 2000-01-01.
- Byte1
Если содержит 1, клиент запрашивает от сервера немедленный ответ на это сообщение. Так клиент может запросить отклик сервера и проверить, продолжает ли функционировать соединение.
- Hot Standby feedback message (F) — Сообщение обратной связи горячего резерва
- Byte1('h')
Указывает, что это сообщение обратной связи горячего резерва.
- Int64
Показания системных часов клиента в момент передачи, в микросекундах с полуночи 2000-01-01.
- Int32
Текущее значение xmin данного резервного сервера. Может быть нулевым; это означает, что резервный сервер уведомляет о том, что сообщения обратной связи горячего резерва больше не будут передаваться через это подключение. Последующие ненулевые значения могут восстановить работу механизма обратной связи.
- Int32
Текущая эпоха резервного сервера.
START_REPLICATIONSLOTимя_слотаLOGICALXXX/XXX[ (имя_параметра[значение_параметра] [, ...] ) ]Указывает серверу начать потоковую передачу WAL для логической репликации, начиная с позиции
XXX/XXXв WAL. Сервер может вернуть в ответ ошибку, например, если запрошенный сегмент WAL уже потерян. Если проблем не возникает, сервер возвращает сообщение CopyBothResponse, а затем начинает передавать поток WAL клиенту.Данные, передаваемые внутри сообщений CopyBothResponse, имеют тот же формат, что описан для команды
START_REPLICATION ... PHYSICAL.Обработку выводимых данных для передачи выполняет модуль вывода, связанный с выбранным слотом.
SLOTимя_слотаИмя слота, из которого передаются изменения. Это имя является обязательным, оно должно соответствовать существующему логическому слоту репликации, созданному командой
CREATE_REPLICATION_SLOTв режимеLOGICAL.XXX/XXXПозиция в WAL, с которой должна начаться передача.
имя_параметраИмя параметра, передаваемого модулю логического декодирования для выбранного слота.
значение_параметраНеобязательное значение, в форме строковой константы, связываемое с указанным параметром.
DROP_REPLICATION_SLOTимя_слотаУдаляет слот репликации, что приводит к освобождению всех зарезервированных для него ресурсов на стороне сервера. Если слот в настоящий момент используется активным соединением, команда завершается ошибкой.
имя_слотаИмя слота, подлежащего удалению.
BASE_BACKUP[LABEL'метка'] [PROGRESS] [FAST] [WAL] [NOWAIT] [MAX_RATEскорость] [TABLESPACE_MAP]Указывает серверу начать потоковую передачу базовой копии. Система автоматически переходит в режим резервного копирования до начала передачи, и выходит из него после завершения копирования. Эта команда принимает следующие параметры:
LABEL'метка'Устанавливает метку для резервной копии. Если метка не задана, по умолчанию устанавливается метка
base backup. Для метки действуют те же правила применения кавычек, что и для стандартных строк SQL при включённым режиме standard_conforming_strings.PROGRESSЗапрашивает информацию, необходимую для отслеживания прогресса операции. Сервер передаёт в ответ приблизительный размер в заголовке каждого табличного пространства, исходя из которого можно понять, насколько продвинулась передача потока. Для вычисления этого размера анализируются размеры всех файлов ещё до начала передачи, и это может негативно повлиять на производительность — в частности, может увеличиться задержка до передачи первых данных. Так как файлы базы данных могут меняться во время резервного копирования, оценка размера не будет точной; размер базы может увеличиться или уменьшиться за время от вычисления этой оценки до передачи актуальных файлов.
FASTЗапрашивает быструю контрольную точку.
WALВключает в резервную копию необходимые сегменты WAL. При этом в подкаталог
pg_xlogархива базового каталога будут включены все файлы с начала до конца копирования.NOWAITПо умолчанию при копировании ожидается завершение архивации последнего требуемого сегмента WAL либо выдаётся предупреждение, если архивация журнала не включена. Указание
NOWAITотключает и ожидание, и предупреждение, так что обеспечение наличия требуемого журнала становится задачей клиента.MAX_RATEскоростьОграничивает (сдерживает) максимальный объём данных, передаваемый от сервера клиенту за единицу времени. Единица измерения этого параметра — килобайты в секунду. Если задаётся этот параметр, его значение должно быть равно нулю, либо должно находиться в диапазоне от 32 (килобайт/сек) до 1 Гбайта/сек (включая границы). Если передаётся ноль, либо параметр не задаётся, скорость передачи не ограничивается.
TABLESPACE_MAPВключает информацию о символических ссылках, представленных в каталоге
pg_tblspc, в файлtablespace_map. Файл карты табличных пространств содержит имена всех ссылок, содержащихся в каталогеpg_tblspc/, и полный путь для каждой ссылки.
Когда запускается копирование, сервер сначала передаёт два обычных набора результатов, за которыми следуют один или более результатов CopyResponse.
В первом обычном наборе результатов передаётся начальная позиция резервной копии, в одной строке с двумя столбцами. В первом столбце содержится стартовая позиция в формате XLogRecPtr, а во втором идентификатор соответствующей линии времени.
Во втором обычном наборе результатов передаётся по одной строке для каждого табличного пространства. Эта строка содержит следующие поля:
spcoid(oid)OID табличного пространства либо NULL, если это базовый каталог.
spclocation(text)Полный путь к каталогу табличного пространства либо NULL, если это базовый каталог.
size(int8)Приблизительный размер табличного пространства, если была запрошена информация о прогрессе операции; в противном случае NULL.
За вторым обычным набором результатов следует одна или несколько серий результатов CopyResponse, одна для основного каталога данных и по одной для каждого табличного пространства, отличного от
pg_defaultиpg_global. Данные в CopyResponse представляют собой выгруженное в формате tar («формате обмена ustar», описанном в стандарте POSIX 1003.1-2008) содержимое табличных пространств, за исключением того, что два замыкающих блока нулей, описанных в стандарте, не передаются. После завершения передачи данных tar передаётся заключительный обычный набор результатов, в котором сообщается конечная позиция копии в WAL, в том же формате, что и стартовая позиция.Архив tar каталога данных и всех табличных пространств будет содержать все файлы в этих каталогах, будь то файлы Postgres Pro или посторонние файлы, добавленные в эти каталоги. Исключение составляют только следующие файлы:
postmaster.pidpostmaster.optsразличные временные файлы, создаваемые в процессе работы сервером Postgres Pro
pg_xlog, включая подкаталоги. Если в резервную копию включаются файлы WAL, в архив входит преобразованная версияpg_xlog, в которой будут находиться только файлы, необходимые для восстановления копии, но не всё остальное содержимое этого каталога.pg_replslotкопируется в виде пустого каталога.файлы, отличные от обычных файлов и каталогов, например, символические ссылки и файлы специальных устройств, пропускаются. (Символические ссылки в
pg_tblspcсохраняются.)
Если файловая система сервера поддерживает это, в архив включается информация о владельце, группе и режиме файла.
51.3. Streaming Replication Protocol
To initiate streaming replication, the frontend sends the replication parameter in the startup message. A Boolean value of true tells the backend to go into walsender mode, wherein a small set of replication commands can be issued instead of SQL statements. Only the simple query protocol can be used in walsender mode. Replication commands are logged in the server log when log_replication_commands is enabled. Passing database as the value instructs walsender to connect to the database specified in the dbname parameter, which will allow the connection to be used for logical replication from that database.
For the purpose of testing replication commands, you can make a replication connection via psql or any other libpq-using tool with a connection string including the replication option, e.g.:
psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"
However, it is often more useful to use pg_receivexlog (for physical replication) or pg_recvlogical (for logical replication).
The commands accepted in walsender mode are:
IDENTIFY_SYSTEMRequests the server to identify itself. Server replies with a result set of a single row, containing four fields:
-
systemid(text) The unique system identifier identifying the cluster. This can be used to check that the base backup used to initialize the standby came from the same cluster.
-
timeline(int4) Current timeline ID. Also useful to check that the standby is consistent with the master.
-
xlogpos(text) Current xlog flush location. Useful to get a known location in the transaction log where streaming can start.
-
dbname(text) Database connected to or null.
-
TIMELINE_HISTORYtliRequests the server to send over the timeline history file for timeline
tli. Server replies with a result set of a single row, containing two fields. While the fields are labeled astextandbytea, they effectively return raw bytes, with no escaping or encoding conversion:-
filename(text) File name of the timeline history file, e.g.,
00000002.history.-
content(bytea) Contents of the timeline history file.
-
CREATE_REPLICATION_SLOTslot_name{PHYSICAL[RESERVE_WAL] |LOGICALoutput_plugin}Create a physical or logical replication slot. See Section 26.2.6 for more about replication slots.
slot_nameThe name of the slot to create. Must be a valid replication slot name (see Section 26.2.6.1).
output_pluginThe name of the output plugin used for logical decoding (see Section 47.6).
RESERVE_WALSpecify that this physical replication slot reserves WAL immediately. Otherwise, WAL is only reserved upon connection from a streaming replication client.
START_REPLICATION[SLOTslot_name] [PHYSICAL]XXX/XXX[TIMELINEtli]Instructs server to start streaming WAL, starting at WAL position
XXX/XXX. IfTIMELINEoption is specified, streaming starts on timelinetli; otherwise, the server's current timeline is selected. The server can reply with an error, for example if the requested section of WAL has already been recycled. On success, server responds with a CopyBothResponse message, and then starts to stream WAL to the frontend.If a slot's name is provided via
slot_name, it will be updated as replication progresses so that the server knows which WAL segments, and ifhot_standby_feedbackis on which transactions, are still needed by the standby.If the client requests a timeline that's not the latest but is part of the history of the server, the server will stream all the WAL on that timeline starting from the requested start point up to the point where the server switched to another timeline. If the client requests streaming at exactly the end of an old timeline, the server responds immediately with CommandComplete without entering COPY mode.
After streaming all the WAL on a timeline that is not the latest one, the server will end streaming by exiting the COPY mode. When the client acknowledges this by also exiting COPY mode, the server sends a result set with one row and two columns, indicating the next timeline in this server's history. The first column is the next timeline's ID (type
int8), and the second column is the WAL position where the switch happened (typetext). Usually, the switch position is the end of the WAL that was streamed, but there are corner cases where the server can send some WAL from the old timeline that it has not itself replayed before promoting. Finally, the server sends CommandComplete message, and is ready to accept a new command.WAL data is sent as a series of CopyData messages. (This allows other information to be intermixed; in particular the server can send an ErrorResponse message if it encounters a failure after beginning to stream.) The payload of each CopyData message from server to the client contains a message of one of the following formats:
- XLogData (B)
- Byte1('w')
Identifies the message as WAL data.
- Int64
The starting point of the WAL data in this message.
- Int64
The current end of WAL on the server.
- Int64
The server's system clock at the time of transmission, as microseconds since midnight on 2000-01-01.
- Byte
n A section of the WAL data stream.
A single WAL record is never split across two XLogData messages. When a WAL record crosses a WAL page boundary, and is therefore already split using continuation records, it can be split at the page boundary. In other words, the first main WAL record and its continuation records can be sent in different XLogData messages.
- Primary keepalive message (B)
- Byte1('k')
Identifies the message as a sender keepalive.
- Int64
The current end of WAL on the server.
- Int64
The server's system clock at the time of transmission, as microseconds since midnight on 2000-01-01.
- Byte1
1 means that the client should reply to this message as soon as possible, to avoid a timeout disconnect. 0 otherwise.
The receiving process can send replies back to the sender at any time, using one of the following message formats (also in the payload of a CopyData message):
- Standby status update (F)
- Byte1('r')
Identifies the message as a receiver status update.
- Int64
The location of the last WAL byte + 1 received and written to disk in the standby.
- Int64
The location of the last WAL byte + 1 flushed to disk in the standby.
- Int64
The location of the last WAL byte + 1 applied in the standby.
- Int64
The client's system clock at the time of transmission, as microseconds since midnight on 2000-01-01.
- Byte1
If 1, the client requests the server to reply to this message immediately. This can be used to ping the server, to test if the connection is still healthy.
- Hot Standby feedback message (F)
- Byte1('h')
Identifies the message as a Hot Standby feedback message.
- Int64
The client's system clock at the time of transmission, as microseconds since midnight on 2000-01-01.
- Int32
The standby's current xmin. This may be 0, if the standby is sending notification that Hot Standby feedback will no longer be sent on this connection. Later non-zero messages may reinitiate the feedback mechanism.
- Int32
The standby's current epoch.
START_REPLICATIONSLOTslot_nameLOGICALXXX/XXX[ (option_name[option_value] [, ...] ) ]Instructs server to start streaming WAL for logical replication, starting at WAL position
XXX/XXX. The server can reply with an error, for example if the requested section of WAL has already been recycled. On success, server responds with a CopyBothResponse message, and then starts to stream WAL to the frontend.The messages inside the CopyBothResponse messages are of the same format documented for
START_REPLICATION ... PHYSICAL.The output plugin associated with the selected slot is used to process the output for streaming.
SLOTslot_nameThe name of the slot to stream changes from. This parameter is required, and must correspond to an existing logical replication slot created with
CREATE_REPLICATION_SLOTinLOGICALmode.XXX/XXXThe WAL position to begin streaming at.
option_nameThe name of an option passed to the slot's logical decoding plugin.
option_valueOptional value, in the form of a string constant, associated with the specified option.
DROP_REPLICATION_SLOTslot_nameDrops a replication slot, freeing any reserved server-side resources. If the slot is currently in use by an active connection, this command fails.
slot_nameThe name of the slot to drop.
BASE_BACKUP[LABEL'label'] [PROGRESS] [FAST] [WAL] [NOWAIT] [MAX_RATErate] [TABLESPACE_MAP]Instructs the server to start streaming a base backup. The system will automatically be put in backup mode before the backup is started, and taken out of it when the backup is complete. The following options are accepted:
LABEL'label'Sets the label of the backup. If none is specified, a backup label of
base backupwill be used. The quoting rules for the label are the same as a standard SQL string with standard_conforming_strings turned on.PROGRESSRequest information required to generate a progress report. This will send back an approximate size in the header of each tablespace, which can be used to calculate how far along the stream is done. This is calculated by enumerating all the file sizes once before the transfer is even started, and might as such have a negative impact on the performance. In particular, it might take longer before the first data is streamed. Since the database files can change during the backup, the size is only approximate and might both grow and shrink between the time of approximation and the sending of the actual files.
FASTRequest a fast checkpoint.
WALInclude the necessary WAL segments in the backup. This will include all the files between start and stop backup in the
pg_xlogdirectory of the base directory tar file.NOWAITBy default, the backup will wait until the last required WAL segment has been archived, or emit a warning if log archiving is not enabled. Specifying
NOWAITdisables both the waiting and the warning, leaving the client responsible for ensuring the required log is available.MAX_RATErateLimit (throttle) the maximum amount of data transferred from server to client per unit of time. The expected unit is kilobytes per second. If this option is specified, the value must either be equal to zero or it must fall within the range from 32 kB through 1 GB (inclusive). If zero is passed or the option is not specified, no restriction is imposed on the transfer.
TABLESPACE_MAPInclude information about symbolic links present in the directory
pg_tblspcin a file namedtablespace_map. The tablespace map file includes each symbolic link name as it exists in the directorypg_tblspc/and the full path of that symbolic link.
When the backup is started, the server will first send two ordinary result sets, followed by one or more CopyResponse results.
The first ordinary result set contains the starting position of the backup, in a single row with two columns. The first column contains the start position given in XLogRecPtr format, and the second column contains the corresponding timeline ID.
The second ordinary result set has one row for each tablespace. The fields in this row are:
spcoid(oid)The OID of the tablespace, or null if it's the base directory.
spclocation(text)The full path of the tablespace directory, or null if it's the base directory.
size(int8)The approximate size of the tablespace, if progress report has been requested; otherwise it's null.
After the second regular result set, one or more CopyResponse results will be sent, one for the main data directory and one for each additional tablespace other than
pg_defaultandpg_global. The data in the CopyResponse results will be a tar format (following the “ustar interchange format” specified in the POSIX 1003.1-2008 standard) dump of the tablespace contents, except that the two trailing blocks of zeroes specified in the standard are omitted. After the tar data is complete, a final ordinary result set will be sent, containing the WAL end position of the backup, in the same format as the start position.The tar archive for the data directory and each tablespace will contain all files in the directories, regardless of whether they are Postgres Pro files or other files added to the same directory. The only excluded files are:
postmaster.pidpostmaster.optsvarious temporary files created during the operation of the Postgres Pro server
pg_xlog, including subdirectories. If the backup is run with WAL files included, a synthesized version ofpg_xlogwill be included, but it will only contain the files necessary for the backup to work, not the rest of the contents.pg_replslotis copied as an empty directory.Files other than regular files and directories, such as symbolic links and special device files, are skipped. (Symbolic links in
pg_tblspcare maintained.)
Owner, group, and file mode are set if the underlying file system on the server supports it.