知识卡片
有主从与无主从副本策略的CAP权衡全景对比
内容
分布式存储的多副本策略主要分两类:无主从设计(读取时需要读多个副本、比较最新时间戳或逻辑时间后再返回,如W=2/R=2这类quorum读写)和有主从设计(读写都访问主副本,通过binlog/oplog异步同步给从副本,如MongoDB、Bada),两者都只能做到最终一致性,但在CAP的具体权衡上差异很大,需要逐个维度拆开看,不能笼统地说哪个更好。性能维度:有主从只需访问一个副本就能返回,无主从至少要访问两个副本才能返回,有主从明显更快。一致性维度看似有主从更差,实际更微妙:有主从设计如果挂掉的恰好是主节点,这段时间的写入会因来不及同步而丢失,但从节点挂掉完全不影响数据;写入永远只发生在一个节点上,天然不存在同一key的并发写冲突。无主从设计任意节点挂掉理论上都不影响最终结果,但因为写入可以打到任意两个副本,同一个key在不同副本上可能出现两个不同的修改版本,读取时会遇到不一致,需要额外引入Vector Clock、时间戳比较等机制来解决冲突——综合来看无主从的一致性理论上优于有主从。分区容错维度两者其实类似,都要求半数以上节点存活才能对外服务(有主从需要过半投票选出主节点,无主从在W=2/R=2场景下同样需要至少2个副本响应)。可靠性维度:有主从只访问一个副本、读写压力更小,但主从切换期间会有一段时间无法对外提供服务;无主从不存在这个切换空窗,但每次访问的开销更大。Bada最终选择有主从设计,是因为它的业务场景对性能(低延迟)和线上服务可靠性的要求,比对严格一致性的要求更高,主从切换的短暂不可用可以通过工程手段(把主节点均匀打散到所有机器上避免负载不均)去缓解。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.5 360分布式存储系统Bada的架构设计和应用"节,"2.5.4 数据分布策略"(源文件:_epub-src/OEBPS/Text/Chapter2_5_5.xhtml)
- 结论依据:原文逐一从性能、一致性、分区容错、可靠性四个维度对比有主从和无主从设计的优劣,并说明"Bada 主要的应用场景对性能的要求比较高……因此有主从的设计在性能上更满足需求",直接支撑本卡片的对比与结论。
- 原始内容:从性能上来看,有主从设计的性能明显会优于无主从的……从一致性来看……无主从设计的一致性应该优于有主从的设计……从可靠性的角度,有主从的设计要比无主从的设计更可靠……Bada 主要的应用场景对性能的要求比较高。