这是一种选举算法,用来确认分布式架构下主节点(领导者)是哪一个结点
只有成为了主节点才能向其他结点进行指令的下达来进行数据的同步
三种角色:追随者Follower,候选人Candidate,领导者leader
(1)追随者Follower:接收来自领导者的消息,当领导心跳信息超时的时候,就自己主动站出来推荐自己当候选人
(2)候选人Candidate:向其他结点请求投票,如果赢得大多数选票,就晋升为领导者
(3)领导者leader:给其他非领导结点发送心跳信息
为了简化:这个数据库系统只存一个数
这里有三个结点,下面介绍Raft选举的过程:
初始状态:
每个结点等待领导者结点心跳信息的超时时间间隔是随机的(设置成随机的就是为了防止多个结点同时发起投票),比如这里A结点等待领导者结点心跳信息的超时时间间隔是150ms,B结点时200ms,C结点时300ms
假如领导结点宕机了,需要选一个新的结点成为领导结点,此超时时间间隔最小的A结点会成为候选者,通过rpc请求向其他结点发送投票请求(请求为自己投上一票),并且先给自己投上一票,而且此时任期编号term加1,由0变成1
B,C结点接收到结点A的投票请求后,发现在任期编号term=1这个任期内,还没有投过票,于是把票投给A,并且自己的任期编号term也从0增加到1
结点A得到大多数结点的投票后(n/2+1)就成为这届任期内的领导者
宕机后又恢复的前任领导节点,会成为新任领导节点的跟随者
总结几个关键机制:
任期机制
领导者发送心跳消息机制
等待时间间隔随机机制
大多数选票机制