暂无图片
pg_rewind的使用的例子
我来答
分享
暂无图片 匿名用户
pg_rewind的使用的例子

原来一主一从的流复制,异步模式下


168 是主,169 是从


原来主从都正常

模拟主库硬件坏了,需要切换,让老的备库169变成了主,这个时候,模拟主库插入部分数据(为了模拟生产有写业务),之后老主库168 硬件修复好了,现在要变成新的备库,pg_rewind 报错,提示时间线不一致,无法成功

请问这个场景有没有具体的实验步骤指导一下,

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
soul0202

在 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 进行数据同步前,请确保目标节点有足够的磁盘空间。
在整个过程中,建议定期备份关键数据以防万一出现问题。
按照上述步骤操作后,你应该能够成功地将原主库转换为新的备库,并解决由于时间线不一致导致的问题。

暂无图片 评论
暂无图片 有用 5
打赏 0
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