面试题答案
一键面试Paxos工作原理
- 角色划分:
- 提案者(Proposer):提出提案(Proposal),提案内容包含要写入的数据等信息。
- 接受者(Acceptor):接受提案,并可以批准(Accept)提案。
- 学习者(Learner):从接受者处学习被批准的提案。
- 提案过程:
- 准备阶段(Prepare):提案者选择一个提案编号
n
并向所有接受者发送Prepare请求。接受者接收到Prepare请求后,如果n
大于它已经响应过的所有Prepare请求的编号,那么它就会向提案者响应一个Promise消息,承诺不再接受编号小于n
的提案,并返回它已经接受过的编号最大的提案(如果有的话)。 - 批准阶段(Accept):提案者在收到多数接受者的Promise消息后,就可以构造一个提案。提案的编号为
n
,值要么是它收到的所有承诺消息中编号最大的提案的值(如果有收到承诺消息),要么是它自己想要提议的值。然后提案者将这个提案发送给所有接受者。接受者接收到Accept请求后,如果提案的编号n
不小于它已经响应过的Prepare请求的编号,它就会接受这个提案并向所有学习者发送Accepted消息。
- 准备阶段(Prepare):提案者选择一个提案编号
- 决议形成:当有一个提案被多数接受者接受时,这个提案就形成了决议,学习者通过接收Accepted消息学习到决议。
Paxos保障数据一致性的关键机制
- 多数派原则:只有当提案被多数接受者接受时才能形成决议。这样可以避免出现多个冲突的决议,因为不可能同时存在两个不同的提案被两个多数派接受。
- 提案编号:通过递增的提案编号,保证新提案不会覆盖已形成的决议。如果一个提案编号小于已接受提案的编号,该提案将被拒绝,从而维护一致性。
Raft工作原理
- 角色划分:
- 领导者(Leader):负责接收客户端请求,将日志条目复制到其他节点,并告知其他节点何时可以应用这些日志条目。
- 跟随者(Follower):响应领导者的请求,在领导者故障时可以参与选举成为领导者。
- 候选人(Candidate):由跟随者转变而来,参与领导者选举。
- 领导者选举:
- 当跟随者在一段时间(选举超时时间)内没有收到领导者的心跳(Heartbeat)消息时,它会转变为候选人,并发起选举。候选人会给自己投票,并向其他节点发送RequestVote请求。
- 其他节点(跟随者)在收到RequestVote请求后,如果满足一定条件(例如候选人的日志至少和自己的一样新),会投票给候选人。
- 当候选人获得多数节点的投票时,它就成为领导者,并向其他节点发送心跳消息以维持领导地位。
- 日志复制:
- 领导者接收客户端的写请求,将请求作为新的日志条目追加到自己的日志中。
- 领导者通过AppendEntries消息将新的日志条目复制到跟随者节点。跟随者节点在收到AppendEntries消息后,会检查消息中的日志条目是否与自己的日志匹配。如果匹配,就将日志条目追加到自己的日志中,并向领导者发送ACK响应。
- 当多数节点都复制了某个日志条目时,领导者就可以将该日志条目应用到状态机,并告知客户端操作完成。
Raft保障数据一致性的关键机制
- 领导者权威:所有的写操作都由领导者处理,跟随者只能复制领导者的日志。这样可以确保所有节点最终应用相同的日志条目,从而保证数据一致性。
- 日志匹配原则:Raft通过日志条目的索引和任期号来保证日志的一致性。在AppendEntries消息中,领导者会携带前一个日志条目的索引和任期号,跟随者通过检查这些信息来判断日志是否匹配,不匹配时会拒绝该消息,从而避免不一致的日志复制。
- 选举限制:候选人必须拥有至少和其他节点一样新的日志才能赢得选举,这保证了新的领导者不会覆盖已经被多数节点接受的日志条目,维护了数据一致性。