49.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_HISTORY
tli
Запрашивает с сервера файл истории для линии времени
лин_врем
. Сервер возвращает набор результатов в одной строке, содержащей два поля. Эти поля обозначены как имеющие типыtext
иbytea
, но фактически они содержат просто байты, не в текстовой кодировке и без экранирования:filename
(text
)Имя файла с историей линии времени, например
00000002.history
.content
(bytea
)Содержимое файла с историей линией времени.
CREATE_REPLICATION_SLOT
имя_слота
{PHYSICAL
[RESERVE_WAL
] |LOGICAL
модуль_вывода
}Создаёт слот физической или логической репликации. Слоты репликации описаны подробно в Подразделе 25.2.6.
имя_слота
Имя создаваемого слота. Заданное имя должно быть допустимым для слота репликации (см. Подраздел 25.2.6.1).
модуль_вывода
Имя модуля вывода, применяемого для логического декодирования (см. Раздел 45.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_REPLICATION
SLOT
имя_слота
LOGICAL
XXX/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.pid
postmaster.opts
различные временные файлы, создаваемые в процессе работы сервером Postgres Pro
pg_xlog
, включая подкаталоги. Если в резервную копию включаются файлы WAL, в архив входит преобразованная версияpg_xlog
, в которой будут находиться только файлы, необходимые для восстановления копии, но не всё остальное содержимое этого каталога.pg_replslot
копируется в виде пустого каталога.файлы, отличные от обычных файлов и каталогов, например, символические ссылки и файлы специальных устройств, пропускаются. (Символические ссылки в
pg_tblspc
сохраняются.)
Если файловая система сервера поддерживает это, в архив включается информация о владельце, группе и режиме файла.