知识卡片

Failover之后,原主库要重新加入集群需要付出全量数据同步的代价

普通读书笔记卡

内容

Failover发生(Master意外故障、Slave被promote成新Master)之后,如果Master故障时确实存在还没来得及复制给Slave的数据,会出现一个棘手的后果:假设原Master的最后一个事务号是1001,但Slave只同步到了999号事务,这时Slave promote成新Master后,所有后续的新操作都是以999号事务的结果为基础继续往下推进的——这意味着原Master里1000号和1001号事务处理过的数据,永远都不可能被恢复了(因为已经提交的事务在数据库里不支持直接回退)。更麻烦的是,如果之后想把这台原Master重新恢复、以Slave身份加入到这个新的主备结构里,它没有办法通过增量复制的方式简单地”补上”缺失的1000、1001号事务再继续同步,因为它自己的事务历史(走到1001号)已经和新Master的事务历史(从999号之后走了一条完全不同的路径)产生了分歧——常规增量复制的前提是双方共享同一段连续的事务历史,一旦这个前提被打破,唯一的解决办法就是把这台机器当作一台全新的节点,对它执行一次完整的全量数据重新初始化,如果数据库达到TB级别,这个全量恢复过程可能需要六七个小时。这个案例揭示了一条关于分布式系统”脑裂”或”分叉”场景的重要认知:一旦两个原本共享同一段历史的副本,因为故障切换而各自走上了不同的后续演进路径(一个停在999号事务、另一个继续推进到新的事务序列),要重新让它们”合流”,几乎不可能通过简单的增量对齐来实现,因为增量同步的本质依赖双方在某个共同的历史节点上完全一致,一旦这个共同历史节点之后双方的内容已经分道扬镳,唯一可靠的合流方式就是舍弃其中一方已经产生分歧的那部分历史,让它完全对齐到另一方最新的状态——这个代价(全量重建)往往远高于增量同步,是设计和评估任何主备切换机制时必须提前纳入考量的隐性成本。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.6 PostgresSQL HA高可用架构实战"节,"6.6.3 Corosync+Pacemaker MS模式介绍"(源文件:_epub-src/OEBPS/Text/Chapter6_6_4.xhtml) - 结论依据:原文说明"切换后果想要重新成为主节点,将需要重新进行全量的数据复制恢复。这是因为Master故障时如果有数据没复制到Slave,Master的最后一个事务时间将比Slave中的事务时间更新……原Master中的1000及1001事务所处理的数据将不可恢复……如果你的数据库到达TB级别,这将需要六七个小时",直接支撑本卡片结论。 - 原始内容:切换后果想要重新成为主节点,将需要重新进行全量的数据复制恢复……原Master中的1000及1001事务所处理的数据将不可恢复。由于在当前设计中,已在数据库里提交的事务不支持直接回退,所以,如果你的数据库到达TB级别,这将需要六七个小时。