暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL Protocol v3.0 — 流复制(三)

原创 KaiwuDB 2024-02-26
242

系列目录

深度解析 PostgreSQL Protocol v3.0 — 综述(上)
深度解析 PostgreSQL Protocol v3.0 — 综述(下)
深度解析 PostgreSQL Protocol v3.0 — 扩展查询(上)
深度解析 PostgreSQL Protocol v3.0 — 扩展查询(下)

引言

PostgreSQL 使用基于消息的协议在前端(客户端)和后端(服务器)之间进行通信。该协议通过 TCP/IP 和 Unix 域套接字支持。

《深度解析 PostgreSQL Protocol v3.0》系列技术贴,将带大家深度了解 PostgreSQL Protocol v3.0(在 PostgreSQL 7.4 及更高版本中实现,有关早期协议版本的描述请参考 PostgreSQL 文档的早期版本,该系列文章不予赘述)相关的消息传输格式和格式码、消息支持的数据类型、消息的格式、协议交互流程、错误消息和通知消息、支持的子协议等,相关的代码解读基于 PostgreSQL 代码仓库的 REL_14_STABLE 分支。

逻辑流复制协议

逻辑复制协议,是由 START_REPLICATION SLOT slot_name LOGICAL 复制命令启动的消息流。逻辑流复制协议建立在物理流复制协议的基础之上。

1.逻辑流复制参数

逻辑复制 START_REPLICATION 命令接受以下参数:

•proto_version:协议版本。目前支持版本1和版本2。版本2仅支持服务器版本14及更高版本,并且它允许对正在进行的大型事务进行流式传输。

•publication_names:要订阅(接收更改)的发布名称的逗号分隔列表。各个发布名称被视为标准对象名称,并且可以根据需要引用相同的名称。

2.逻辑复制协议消息

所有顶层协议消息都以消息类型字节作为开头。虽然在代码中表示为字符,但这是一个没有关联编码的带符号字节。由于流复制协议提供消息长度,因此顶层协议消息不需要在其标头中嵌入长度。

每个逻辑复制消息要么由复制槽SQL接口返回,要么由walsender发送。在walsender的情况下,它们被封装在复制协议WAL消息中,并且通常遵循与物理复制相同的消息流。
Begin
▪Byte1(‘B’):将消息标识为开始消息。
▪Int64:事务的最终LSN。
▪Int64:事务的提交时间戳。该值以PostgreSQL epoch(2000-01-01)以来的微秒为单位。
▪Int32:事务的Xid。

Message
▪Byte1(‘M’):将消息标识为逻辑解码消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int8:flags。0,表示没有标志;1表示逻辑解码消息是事务性的。
▪Int64:逻辑解码消息的LSN。
▪String:逻辑解码消息的前缀。
▪Int32:内容的长度。
▪Byten:逻辑解码消息的内容。

Commit
▪Byte1(‘C’):将消息标识为提交消息。
▪Int8:flags。当前未使用(必须为0)。
▪Int64:提交的LSN。
▪Int64:事务的结束LSN。
▪Int64:事务的提交时间戳。该值以PostgreSQL epoch(2000-01-01)以来的微秒为单位。

Origin
▪Byte1(‘O’):将消息标识为Origin消息。
▪Int64:源服务器上提交的LSN。
▪String:Origin名称。
请注意,在一个事务中可以有多个Origin消息。

Relation
▪Byte1(‘R’):将消息标识为Relation消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int32:Relation的ID。
▪String:命名空间(pg_catalog命名空间为空字符串)。
▪String:Relation名称。
▪Int8:Relation的副本标识设置(与pg_class中的relreplident相同)。
▪Int16:列数量。
接下来,每个列(生成的列除外)都会显示以下消息部分:
▪Int8:列的标志。当前可以为0表示没有标志,也可以为1表示将列标记为key的一部分。
▪String:列名称。
▪Int32:列的数据类型的ID。
▪Int32:列的类型修饰符(atttypmod)。

