首页 > 解决方案 > Postgres 复制失败“新时间线 y 在当前恢复点之前从当前数据库系统时间线 x 分叉”

问题描述

我们有一个 PostgreSQL 设置,每个可用区中有 3 个节点,每个可用区都跨可用区复制。所有复制都是带异步复制的热备用。我们为每个从属 AZ 集群利用复制槽。

我们经常对数据库容器进行自动滚动升级。一段时间后,从服务器停止从主集群复制,并显示如下消息:

2019-08-06 16:57:11.061 UTC [2987482] LOG:  replication terminated by primary 
server
2019-08-06 16:57:11.061 UTC [2987482] DETAIL:  End of WAL reached on timeline 3 
at 0/293D7AE0.
2019-08-06 16:57:11.136 UTC [2987477] LOG:  new timeline 4 forked off current 
database system timeline 3 before current recovery point 0/293D7D28

我正在寻找一些指针来解决这个问题。

我们尝试将每个集群缩小到每个 AZ 中的单个节点,但我们在那里没有看到这个问题。我的理解是,由于跨 AZ 的复制是通过前面的代理进行的,因此在滚动升级期间,一旦 master 发生变化,slave 不确定如何继续复制。

我想了解在复制过程中是否有一些东西可以处理这样的事情。

从服务器上的 recovery.conf 看起来像:

standby_mode = 'on'
primary_conninfo = 'host=foo-bar.com port=5432 user=repluser password= 
sslmode=verify-ca sslcert=/etc/db_repl_secrets/tls.crt 
sslkey=/etc/db_repl_secrets/tls.key sslrootcert=/etc/db_repl_secrets/ca.crt'
primary_slot_name = 'stolon_us_east_1'
recovery_target_timeline = 'latest'

标签: postgresqldatabase-replication

解决方案


该消息可能表明备用服务器在赶上主服务器之前已升级,现在主服务器无法担任备用服务器的角色。

pg_rewind在将其用作备用服务器之前,您是否在服务器上运行过?

如果我的解释不成立,请更详细地描述您的程序。


推荐阅读