1、Raft算法
Raft算法是当前分布式系统开发首选的共识算法,是一种一切以领导者为准的实现,实现一系列的值的共识和各节点日志的一致。
2、Raft算法中的三个角色:
领导者(Leader):处理写请求、管理日志复制和不断发送心跳信息。
跟随者(Follower):接收和处理来自领导者的消息,当等待领导者心跳信息超时的时候,就主动站出来,推荐自己为候选人。
候选人(Candidate):向其他节点发送请求投票信息,通知其他节点来投票,如果某个候选人赢得了大多数(节点数/2 + 1)节点的选票,该候选人就成为新的领导者。
3、选举领导的过程:
3.1、初始状态,集群中所有节点都是跟随者状态,每个节点有一个任期编号和心跳信息超时时间。
3.2、因为心跳信息的超时时间,各个节点都是随机的,所以肯定有大有小,超时时间最小的节点,会先增加自己的任期编号,并先给自己投一张选票,然后发送投票信息给其他节点,请他们选举自己为领导者。
3.3、某个节点(B)收到其他节点(A)发过来的投票信息后,看消息传递过来的任期编号内,没有进行过投票,就把这个投票投给消息的发送节点(A),并增加自己(B)的任期编号。
3.4、如果候选人在选举超时时间内赢得了大多数的选票,那么他就会成为本届任期内新的领导者。
3.5、当某个节点成为新的领导者后,他会周期性的发送心跳信息,通知其他节点,阻止跟随者发起新的选举,以防篡权。
4、节点间如何通讯
1、请求投票RPC:由候选人在选举期间发起的,通知各个节点进行投票选举。
2、日志复制RPC:由领导者发起,用来复制日志和提供心跳信息。
5、选举有哪些规则
5.1、领导者周期性的向所有跟随者发送心跳信息(即不包含日志项的日志复制RPC消息),通知跟随者我是领导者,防止跟随者发起选举投票。
5.2、如果在指定时间内,跟随者没有收到来自领导者的消息,那么他就认为当前没有领导者,就会推举自己为候选人,发起领导者选举。
5.3、在一次选举中,赢得大多数选票的候选人,成为新的领导者。
5.4、在一个任期内,领导者一直都会是领导者,直到它自身出现问题(如宕机、网络延迟),其他节点发起新一轮的选举。
5.5、在一次选举中,每一个服务节点最多只能对一个任期编号投一次票,并按照“先来先服务”的原则进行投票。
6、如何复制日志
6.1、日志的组成
日志由日志项组成,每个日志项由:索引、任期编号和指令组成。数据副本是以日志的形式存在的。Raft中,日志必须是连续的。
指令:一条由客户端请求指定的、状态机需要执行的指令。可以认为是客户端指定的数据。
索引值:日志项对应的整数索引值。
任期编号:创建这条日志项的领导者的任期编号。
6.2、日志的复制过程
1、领导者通过日志服务复制RPC消息,将日志项复制到其他集群节点上。
2、领导者接收到大多数的“复制成功”响应后,将日志提交到它的状态机,并返回成功给客户端。如果没有收到大多数“复制成功”响应,就返回错误给客户端。
6.3、如何实现日志的一致
1、领导者通过日志复制RPC的一致性检查,找到跟随者节点上,与自己相同日志项的最大索引值。
2、领导者强制跟随者更新覆盖不一致的日志项,实现日志的一致。
7、成员变更
为了防止有多个领导者出现,Raft算法采用单节点变更来解决成员变更问题。单节点变更是指:一次变更一个节点实现成员变更。