基本运行原理
- 集群中的节点有3中状态:Leader,Candidate,Follower,每个节点的初始状态都是Follower。
Leader:1、选举产⽣。多数派决定。2、向Follower节点发送⼼跳,Follower收到⼼跳就不会竞选Leader。3、响应客户端请求。集群内所有的数据变化都从Leader开始。4、向Follower同步操作⽇志。具体实现时,有的产品会让发到Follower上的请求转发到Leader上去。也有的直接拒绝
Follower:1、参与选举投票。2、同步Leader上的数据。3、接收Leader的⼼跳。如果Leader⻓期没有发送⼼跳,就转为Candidate,竞选Leader。
Candidate:没有Leader时,发起投票,竞选Leader。 - 每个节点有随机的选举休眠时间,休眠时间达到后向其他节点发出投票申请,自己变为Candidate,投自己一票,每发起一轮投票任期+1
- 每个节点有一票,投给先收到的投票申请
- 收到半数以上的投票的节点成为Leader,同时发送心跳消息通知其他节点,其他节点变为Follower,Follower每次收到Leader的心跳都重置休眠时间重新开始
- 集群的消息都由Leader处理,如果Follower收到请求也要转发给Leader处理
- Leader收到数据修改请求后,发送给Follower,收到半数以上回复则提交修改,通知Follower提交修改,同时响应请求者修改成功
- 如果节点发生网络分区,原先的Leader继续发送心跳请求,不在同一分区的Follower收不到请求,休眠时间到达后会重新选举出Leader;网络恢复后会有多个Leader发送心跳消息,任期高的Leader获胜,其他变为Follower,期间未修改成功的数据回滚(未达到半数一以上),可能发生数据丢失
- 如果没有节点收到的投票超过半数,随机休眠时间后重新发起一轮选举,直到选举成功