Postgresql 中文操作指南

55.5. Logical Streaming Replication Protocol #

本节介绍逻辑复制协议,该协议是由 START_REPLICATION SLOT slot_name LOGICAL 复制命令启动的消息流。

逻辑流式复制协议建立在物理流式复制协议的基本原理之上。

PostgreSQL 逻辑解码支持输出插件。pgoutput 是用于内置逻辑复制的标准插件。

55.5.1. Logical Streaming Replication Parameters #

使用 START_REPLICATION 命令,pgoutput 接受以下选项:

  • proto_version

    • 协议版本。当前版本 1234 受支持。需要有效版本。

    • 版本 2 仅受服务器版本 14 及更高版本支持,它允许流式传输大型进行中的事务。

    • 版本 3 仅受服务器版本 15 及更高版本支持,它允许流式传输两阶段提交。

    • 版本 4 仅受服务器版本 16 及更高版本支持,它允许并行应用大型进行中的事务的流。

  • publication_names

    • 用于订阅(接收更改)的出版物名称的分隔逗号列表。各出版物名称被视为标准对象名称,可根据需要以相同的方式加上引号。至少需要一个出版物名称。

  • binary

    • 使用二进制传输模式的布尔选项。二进制模式比文本模式更快,但稍微不够健壮。

  • messages

    • 启用发送由 pg_logical_emit_message 写入的消息的布尔选项。

  • streaming

    • 启用正在进行中的事务流的布尔选项。它接受一个附加值“parallel”,以启用发送额外信息,其中某些消息将用于并行化。需要最低协议版本 2 才能启用它。对于“parallel”选项,需要最低协议版本 4。

  • two_phase

    • 启用两阶段事务的布尔选项。需要最低协议版本 3 才能启用它。

  • origin

    • 按其来源发送更改的选项。可能的值为“none”,仅发送没有关联来源的更改,或“any”,无论其来源如何发送更改。这可用于避免复制节点之间的循环(同一数据的无限复制)。

55.5.2. Logical Replication Protocol Messages #

下面的子部分将讨论单一协议消息。 Section 55.9中描述了单一消息。

所有顶级协议消息均以消息类型字节开头。尽管在代码中表示为字符,但它是一个带符号字节,没有关联的编码。

由于流复制协议提供了消息长度,因此无需顶级协议消息在它们的标头中嵌入长度。

55.5.3. Logical Replication Protocol Message Flow #

除了 START_REPLICATION 命令和重播进度消息之外,所有信息都只能从后端流向前端。

逻辑复制协议将单个事务逐个发送。这意味着在 Begin 和 Commit 消息对之间的所有消息都属于同一事务。类似地,在 Begin Prepare 和 Prepare 消息对之间的所有消息都属于同一事务。它还在 Stream Start 和 Stream Stop 消息对之间发送正在进行的大型事务的更改。此类事务的最后一个流包含 Stream Commit 或 Stream Abort 消息。

每个已发送的事务都包含零个或多个 DML 消息(插入、更新、删除)。如果是一个级联设置,它还可以包含 Origin 消息。origin 消息指示事务始于不同的复制节点。由于在逻辑复制协议的作用域中复制节点几乎可以是任何内容,因此唯一的标识符是 origin 名称。由下游根据需要(如果需要)处理此项内容。Origin 消息始终在事务中的任何 DML 消息之前发送。

每个 DML 消息都包含一个关系 OID,用于识别被操作的发布者的关系。对于给定关系 OID 的第一个 DML 消息之前,将发送一个 Relation 消息,描述该关系的架构。随后,如果关系的定义自上次发送给它的 Relation 消息后已更改,将发送一条新的 Relation 消息。(该协议假定客户端有能力记住尽可能多的关系的元数据。)

关系消息通过它们的 OID 标识列类型。在内置类型的情况下,假定客户端可以在本地查找该类型 OID,因此不需要其他数据。对于非内置类型 OID,将在 Relation 消息之前发送 Type 消息,以提供与此 OID 关联的类型名称。因此,需要特别识别关系列类型的客户端应缓存 Type 消息的内容,并首先查询该缓存以查看类型 OID 是否在那里定义。如果没有,则在本地查找类型 OID。