一致性协议(Consensus Protocol)是分布式系统中用于解决多个节点之间达成一致的算法或协议。它们的主要作用是确保在节点之间保持数据的一致性。
需要说明的是一致性协议和拜占庭将军问题没有直接的关联。拜占庭将军的核心问题是在缺少可信任的中央节点和可信任的通道的情况下,分布在不同地方的各个节点如何达成共识。因此拜占庭将军问题强调安全性方面,而一致性协议则更强调系统的容错性。
Paxos
Basic Paxos
Paxos算法是基于消息传递且具有高度容错特性的一致性算法。
其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。
角色
提议者(Proposer)
接收客户端请求,将其封装成提案(proposal)。并将提案发给所有的接受者(acceptor)。根据接受者(acceptor)的返回情况,控制是否需要提交该提案(proposal),即是否要保存该提案。
决策者(Acceptor)
参与对提案(proposal)的投票,接收和处理Paxos的两个阶段的请求。
学习者(Learner)
不参与提案和投票,只被动接收结果。
阶段:prepare阶段、accept阶段、learn阶段
prepare阶段
由proposer向acceptor发送prepare请求,acceptor根据约定决定是否需要响应该请求。
accept阶段
proposer在prepare阶段接收到大多数响应后,由proposer向acceptor发送accept请求。
learn阶段
learn阶段,在某一个提案通过paxos达成共识后,由acceptor通知learner学习提案结果。
Raft
提案:将客户端对集群的操作称之为提案
Peer set: 所有的server节点组成一个peer set(consul有server和client模式)
Quorum: 指一个peer set里面的大多数成员,即(N/2) + 1
节点角色
Raft集群中有三个角色:
Leader: 所有请求的处理者,接收客户端发起的请求,写入本地日志后同步给其他节点。
Follower: 请求的被动更新者,从leader接收更新请求,写入本地文件。如果客户端的操作请求首先发送给了follower,会首先由follower重定向给leader。
candidate: 如果follower在一定时间内没有收到leader的心跳,则判断leader可能已经故障,此时启动leader election过程,本节点切换为candidate直到选主结束。
定时器
Raft中有两个定时器:
1. follower等待leader心跳的随机超时时间
2. candidate等待投票的随机超时时间,超时选举无效,开启新一轮选举
任期
每开始一次新的选举,称为一个任期(term),每个任期term都有一个严格递增的整数与之关联。
如果一个candidate在一个任期内赢得选举,他将在本term中担任leader的角色。
但并不是每个term都一定对应一个leader,有时候某个term内会由于选举超时导致选不出leader,这时candidate会递增term号并开始新一轮选举。
节点间通过RPC来通信,主要有两类RPC请求:
RequestVote RPCs: 用于candidate选举
AppendEntries RPCs: 用于leader向其他节点复制日志以及同步心跳
角色转换
系统启动初始状态
集群中每个节点刚启动时都是follower身份,leader会周期性的向所有节点发送心跳包来维持自己的身份。如果一个follower在一段时间内没有收到任何心跳,也就是选举超时,它就会认为系统中没有可用的leader,并发起新的选举。
每个follower都有一个随机化的定时器,让每个节点的”超时时间“在一定范围内随机生成,这样就降低了多个节点同时发起选举的可能性。
follower状态转换
1. 当candicate从整个集群的大多数(N/2 +1)节点获得针对同一任期(term)的选票时,它就赢得了这次选举,立刻将自己的身份转变为leader并开始向其他节点发送心跳来维持自己的身份。
2. 如果有多个follower同时成为candidate,没有任何一个candiate能得到大多数节点的支持,那么所有candidate都会超时

1866

被折叠的 条评论
为什么被折叠?



