
原来一主一从的流复制,异步模式下
168 是主,169 是从
原来主从都正常
模拟主库硬件坏了,需要切换,让老的备库169变成了主,这个时候,模拟主库插入部分数据(为了模拟生产有写业务),之后老主库168 硬件修复好了,现在要变成新的备库,pg_rewind 报错,提示时间线不一致,无法成功
请问这个场景有没有具体的实验步骤指导一下,

在 PostgreSQL 中,当你遇到主库故障后切换到备库,并且希望原来的主库恢复为新的备库时,确实可能会遇到时间线不一致的问题。这种情况下,可以使用 pg_rewind 工具来同步数据,但前提是需要确保一些前提条件得到满足。
下面是一个详细的实验步骤指南,帮助你在上述场景中完成从旧主库恢复为新备库的过程:
实验环境准备
主数据库服务器 IP: 192.168.1.168 (原主)
备数据库服务器 IP: 192.168.1.169 (原备)
步骤 1:模拟主库硬件故障并切换到备库
在原主库上停止服务
Bash
sudo systemctl stop postgresql
在原备库上提升为新的主库
编辑 postgresql.conf 文件:
Bash
hot_standby = off
然后重启服务:
Bash
sudo systemctl restart postgresql
步骤 2:在新主库(原备库)上插入测试数据
登录到新的主库,插入一些测试数据以模拟生产环境中正在进行的写操作。
Sql
psql -U your_user -d your_database
INSERT INTO test_table VALUES ('new data');
步骤 3:修复原主库硬件并启动服务
在原主库上启动服务:
Bash
sudo systemctl start postgresql
步骤 4:配置原主库为新的备库
停止原主库的服务
Bash
sudo systemctl stop postgresql
清空原主库的数据目录
注意:这一步会丢失所有本地数据,请确保你不需要这些数据
Bash
rm -rf /var/lib/postgresql/data/*
使用 pg_rewind 同步数据
首先,在新主库上创建一个基础备份用于 pg_rewind:
Bash
pg_basebackup -h 192.168.1.169 -D /tmp/base_backup -U replication_user --wal-method=stream
然后,在原主库上执行 pg_rewind:
Bash
pg_rewind --target-pgdata=/var/lib/postgresql/data --source-server='host=192.168.1.169 port=5432 user=replication_user password=your_password'
如果遇到时间线不一致的问题,你需要检查 WAL 日志文件的时间线ID。你可以通过以下命令查看每个实例的日志文件夹中的 timelinehistory 文件:
Bash
cat /var/lib/postgresql/data/pg_wal/timeline_history/*
步骤 5:重新配置原主库作为新的备库
编辑 recovery.conf 文件:
Bash
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.169 port=5432 user=replication_user password=your_password'
trigger_file = '/tmp/postgresql.trigger.5432'
最后,启动原主库的服务:
Bash
sudo systemctl start postgresql
注意事项
确保两个节点之间的网络连接稳定可靠。
使用 pg_rewind 进行数据同步前,请确保目标节点有足够的磁盘空间。
在整个过程中,建议定期备份关键数据以防万一出现问题。
按照上述步骤操作后,你应该能够成功地将原主库转换为新的备库,并解决由于时间线不一致导致的问题。


