目录
1.什么是Raft协议?
raft协议是多个节点数据之间达成共识的协议,使用的场景是etcd,consul。
raft包含两部分领导选举(leader election)和日志复制(log replication)
包含两类消息:请求投票消息(request vote)和追加条目消息(append entry)
2.Raft协议每个节点有几个角色,每个角色的作用是什么?
raft协议每个节点可能出现三个角色,分别是领导者,跟随者,候选人
1.领导者(leader) 三个功能:处理写请求,日志复制,给follower发送心跳
2.跟随者(follower) 处理和响应leader发过来的日志复制消息
3.候选人(candidate) follower节点长时间没有收到leader节点的心跳,切换状态为candidate,进行选主。向其他节点投票的rpc,进行选主。
3.Raft 怎么进行选主
以三个节点为例,初始三个节点都处于follower状态,每个节点都会设置等待leader的的随机超时时间,如果超过随机超时时间,还是没有收到leader的心跳,自己的节点由follower转变为candicate,增加自己的任期编号,向其他节点发起rpc投票消息,如果有超过一半的节点的投票给自己,自己变为leader,向其他节点发送心跳。
4.Raft 怎么进行日志复制?
Raft协议leader节点和follower节点之间的日志复制过程如下:
1.客户端发送写请求到leader节点
2.leader节点接受写请求,leader将写请求追加到自己的日志log entry中,并发送日志同步消息到其他的follower节点。如果leader节点收到大多数的follower节点都写入了log entry.那么leader节点将log entry提交到状态机中,同时返回成功到客户端,否则返回错误信息给客户端。
log entry的对象包含的内容:用户数据,索引编号,任期编号。
索引编号和任期编号用于投票。
5.Follower选举的投票规则是什么?
1.任期编号大的节点拒绝投票任期编号小的节点的消息
2.最后一条日志编号大的拒绝投票给最后一条日志编号小的
3.一个任期内只投出一张票
4.先来先投票
参考
1.https://juejin.cn/post/6907151199141625870----- Raft协议