文章目录
- **Bully算法原则**
- **选举过程**
- 选举示例
- N2发起选举图示
- N3发起选举图示
- N4发起选举图示
在分布式系统中,为了提高系统的可用性,达到99.999%的指标,我们通常会对服务节点做集群,采用主从互备的方式增强服务的可用性。在主从互备的集群中,主节点和从节点需要保证数据一致,主节点服务出现问题后,需要在从节点中选举出一个新的主节点,那么常用的分布式选举算法有Bully算法、Raft算法、ZAB算法。本节主要对Bully算法进行分析。
Bully算法原则
在存活的节点中,选取节点ID最大(或者最小)的节点为主节点。
选举过程
1、集群中所有节点都判断自己的ID是否是存活节点中ID最大的
2、如果是就告诉其他节点”我是主节点“
3、如果不是,需要向其他ID大于自己ID的节点发送”我需要选举“的消息
4、其他节点返回”同意选举“的消息
5、等待主节点发送”我是主节点“消息,如果一直等不到”同意选举“的消息,那么在一定的时间范围内,本节点将成为主节点,且向其他节点发送”我是主节点“的消息
所有的节点都会走一遍这个过程,存活期内ID最大的节点,在系统初始化的时候第一步就可以确定是主节点。在运行一段时间中假如主节点宕机后,ID最大的从节点会通过第五步,成为主节点
选举示例
假设集群环境中有五个节点,ID从小到大分别是1、2、3、4、5,这五个节点相互连接,每个节点都知道其他节点的ID,节点暂且称为N1、N2、N3、N4、N5,其中数字表示大小,在初始化的时候N5直接选举为主节点,其他四个节点为从节点。示意图如下:
运行期间N5突然故障,剩下的其中一个节点发现主节点服务故障,发起“选举”消息,比如N1节点最先发现主节点宕机,那么N1节点向N2、N3、N4、N5节点发起“我要选举”的消息,N2、N3、N4返回给N1节点“同意选举”消息。示意图如下:
N1节点无法成为主节点,只能等待主节点的通知消息。
剩下的其他节点比如N2节点需要向N3、N4、N5节点发送“选举信息”,N3、N4向N2返回“同意选举”消息;
N3节点需要向N4、N5节点发送“选举信息”,N4向N3返回“同意选举”消息;
N4节点需要向N5节点发送“选举信息”,因为N5节点宕机,无法给N4返回消息,所以在一定时间范围内,N4接收不到消息,成为主节点,然后向其他节点发送“我是主节点”消息,这样主节点选举完成。
N2发起选举图示
N2节点需要向N3、N4、N5节点发送“选举信息”,N3、N4向N2返回“同意选举”消息,N5无返回
N3发起选举图示
N3节点需要向N4、N5节点发送“选举信息”,N4向N3返回“同意选举”消息,N5无返回
N4发起选举图示
N4节点需要向N5节点发送“选举信息”,因为N5节点宕机,无法给N4返回消息,所以在一定时间范围内,N4接收不到消息,成为主节点,然后向其他节点发送“我是主节点”消息