分布式数据库系统中主从、主主和无主三种复制算法
内容提要
分布式系统中的复制对于数据一致性、可用性和系统弹性至关重要。复制策略包括单领导者主从复制、多主复制和无领导复制。同步复制和异步复制是复制的两种方式。故障转移和数据恢复需要处理追随者和领导者的中断。多领导者复制中需要定义仲裁来确保一致性。无领导复制中客户端直接发送写入到多个副本。无领导复制中需要注意数据新鲜度和草率仲裁的概念。并发写入是无领导复制中的关键挑战,需要处理冲突和选择解决策略。
延伸解读
复制模式选择:没有银弹,只有权衡
文章对比了单领导者、多领导者与无领导者复制,每种模式都有明确的适用边界。单领导者复制适合强一致性场景,但领导者是写入瓶颈和故障单点;多领导者复制提升了写入弹性和多数据中心性能,却引入了写入冲突;无领导者复制通过客户端直写多个副本增强了可用性,但需处理数据新鲜度和仲裁问题。选择时需根据一致性要求、延迟容忍度和故障恢复复杂度综合判断。
故障转移的隐藏风险:异步复制下的数据丢失与脑裂
文章指出,领导者故障转移在异步复制中尤为复杂。新领导者可能未收到旧领导者的全部写入,导致数据丢失;若旧领导者重新上线,还可能产生主键冲突或脑裂。自动故障转移依赖心跳检测,但检测阈值过小可能误判,过大则延长恢复时间。这些风险说明,故障转移流程需要结合系统架构谨慎设计,不能简单依赖自动机制。
无领导者复制的仲裁陷阱:W+R>N 不等于绝对新鲜
无领导者复制常用读写仲裁来平衡一致性与可用性,理论上 W+R>N 可保证强一致性。但文章提醒,草率仲裁、读取期间并发写入、部分写入成功以及节点故障恢复等边缘情况,仍可能导致读取到陈旧数据。因此,即使仲裁条件满足,也需监控数据新鲜度,并理解系统在延迟与准确性之间的实际取舍。
多领导者复制的冲突解决:从回避到自定义逻辑
多领导者复制中,冲突检测通常在异步复制时发生。文章列举了多种解决策略:通过地理路由回避冲突、使用最后写入获胜或副本优先级、合并冲突值,以及在应用层自定义冲突处理逻辑。每种策略都有权衡,例如最后写入获胜简单但可能丢失更新。实际系统需根据业务对数据完整性和用户体验的要求,选择合适的冲突解决方式。
Q&A
分布式数据库中的主从复制、主主复制和无主复制分别是什么?
主从复制(单领导者复制)由一台主服务器处理所有写入,多个从服务器复制更改,适合强一致性场景。主主复制(多领导者复制)中每个节点都可接受写入,更改在节点间同步,适合多数据中心和离线操作。无主复制中所有节点都可接受读写,客户端直接发送请求到多个副本,通常用于高可用和分区容错场景。
同步复制和异步复制有什么区别?各自有什么优缺点?
同步复制中,领导者更新本地存储后立即将更改传播到跟随者,只有所有节点更新成功才向客户端确认,确保强一致性但延迟较高。异步复制中,领导者先更新本地存储,延迟后传播更改,向客户端确认较早,延迟低但可能导致领导者和跟随者之间暂时不一致。
如何向单领导者复制系统中添加新的跟随者?
步骤包括:1)拍摄领导者数据库的一致性快照(无需锁定);2)将快照复制到新跟随者;3)新跟随者连接领导者,请求快照之后的所有更改,并与复制日志的精确位置关联;4)赶上所有更改后,新跟随者加入集群开始服务。此方法避免停机,平衡数据同步与性能。
多领导者复制中如何处理写入冲突?
处理策略包括:避免冲突(将特定记录的写入定向到同一领导者)、为写入分配唯一ID(如时间戳,最后写入获胜)、基于副本ID的优先级、合并值(如按字母排序连接)、记录冲突供应用解决,以及在应用程序代码中自定义冲突解决逻辑(写入时或读取时处理)。每种方法在一致性和复杂性之间权衡。
无主复制中的读修复和反熵过程是什么?
读修复:客户端从多个副本读取时,如果发现过时数据,将最新值写回该副本,适用于频繁读取的数据。反熵:后台进程不断比较副本间的差异并同步数据,不按特定顺序,可能导致较大延迟,但能确保最终一致性。两者协同工作,确保所有副本数据一致。
无主复制中的仲裁(Quorum)机制是如何工作的?
仲裁机制通过设置写入仲裁(W)和读取仲裁(R)来平衡一致性和可用性。例如,5个副本中设置W=3、R=3,则写入需至少3个副本确认,读取需从至少3个副本收集数据。当W+R>N(副本总数)时,系统保证强一致性,每次读取都能获得最新写入。仲裁模型提供了灵活性和鲁棒性,即使节点故障也能运行。
什么是草率仲裁(Sloppy Quorum)和暗示切换(Hinted Handoff)?
草率仲裁:当网络故障导致客户端无法连接到足够的指定节点形成仲裁时,系统接受来自任何可用节点的写入和读取响应,优先保证可用性。暗示切换:当网络恢复后,临时节点接受的写入会被传递到合法的主节点。这种策略在高写入可用性场景下有用,但可能牺牲读取的最新性。