MST

星途 面试题库

面试题:分布式系统中分布式数据存储一致性协议的原理

请阐述分布式数据存储中常用的一致性协议(如Paxos、Raft)的工作原理,并说明它们在保障数据一致性方面的关键机制。
36.0万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

Paxos工作原理

  1. 角色划分
    • 提案者(Proposer):提出提案(Proposal),提案内容包含要写入的数据等信息。
    • 接受者(Acceptor):接受提案,并可以批准(Accept)提案。
    • 学习者(Learner):从接受者处学习被批准的提案。
  2. 提案过程
    • 准备阶段(Prepare):提案者选择一个提案编号 n 并向所有接受者发送Prepare请求。接受者接收到Prepare请求后,如果 n 大于它已经响应过的所有Prepare请求的编号,那么它就会向提案者响应一个Promise消息,承诺不再接受编号小于 n 的提案,并返回它已经接受过的编号最大的提案(如果有的话)。
    • 批准阶段(Accept):提案者在收到多数接受者的Promise消息后,就可以构造一个提案。提案的编号为 n,值要么是它收到的所有承诺消息中编号最大的提案的值(如果有收到承诺消息),要么是它自己想要提议的值。然后提案者将这个提案发送给所有接受者。接受者接收到Accept请求后,如果提案的编号 n 不小于它已经响应过的Prepare请求的编号,它就会接受这个提案并向所有学习者发送Accepted消息。
  3. 决议形成:当有一个提案被多数接受者接受时,这个提案就形成了决议,学习者通过接收Accepted消息学习到决议。

Paxos保障数据一致性的关键机制

  1. 多数派原则:只有当提案被多数接受者接受时才能形成决议。这样可以避免出现多个冲突的决议,因为不可能同时存在两个不同的提案被两个多数派接受。
  2. 提案编号:通过递增的提案编号,保证新提案不会覆盖已形成的决议。如果一个提案编号小于已接受提案的编号,该提案将被拒绝,从而维护一致性。

Raft工作原理

  1. 角色划分
    • 领导者(Leader):负责接收客户端请求,将日志条目复制到其他节点,并告知其他节点何时可以应用这些日志条目。
    • 跟随者(Follower):响应领导者的请求,在领导者故障时可以参与选举成为领导者。
    • 候选人(Candidate):由跟随者转变而来,参与领导者选举。
  2. 领导者选举
    • 当跟随者在一段时间(选举超时时间)内没有收到领导者的心跳(Heartbeat)消息时,它会转变为候选人,并发起选举。候选人会给自己投票,并向其他节点发送RequestVote请求。
    • 其他节点(跟随者)在收到RequestVote请求后,如果满足一定条件(例如候选人的日志至少和自己的一样新),会投票给候选人。
    • 当候选人获得多数节点的投票时,它就成为领导者,并向其他节点发送心跳消息以维持领导地位。
  3. 日志复制
    • 领导者接收客户端的写请求,将请求作为新的日志条目追加到自己的日志中。
    • 领导者通过AppendEntries消息将新的日志条目复制到跟随者节点。跟随者节点在收到AppendEntries消息后,会检查消息中的日志条目是否与自己的日志匹配。如果匹配,就将日志条目追加到自己的日志中,并向领导者发送ACK响应。
    • 当多数节点都复制了某个日志条目时,领导者就可以将该日志条目应用到状态机,并告知客户端操作完成。

Raft保障数据一致性的关键机制

  1. 领导者权威:所有的写操作都由领导者处理,跟随者只能复制领导者的日志。这样可以确保所有节点最终应用相同的日志条目,从而保证数据一致性。
  2. 日志匹配原则:Raft通过日志条目的索引和任期号来保证日志的一致性。在AppendEntries消息中,领导者会携带前一个日志条目的索引和任期号,跟随者通过检查这些信息来判断日志是否匹配,不匹配时会拒绝该消息,从而避免不一致的日志复制。
  3. 选举限制:候选人必须拥有至少和其他节点一样新的日志才能赢得选举,这保证了新的领导者不会覆盖已经被多数节点接受的日志条目,维护了数据一致性。