Type
▪Byte1(‘Y’):将消息标识为类型消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int32:数据类型的ID。
▪String:命名空间(pg_catalog命名空间为空字符串)。
▪String:数据类型的名称。

Insert
▪Byte1(‘I’):将消息标识为插入消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int32:与关系消息中的ID相对应的关系的ID。
▪Byte1(‘N’):将以下TupleData消息标识为新元组。
▪TupleData:表示新元组内容的TupleData消息部分。

Update
▪Byte1(‘U’):将消息标识为更新消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int32:与关系消息中的ID相对应的关系的ID。
▪Byte1(‘K’):将以下TupleData子消息标识为键。此字段是可选的,仅当更新操作更改了REPLICA IDENTITY索引中任何列中的数据时才出现。
▪Byte1(‘O’):将以下TupleData子消息标识为旧元组。此字段是可选的,仅当发生更新的表的REPLICA IDENTITY设置为FULL时才存在。
▪TupleData:表示旧元组或主键内容的TupleData消息部分。仅当存在前一个O或K部分时才存在。
▪Byte1(‘N’):将以下TupleData消息标识为新元组。
▪TupleData:表示新元组内容的TupleData消息部分。
更新消息可能包含K消息部分或O消息部分,也可能两者都不包含,但决不能同时包含两者。

Delete
▪Byte1(‘D’):将消息标识为删除消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int32:与关系消息中的ID相对应的关系的ID。
▪Byte1(‘K’):将以下TupleData子消息标识为键。如果发生删除的表使用了REPLICA IDENTITY的索引,则会出现此字段。
▪Byte1(‘O’):将以下TupleData消息标识为旧元组。如果发生删除的表的REPLICA IDENTITY设置为FULL,则会出现此字段。
▪TupleData:TupleData消息部分表示旧元组或主键的内容,具体取决于前一个字段。
Delete消息可能包含K消息部分或O消息部分,但决不能同时包含这两个部分。

Truncate
▪Byte1(‘T’):将消息标识为Truncate消息。
▪Int32:事务的Xid(仅用于流式事务)。此字段自协议版本2起可用。
▪Int32:关系的数量。
▪Int8:TRUNCATE的选项位:1用于CASCADE,2用于RESTART IDENTITY。
▪Int32:与关系消息中的ID相对应的关系的ID。对于每个关系,都会重复此字段。
自协议版本2以来,以下消息(流启动、流停止、流提交和流中止)可用。

Stream Start
▪Byte1(‘S’):将消息标识为流启动消息。
▪Int32:事务的Xid。
▪Int8:值1表示这是该XID的第一个流段,0表示任何其他流段。

Stream Stop
▪Byte1(‘E’):将消息标识为流停止消息。

Stream Commit
▪Byte1(‘c’):将消息标识为流提交消息。
▪Int32:事务的Xid。
▪Int8:标识。当前未使用(必须为0)。
▪Int64:提交的LSN。
▪Int64:事务的结束LSN。
▪Int64:事务的提交时间戳。该值以PostgreSQL epoch(2000-01-01)以来的微秒为单位。

Stream Abort
▪Byte1(‘A’):将消息标识为流中止消息。
▪Int32:事务的Xid。
▪Int32:子事务的Xid(对于顶级事务,将和事务的Xid相同)。
以下消息部分由上述消息共享:
TupleData
▪Int16:列数。

接下来,每列(生成的列除外)都会显示以下子消息之一:
•Byte1(‘n’):将数据标识为NULL值。
•Byte1(‘u’):标识未更改的TOASTed值(不发送实际值)。
•Byte1(‘t’):将数据标识为文本格式的值。
•Byte1(‘b’):将数据标识为二进制格式的值。
▪Int32:列值的长度。
▪Byten:列的值,可以是二进制格式,也可以是文本格式。(如前面格式字节中所指定的)。n是上述列值长度。

最后修改时间:2024-02-26 17:25:21
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论