1.Raft协议介绍
这篇文章:百度安全验证 讲的比较详细了,我再以我的方式汇总一下:
- Raft协议是一种分布式一致性协议,比Pasox简单,旨在解决数据的一致性和高可用性
- Raft在选举中的方式:
- 所有节点相互建立连接后,开始投票,每个节点可以投给自己,也可以投给别人
- 当节点完成投票后,会将投票结果发给其它节点,如果当前节点没有进行投票,则默认认可收到的第一个投票,
- 所有节点投完票后进行归票,获得绝大多数票数者称为leader,其余为follower,若没有节点获得绝大多数投票,则所有节点随机休眠一段时间后再次发起投票
- 这时将大概率完成投票,确定leader和follower
- 当follower下线时,所有节点都会知道
- 当controller下显示,剩余节点重新发起投票
上述投票逻辑较清晰,但实现起来还是有些复杂,我下面使用一种更加简化的方式实现投票
2. 简化版Raft协议介绍
前提:每个节点都有一个节点id,且节点id不重复;每次投票默认节点小的为controller
投票逻辑:
- 每个节点启动,从配置文件中查询自己是否是节点最小的,是则判断是否就自己一个节点,如果是则自己就是controller,如果不是则等待其它节点向其发送投它为controller的投票,如果自己不是最小的,则向最小的发起投票请求,如果最小的没有启动,则睡眠3s后继续发送,直到和最小节点建立连接
- 最小节点收到所有节点的投票后,确认自己是controller,并向所有节点发送投票结果请求,告知它们我是controller,你们都是follower
- 当follower下线时,controller会感知到并将下线请求信息告知其它节点
- 当controller下线时,所有节点都会感知到,所有节点会重新发起投票请求选举controller
3.对比
系统可以很快的完成投票
节点与节点间的连接少了,只需要和controller有连接即可
实现简单,易理解