知识卡片
Switchover与Failover的本质区别:主动切换能保证数据完整,意外故障只能保证事务一致
内容
PostgreSQL主备切换有两种触发方式,两者能提供的数据保证程度完全不同。Switchover是通过Pacemaker由人工主动发起的计划性切换——通常用在硬件需要主动维护这类场景,切换过程会先确保Master节点上的所有数据都已经完整复制到Slave,再执行Slave的promote操作,因此切换完成后数据库里的所有事务都是完整的,不会出现任何数据丢失,这是一种”可控、可预期”的切换。Failover则是Master节点意外发生故障时触发的被动切换——由于PostgreSQL在双节点场景下推荐使用async(异步)复制模式,一旦Master故障时恰好有部分数据还没来得及复制到Slave,这部分数据就会永久丢失;但即使在这种数据丢失的情况下,因为PostgreSQL的Streaming Replication是以事务为单位进行复制的,所以数据库的事务一致性依然能够得到保障——绝对不会出现Slave里某个事务只恢复了一半这种”半成品”状态,丢失的只会是完整的、尚未被复制过去的事务,已经复制过去的事务在Slave上一定是完整、正确的。这个对比揭示了一条评估”数据保证”的重要区分:Switchover和Failover这两种切换方式提供的保证,分别对应着两个完全不同、不能混为一谈的正确性层级——”数据零丢失”(每一笔已提交的事务都不会丢)和”事务一致性”(即使丢数据,丢的也一定是完整的事务、不会出现事务内部数据错乱)。可控的计划性操作(Switchover)因为有条件提前确保数据同步完成,能够做到更强的”零丢失”保证;而应对意外故障的被动切换(Failover),在异步复制这个前提下天然无法保证零丢失,只能退而求其次保证事务级别的一致性——理解这个层级差异,能帮助正确设定”这套HA方案在故障发生时到底能给我什么保证”这个预期,而不是笼统地以为”有HA方案就等于数据绝对不会丢”。