MST

星途 面试题库

面试题:分布式系统数据分片后的一致性维护

当采用数据分片构建分布式计算框架时,如何保证不同分片数据之间的一致性?请详细说明可能用到的技术和算法,并分析其优缺点。
36.6万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

技术和算法

  1. 两阶段提交协议(2PC)
    • 原理:在分布式系统中,协调者(Coordinator)负责协调各个参与者(Participant)进行事务处理。第一阶段,协调者向所有参与者发送“准备”请求,参与者检查自身能否执行事务操作,如果可以则回复“就绪”,否则回复“失败”。第二阶段,如果所有参与者都回复“就绪”,协调者发送“提交”请求,参与者执行事务提交;若有任何一个参与者回复“失败”,协调者发送“回滚”请求,参与者回滚事务。
    • 优点:实现相对简单,能保证事务的原子性,即要么所有参与者都提交事务,要么都回滚事务。
    • 缺点:单点故障问题,如果协调者出现故障,整个系统可能会陷入阻塞。而且同步阻塞时间长,在第一阶段参与者需要锁定资源,直到收到第二阶段的指令,这期间无法处理其他事务,影响系统并发性能。另外,协议没有容错机制,若在第二阶段部分参与者出现故障,可能导致数据不一致。
  2. 三阶段提交协议(3PC)
    • 原理:在2PC基础上增加了一个预询问阶段。第一阶段,协调者向参与者发送“CanCommit”请求,询问参与者是否可以执行事务操作,参与者根据自身情况回复“可以”或“不可以”。第二阶段,若所有参与者都回复“可以”,协调者发送“PreCommit”请求,参与者进入准备状态,锁定资源但不提交事务;若有参与者回复“不可以”,协调者发送“Abort”请求,参与者放弃事务。第三阶段,如果在第二阶段所有参与者都成功进入准备状态,协调者发送“Commit”请求,参与者提交事务;若在等待期间协调者未收到所有参与者的确认信息,或者有参与者超时未响应,协调者发送“Abort”请求,参与者回滚事务。
    • 优点:相比2PC,部分解决了单点故障问题,减少了阻塞时间。例如在PreCommit阶段,即使协调者故障,参与者也可以根据自身状态决定后续操作。提高了系统的容错性和并发性能。
    • 缺点:协议复杂,实现成本高。由于增加了预询问阶段,网络通信开销增大。而且在最后提交阶段仍可能出现数据不一致情况,比如在协调者发送Commit请求后,部分参与者成功提交,而部分参与者因网络问题未收到请求,就会导致数据不一致。
  3. Paxos算法
    • 原理:通过多个节点之间的投票来达成共识。假设存在一组节点,每个节点都可以提出提案。提案包含一个编号和提案值。算法分为三个阶段:准备阶段(Prepare),提议者(Proposer)向所有接受者(Acceptor)发送Prepare请求,请求中包含提案编号;接受者接收到请求后,若提案编号大于已接受的最大提案编号,则回复已接受的最大提案编号和对应提案值(若有),否则不回复。批准阶段(Accept),提议者若收到多数接受者的回复,且回复中的提案值都相同(或无提案值),则将该提案值(或自己的提案值)作为新提案,向接受者发送Accept请求,请求中包含提案编号和提案值;接受者接收到请求后,若提案编号大于已接受的最大提案编号,则接受该提案。学习阶段(Learn),当多数接受者接受了某个提案后,学习者(Learner)可以通过向接受者询问或接受者主动通知的方式学习到该提案值。
    • 优点:能在存在故障节点的情况下达成共识,容错性强。不需要一个固定的协调者,所有节点地位平等,避免了单点故障问题。
    • 缺点:算法复杂,实现难度大。由于提案的编号不断递增,可能会导致提案编号溢出问题。而且在高并发场景下,提案冲突频繁,会增加网络通信开销和达成共识的时间。
  4. Raft算法
    • 原理:将节点分为领导者(Leader)、跟随者(Follower)和候选人(Candidate)三种角色。系统启动时,所有节点都是跟随者。跟随者在一定时间内未收到领导者的心跳消息,则转换为候选人,发起选举。候选人向其他节点发送投票请求,若获得多数节点的投票,则成为领导者。领导者负责接收客户端请求,将日志条目复制到其他节点,并确保这些日志条目被安全提交。跟随者只接收和处理领导者发送的消息,如心跳消息和日志复制请求。
    • 优点:相比Paxos算法,Raft算法更加易懂,实现相对简单。选举机制简单明了,能快速选出领导者,提高系统可用性。通过日志复制保证数据一致性,且具有较好的容错性,允许一定数量的节点故障。
    • 缺点:领导者是关键节点,存在一定的单点故障风险,虽然选举机制可以在领导者故障时重新选举,但在选举期间系统可能会短暂不可用。另外,Raft算法假设网络延迟和节点故障是相对较少发生的情况,在网络环境复杂多变的场景下,性能可能会受到影响。
  5. 分布式事务最终一致性方案(如消息队列+本地事务)
    • 原理:以电商系统为例,下单操作在本地数据库开启事务,插入订单数据,同时发送一条包含订单信息的消息到消息队列。消息队列保证消息的可靠投递。其他服务(如库存服务)监听消息队列,接收到消息后,在本地开启事务处理库存扣减等操作。通过消息重试机制和定期对账机制来保证最终数据一致性。如果库存服务处理消息失败,消息队列会进行重试;定期对账可以检查订单系统和库存系统的数据差异,并进行修复。
    • 优点:解耦了不同服务之间的直接调用,提高了系统的可扩展性和灵活性。相比强一致性协议,对系统性能影响较小,适用于高并发场景。
    • 缺点:数据一致性是最终一致性,不是实时一致性,在一定时间窗口内可能存在数据不一致情况。实现过程需要处理消息队列的可靠性、消息重复消费、消息顺序性等问题,增加了开发复杂度。

总结

在选择保证不同分片数据一致性的技术和算法时,需要综合考虑系统的性能、可用性、容错性、复杂度等因素。对于对一致性要求极高、并发量相对较小的场景,可选择2PC等简单直接的协议;对于高并发、对可用性要求高的分布式系统,Paxos、Raft等共识算法或分布式事务最终一致性方案可能更合适。