[英]Proper standby status update in streaming replication protocol
问题是关于流复制协议。 这非常简单,专为物理复制而设计,能够:
Primary keepalive message
Standby status update
XLogData
还有逻辑解码,使用相同的 XLogData 帧发送插件从 WAL 解码的数据,例如pglogical
而不是原始 WAL。
Streaming Replication 希望我提交备用状态更新,以释放资源并删除旧的 WAL,根据文档
最后一个 WAL 字节的位置 + 1...
pglogical
在 XLogData 帧中使用它自己的消息返回它自己的 LSN 位置,但这些是不可用的。
当数据写入不同的数据库时,逻辑解码不起作用。 而slot position还需要更新,否则slot会丢失。 因此,唯一的方法是从Primary keepalive message
发送 LSN 位置,根据文档发送
服务器上 WAL 的当前端。
这令人困惑。 如果插槽在 position 100 而服务器已经在 200 上怎么办?
在试验和检查 pg_recvlogical 的来源之后,了解到, Primary keepalive message
并不意味着“服务器上 WAL 的当前结束”,但实际上从插槽 position 逐渐增加到当前( pg_current_wal_lsn()
)服务器 LSN。 中间有 XLogData 帧(如果有的话)。 似乎,消息是按 LSN 顺序接收的。
现在,问题:
Q1)它是否记录在某处?
Q2)有意义吗? 我误解了什么吗?
Q3) 流消息总是按 LSN 排序吗?
Q4) 可以从Primary keepalive message
中提交位置吗?
writePtr 是 WAL 发送到的位置。 它本质上是
与 sentPtr 相同,但在某些情况下,我们需要先发送 keep alive
sentPtr 像跳过空交易时一样更新。
然后写在
pq_sendint64(&output_message, XLogRecPtrIsInvalid(writePtr) ? sentPtr : writePtr);
这意味着,服务器上 WAL 的当前端。 实际上是 WAL 被发送到的位置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.