配置: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 的日志显示: …
环境:Postgresql 9.6.21。由patoni管理的多台备用服务器
+ Cluster: db11 (12345678901234567) ------+---------+-----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------+--------------+---------+-----+-----------+
| db11-01 | db11-01 | Leader | running | 113 | |
| db11-02 | db11-02 | Sync Standby | running | 113 | 0 |
| db11-03 | db11-03 | Sync Standby | running | 113 | 0 |
| db11-04 | db11-04 | Sync Standby | running | 113 | 8 |
+---------------+--------------+--------------+---------+-----+-----------+
Run Code Online (Sandbox Code Playgroud)
一些 pg_settings …