2026/2/22 3:05:29
网站建设
项目流程
快速网站备案,大庆网站建设公司哪家好,个人网页制作成品代码免费,区域文化网站建设方案在 PostgreSQL 主备切换#xff08;Failover#xff09;后#xff0c;旧的主库因为数据可能领先或与新主库#xff08;原备库#xff09;产生了分歧#xff0c;无法直接启动同步。pg_rewind 的作用是对比两者的 WAL 日志#xff0c;将旧主库“回滚”到分叉点#xff0c…在 PostgreSQL 主备切换Failover后旧的主库因为数据可能领先或与新主库原备库产生了分歧无法直接启动同步。pg_rewind 的作用是对比两者的 WAL 日志将旧主库“回滚”到分叉点使其能够以增量同步的方式重新加入集群避免了全量重做数据pg_basebackup的巨大开销。一、实现流程pg_rewind的工作可以分为五个关键阶段1. 扫描新主库的 WAL 日志pg_rewind首先读取新主库的 WAL 日志从当前时刻向上追溯直到找到与旧主库最后一次同步时的共同时间线位置。2. 扫描旧主库的数据文件这是最关键的一步。pg_rewind会读取旧主库从分叉点开始之后的所有 WAL 日志。它会解析这些 WAL 记录中的Data Page ID。记录下哪些数据页Page在分叉后被修改过了。将这些被修改过的块编号放入一个散列表中。3. 从新主库获取对应数据块一旦确定了旧主库中哪些块是“脏”的即分叉后修改过的pg_rewind就会连接到新主库仅请求这些特定块的最新副本。此时它会利用新主库的wal_log_hints参数或数据校验和因为这些机制强制 PostgreSQL 在 checkpoint 后的第一次修改时记录整个数据页的内容Full Page Writes。4. 覆盖旧主库的数据块将从新主库拷贝过来的“正确”数据页直接写入到旧主库对应的文件位置中。同时它还会同步一些系统文件如pg_control、pg_xact等。5. 复制新主库的 WAL 日志最后它会从新主库拷贝分叉点之后的所有 WAL 日志到旧主库的pg_wal目录。这是为了确保旧主库在下次启动时可以通过重放这些 WAL 日志来实现数据的最终一致性。二、pg_rewind 恢复示例以下是使用 pg_rewind 恢复旧主库为新从库的详细步骤2.1 前提条件配置要求主库在故障前必须开启了 wal_log_hints on或者数据库初始化时开启了数据校验和data checksums。状态确认新主库原备库已提升并处于读写状态。旧主库待恢复库必须已经彻底停止干净关闭或宕机后未再写入。2.2 操作步骤假设新主库 IP192.168.1.102旧主库 IP192.168.1.101 (当前操作在该机器上执行)数据目录/var/lib/postgresql/data2.2.1. 停止旧主库如果还在运行# 确保旧主库完全停止systemctl stop postgresql2.2.2. 执行 pg_rewind在旧主库节点上使用 postgres 用户执行以下命令pg_rewind --target-pgdata/var/lib/postgresql/data \--source-serverhost192.168.1.102 userpostgres dbnamepostgres passwordyour_password \--progress--target-pgdata旧主库的数据目录。--source-server指向新主库的连接字符串。注意连接用户需具备超级用户权限或 pg_rewind 所需的特定权限。2.2.3. 配置为从库模式pg_rewind 只负责同步数据文件不会自动开启流复制。你需要将其设置为备库创建从库标记文件touch /var/lib/postgresql/data/standby.signal修改连接信息 编辑 /var/lib/postgresql/data/postgresql.auto.conf更新 primary_conninfo 指向新主库primary_conninfo host192.168.1.102 port5432 userreplica_user passwordyour_password2.2.4. 启动旧主库此时作为新从库systemctl start postgresql2.3 验证状态检查同步状态 在新主库执行SELECT * FROM pg_stat_replication;查看日志 检查旧主库现从库日志确认是否出现 started streaming WAL from primary at ... 的字样。三、核心注意事项WAL保留pg_rewind 需要新主库上保留自“分叉点”以来的所有 WAL 日志。可以调大 max_slot_wal_keep_size 或使用 WAL 归档。如果日志已被清理pg_rewind 会失败,此时只能通过 pg_basebackup重新做全量备份。配置文件pg_rewind 默认会覆盖 postgresql.conf 等配置文件。如果主从配置有细微差异如内存分配建议执行后检查一下。复制槽如果使用了物理复制槽在新主库上可能需要重新创建对应新从库的复制槽。