基础理论~raft协议的个人理解
raft协议
一 什么是一致性
所有节点都从同一个state出发,都经过同样的一些操作序列(log),最后到达同样的state。
二 状态
1 Leader Leader副本接受client的更新请求,本地处理后再同步至多个其他副本;
2 Follower 请求的被动更新者,从Leader接受更新请求,然后写入本地日志文件
3 Candidate 如果Follower副本在一段时间内没有收到Leader副本的心跳,则判断Leader可能已经故障,此时启动选主过程,此时副本会变成Candidate状态,直到选主结束。
三 日志应用
1 leader 接受 client请求,追加日志到本地日志文件
2 然后给其它的server发AppendEntriesRPC请求,发送日志
3 当Leader确定一个log entry被safely replicated(绝大多数成员)
4 apply这条log entry到状态机中然后返回结果给客户端
四 选举
1 follower转变成Candidate角色
2 发送给其他follower进行投票选举
3 投票有三种结果
1 自己为主 candiate->leader
2 别人为主 candiate->follower
3 没有结果 投票超时,继续进行选举
五 一些疑问
1 raft协议建议奇数点的目的是避免出现平票现象, 计算方式为 N/2+1 存活节点
2 raft协议把并发能力变差了,因为只有一份log完全被复制到大多数节点后才会处于commit状态,进行下一份log的写入