pg_rewind是一个用于在PostgreSQL集群时间线分歧后同步集群的工具,尤其适用于故障转移场景。它通过扫描目标集群WAL日志并复制源集群的更改块来实现增量恢复,避免了全量复制。
pg_rewind使一个PostgreSQL数据目录与另一个数据目录(该目录从第一个PostgreSQL数据目录创建而来)一致。
典型的案例是旧主服务器在故障转移后重新联机,将其作为新主机之后的备用服务器。
权限要求:pg_rewind需要使用高权限用户,pg新版本可以授权,pg老版本最好用超级用户。
参数要求:使用pg_rewind要求wal_log_hints开启且full_page_writes设为on
数据库开启 checksums 或者设置wal_log_hints参数为on,一般采用后者
1. 优点
与base backup或使用 rsync 等工具不同,pg_rewind不需要比较或复制群集中未更改的关系块。仅复制现有关系文件中更改的块和所有其他文件(包括new relation files, configuration files, and WAL segments)将完整复制。因此,当数据库很大且群集之间只有一小部分块不同时,pg_rewind操作比其他方法快得多。
使用 pg_rewind 不限于故障转移,可以promote备用服务器,运行一些写入事务,然后重新回卷,再次成为备用服务器。
2. 使用要求
需要目标服务器设置wal_log_hints为on或者initdb时启用了data checksums
此外需要将full_page_writes设置为on(默认值on)
alter system set wal_log_hints = on; ---默认off
alter system set full_page_writes = on; --默认on
注意,使用pg_rewind需要提前配置参数
3. 工作原理
基本思想是将所有文件系统级别的更改从源群集复制到目标群集
1. 确定新Master和旧Master数据一致性的Checkpoint位置(时间线分叉点之前的最近一个checkpoint)。在该位置上, 新Master和旧Master数据完全一致。 这可以通过读取新旧Master节点时间线历史文件可以获得,该文件位于$PGDATA/pg_wal/目录下,文件名称为XX.history
2. 旧Master节点根据上一步获取的Checkpoint读取本机日志文件WAL Record,获取在此Checkpoint之后出现变化的Block,生成目标群集中更改的所有数据块的列表。(以链表的方式存储Block编号等信息)
3. 根据第2步获取的Block信息从新Master节点拷贝相应的更改的Block到目标群集,替换旧Master节点相应的Block
4. 拷贝新Master节点上除数据文件外的所有其他文件,包括new relation files, WAL segments, pg_xact, and configuration files
5. 旧Master启动数据库,创建一个backup_lable文件,从failover的checkpoint开始,重放wal日志并更改pg_control文件的LSN信息,使数据库恢复到一致状态。
第5步 旧Master启动数据库 有待查看日志验证
4. 使用示例
- 故障转移后,重新启动旧主机作为新的备用服务器。
启动报错,出现了时间线分叉
LOG: entering standby mode
FATAL: requested timeline 2 is not a child of this server's history
DETAIL: Latest checkpoint is at 0/6000028 on timeline 1, but in the history of the requested timeline, the server forked off from that timeline at 0/4000098.
LOG: startup process (PID 22321) exited with exit code 1
LOG: aborting startup due to startup process failure
LOG: database system is shut down此时需要用pg_rewind重新拉齐一次主备
2、配置新主pg_hba
配置pg_rewind的登陆用户登陆源库许可,注意配置后reload生效
vi pg_hba.conf
host all pg 172.17.100.150/32 trustpg_rewind需要使用高权限用户,pg新版本可以授权,pg老版本最好用超级用户。
3.wal_log_hints = on参数配置
将wal_log_hints = on追加到目标库postgres.conf,重新启动并关闭目标库
或 启动目标库修改再关闭
alter system set wal_log_hints = on; ---默认off
alter system set full_page_writes = on; --默认on
4、pg_rewind命令执行
注意:执行前先备份目标库的数据
pg_rewind --target-pgdata /opt/pg106/data --source-server='host=192.168.6.142 port=5970 user=pg106 dbname=postgres' -P
5、配置备库参数
更改postgres.conf和recovery.conf中的IP、端口、目录等配置,pg_rewind会把配置文件也cp过来
mv recovery.done recovery.conf
vi recovery.conf
vi postgres.conf
启动备库
pg_ctl -D /pg/pg96data_sla -l /pg/pg96data_sla/server.log start
注意,
mv recovery.done recovery.conf
vi recovery.conf
- pg_rewind 会将 recovery.conf 拷贝为 recovery.done。如果主库有的recovery.done文件,则会复制到备库并覆盖文件。此时重新修改recovery.done并重命名为recovery.conf
- 此外,数据库同步出现日志断档,无法使用pg_rewind增量追加数据
断档报错
pg_rewind --target-pgdata /opt/pg106/data --source-server='host=192.168.6.141 port=5970 user=pg106 dbname=postgres' -P
编辑

5、要求说明
pg_rewind对权限的要求
pg_rewind工具其实只依赖如下以下四个文件读取系统函数的权限:
pg_ls_dir()
pg_read_file()
pg_read_binary_file()
pg_stat_file()
这四个函数在PostgreSQL 11版本之前只能超级用户才有权限使用。从PostgreSQL 11开始,pg_rewind可以不依赖超级用户只需要分配这几个系统函数权限。
部分摘自pg_rewind_pg rewind-CSDN博客




