raft算法---成员变更
由于raft算法是基于集群中“大多数”成员,当集群中成员发生变更,就可能会由于新旧配置的不同出现两个大多数,如下图,旧集群成员数为3,旧配置中集群数为3,大多数成员为2,增加两台机器后新集群成员数为5,新配置集群数为5,大多数不小于3
最初状态,一个领导者,两个跟随者
加入两个节点后d,e,如果此时发生分区,a与b组成一个集群,使用以前的旧配置,c,d,e使用新配置组成集群,此时就产生两个领导者
如何解决分区错误产生时,产生两个领导者的问题。
raft为了解决这个问题,使用的是单节点成员变更,单节点变更就是一个节点一个节点的变化,比如3节点集群变更为5节点集群,先变更一个节点变为4节点集群,再变更为5节点集群,下面就看一下,单节点变更如何规避了两个领导者的问题,
步骤如下:
1 首先一个3节点集群,如下,
2 加入一个节点,此时变为四节点集群,集群的大多数是3个,如果此时发生集群分裂,两个集群发生投票旧配置要想达到半数需要2个节点,新配置要达到半数以上需要3个,此时两个分裂的集群会有一个重叠,如节点b,因此这个分裂产生两个领导者不成立,
3 再加入一个节点e,在加入前集群配置为4节点,集群大多数为3节点,加入e后,集群新配置为5个节点,集群大多数为3,如果发生分区错误后达不到产生两个领导者的条件(有部分重叠)