知识卡片
pg_rewind:用WAL精确定位变更块,避免故障节点重新加入时的全量重建
内容
在流式复制(Streaming Replication)集群中,一旦主节点因硬件故障宕机、修复后想重新加入集群,早期PostgreSQL(9.5之前)通常需要对这个节点做一次全量数据初始化,把整份数据从新主节点重新同步过来——当数据量达到几百GB甚至TB级别时,这个全量重新初始化过程本身就是一场灾难,耗时极长;用rsync虽然能省去部分传输,但rsync只能做文件级别的差异比对,无法感知数据库内部块级别的变更,效果依然有限。PostgreSQL 9.5引入的pg_rewind工具解决了这个问题:它不依赖文件级比对,而是直接利用WAL日志来精确定位哪些数据块在故障期间发生了变更,只同步这些实际变更过的块,不需要遍历读取集群里的全部文件。这个案例给出一条通用思路:面对”节点短暂离线后需要重新追平集群状态”这类恢复问题,与其做代价高昂的全量重新初始化,不如利用系统本身已经存在的变更记录(这里是WAL)做精确的增量差异同步,恢复速度不再与数据规模线性绑定。
参考来源
- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.10 从Postgres95到PostgreSQL9.5:新版亮眼特性"节,"6.10.3 PostgresSQL9.5的亮眼特性"(源文件:_epub-src/OEBPS/Text/Chapter6_10_4.xhtml)
- 结论依据:原文说明"一旦因为数据库的Master节点出现硬件故障导致系统宕机……我们往往需要对此数据库进行重新的全量数据初始化……一旦数据稍微大一点,到达几百GB数量级甚至TB级别,全量数据初始化将是一个灾难……因此PostgreSQL 9.5提供了pg_rewind……它用WAL来确定更改的数据块,不需要在集群里读取所有文件",直接支撑本卡片结论。
- 原始内容:pg_rewind的优点是,它用WAL来确定更改的数据块,不需要在集群里读取所有文件,当数据库很大时,这样的特性会让它运行起来更快。