52.4. 流复制协议

为了启动流复制,前端在启动消息中发送replication参数。布尔值true指示后端进入 walsender 模式,在该模式下,可以发出一小组复制命令代替 SQL 语句。 walsender 模式下只能使用简单查询协议。启用log_replication_commands时,复制命令记录在服务器日志中。传递database作为值指示 walsender 连接到dbname参数中指定的数据库,这将允许该连接用于从该数据库进行逻辑复制。

为了测试复制命令,您可以通过 psql 或任何其他libpq-使用带有包括replication选项的连接字符串的工具进行复制连接,例如:

psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;"

但是,使用pg_receivewal(用于物理复制)或pg_recvlogical(用于逻辑复制)通常更有用。

walsender 模式下接受的命令是:

响应此命令,服务器将发送包含以下字段的单行结果集:

如果插槽的名称是通过* slot_name *提供的,它将在复制过程中进行更新,以便服务器知道备用数据库仍需要哪些 WAL 段,以及hot_standby_feedback是否在哪些事务上。

如果 Client 端请求的时间线不是最新的,而是服务器历史的一部分,则服务器将从该请求的开始点到服务器切换到另一个时间线的那一点,流式传输该时间线上的所有 WAL。如果 Client 端恰好在旧时间轴的末尾请求流传输,则服务器将立即使用 CommandComplete 进行响应,而无需进入 COPY 模式。

在不是最新时间线的时间线上流式传输所有 WAL 之后,服务器将退出 COPY 模式以结束流式传输。当 Client 端通过也退出 COPY 模式确认这一点时,服务器将发送一个包含一行和两列的结果集,以指示该服务器历史 Logging 的下一个时间轴。第一列是下一个时间轴的 ID(类型int8),第二列是发生切换的 WAL 位置(类型text)。通常,切换位置是流式传输的 WAL 的结尾,但是在极端情况下,服务器可以从旧时间轴发送一些 WAL,而该时间线本身在升级之前还没有重播。最后,服务器发送 CommandComplete 消息,并准备接受新命令。

WAL 数据作为一系列 CopyData 消息发送。 (这允许其他信息混合在一起;特别是如果服务器在开始流传输后遇到故障,则服务器可以发送 ErrorResponse 消息.)从服务器到 Client 端的每个 CopyData 消息的有效负载均包含以下格式之一的消息:

单个 WAL 记录永远不会拆分为两个 XLogData 消息。当 WAL 记录越过 WAL 页面边界并因此已经使用连续记录进行拆分时,可以在页面边界处对其进行拆分。换句话说,可以在不同的 XLogData 消息中发送第一个主 WAL 记录及其延续记录。

接收过程可以随时使用以下消息格式之一(也位于 CopyData 消息的有效负载中)将答复发送回发送方:

CopyBothResponse 消息内的消息与START_REPLICATION ... PHYSICAL记录的格式相同。

与所选插槽关联的输出插件用于处理输出以进行流传输。

开始备份时,服务器将首先发送两个普通结果集,然后发送一个或多个 CopyResponse 结果。

第一个普通结果集在两行的单行中包含备份的起始位置。第一列包含以 XLogRecPtr 格式给出的开始位置,第二列包含相应的时间轴 ID。

第二个普通结果集每个表空间都有一行。该行中的字段是:

在第二个常规结果集之后,将发送一个或多个 CopyResponse 结果,一个用于主数据目录,一个用于除pg_defaultpg_global之外的每个其他表空间。表空间内容的转储将为 CopyResponse 结果中的数据为 tar 格式(遵循 POSIX 1003.1-2008 标准中指定的“ ustar 交换格式”),但省略了该标准中指定的两个结尾的零块。 tar 数据完成后,将以与起始位置相同的格式发送最终普通结果集,其中包含备份的 WAL 结束位置。

数据目录和每个表空间的 tar 归档文件将包含目录中的所有文件,无论它们是 PostgreSQL 文件还是添加到同一目录的其他文件。唯一排除的文件是:

如果服务器上的基础文件系统支持,则设置所有者,组和文件模式。

上一章 首页 下一章