流复制协议中适当的备用状态更新
Proper standby status update in streaming replication protocol
问题是关于 streaming replication protocol。
这非常简单,专为物理复制而设计,能够:
- 发送服务器状态 >
Primary keepalive message
- 正在接收副本状态 >
Standby status update
- 发送WAL数据>
XLogData
还有逻辑解码,使用相同的 XLogData 帧发送由插件从 WAL 解码的数据,例如 pglogical
而不是原始 WAL。
Streaming Replication 希望我提交待机状态更新,以释放资源并删除旧的 WAL,根据文档
The location of the last WAL byte + 1 ...
pglogical
returns 它自己的 LSN 位置在 XLogData 帧中使用它自己的消息,但这些不可用。
当数据写入不同的数据库时,逻辑解码不起作用。并且slot位置还需要更新,否则slot会丢失。
因此,唯一的方法是从 Primary keepalive message
发送 LSN 位置,根据文档发送
The current end of WAL on the server.
这令人困惑。如果插槽在位置 100 而服务器已经在 200 怎么办?
所以,
经过试验和查看pg_recvlogical的来源,明白了,Primary keepalive message
并不是说“服务器上WAL的当前端”,而是实际上是从slot位置逐渐增加到当前 (pg_current_wal_lsn()
) 服务器 LSN。中间有 XLogData 帧(如果有的话)。
好像消息是按 LSN 顺序接收的。
现在,问题:
Q1) 是否在某处记录了它?
Q2) 有意义吗?我是不是误会了什么?
Q3) 流消息总是按 LSN 排序吗?
Q4) 从 Primary keepalive message
提交职位可以吗?
根据this
writePtr is the location up to which the WAL is sent. It is essentially
the same as sentPtr but in some cases, we need to send keep alive before
sentPtr is updated like when skipping empty transactions.
然后写入
pq_sendint64(&output_message, XLogRecPtrIsInvalid(writePtr) ? sentPtr : writePtr);
这意味着,WAL 在服务器上的当前端。 实际上是WAL 发送到的位置
问题是关于 streaming replication protocol。 这非常简单,专为物理复制而设计,能够:
- 发送服务器状态 >
Primary keepalive message
- 正在接收副本状态 >
Standby status update
- 发送WAL数据>
XLogData
还有逻辑解码,使用相同的 XLogData 帧发送由插件从 WAL 解码的数据,例如 pglogical
而不是原始 WAL。
Streaming Replication 希望我提交待机状态更新,以释放资源并删除旧的 WAL,根据文档
The location of the last WAL byte + 1 ...
pglogical
returns 它自己的 LSN 位置在 XLogData 帧中使用它自己的消息,但这些不可用。
当数据写入不同的数据库时,逻辑解码不起作用。并且slot位置还需要更新,否则slot会丢失。
因此,唯一的方法是从 Primary keepalive message
发送 LSN 位置,根据文档发送
The current end of WAL on the server.
这令人困惑。如果插槽在位置 100 而服务器已经在 200 怎么办?
所以,
经过试验和查看pg_recvlogical的来源,明白了,Primary keepalive message
并不是说“服务器上WAL的当前端”,而是实际上是从slot位置逐渐增加到当前 (pg_current_wal_lsn()
) 服务器 LSN。中间有 XLogData 帧(如果有的话)。
好像消息是按 LSN 顺序接收的。
现在,问题:
Q1) 是否在某处记录了它?
Q2) 有意义吗?我是不是误会了什么?
Q3) 流消息总是按 LSN 排序吗?
Q4) 从 Primary keepalive message
提交职位可以吗?
根据this
writePtr is the location up to which the WAL is sent. It is essentially
the same as sentPtr but in some cases, we need to send keep alive before
sentPtr is updated like when skipping empty transactions.
然后写入
pq_sendint64(&output_message, XLogRecPtrIsInvalid(writePtr) ? sentPtr : writePtr);
这意味着,WAL 在服务器上的当前端。 实际上是WAL 发送到的位置