配置:Postgres 9.6,具有 3 个集群节点。db1 是主服务器,db2 和 db3 是副本服务器。WAL 文件使用自定义工具存档在 AWS S3 中pgrsync。集群由守护神管理。并在所有节点上正确配置archive_command。restore_command
模拟:在 db1 上,执行大量写入(例如真空大表),然后通过 停止 db1 sudo systemctl stop patroni。db3 成为新的领导者。db2 请求更多 WAL 文件,这些文件是通过 AWS S3 的正确恢复命令获取的,成为 db3 的副本。
现在,通过( sudo systemctl start patroni)再次启动db1。但是 db1(旧的领导者和新的副本)永远不会作为副本出现并给出错误消息:
无法从 WAL 流接收数据:错误:请求的 WAL 段 0000002400053C55000000AE 已被删除。
此错误消息由 db3(领导者)报告,而 db1 仅记录该消息。
那么,让我们看看时间表。最初 db1 位于时间线 35 (0x23) 并写入以下文件进行存档:
0000002300053C55000000AE (TL is 23 and archive at 53C55/AE)
..
0000002300053C5600000043 (TL is 23 and archive at 53C56/43)
Run Code Online (Sandbox Code Playgroud)
db1 此时已停止。db3 的日志显示: …