繁体   English   中英

流复制协议中适当的备用状态更新

[英]Proper standby status update in streaming replication protocol

问题是关于流复制协议 这非常简单,专为物理复制而设计,能够:

  • 发送服务器状态 > Primary keepalive message
  • 接收副本状态 > Standby status update
  • 发送 WAL 数据 > 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM