raft协议-集群成员变化处理

raft协议,关于集群成员变化的一点个人理解,纯粹是根据论文分析的,不一定正确。后续看下etcd, braft的实现代码,加深理解。

raft协议-集群成员变化处理_第1张图片
1.png

Cold: 旧集群的节点配置信息,eg 【node1, node2, node3】
Cnew:新集群的节点配置信息, eg 【node1, node2, node3, node4, node5】
Cold_new:新旧节点配置信息都包含。

T1-T2时间段内,选举出来的leader可能是拥有Cold配置的节点,也有可能是拥有Cold_new配置的节点。拥有Cold_new配置的节点选举成功的条件是:Cold和Cnew中的大多数节点都同意,也就意味着他选举成功,Cold中就不会有别的candidate被选举成功,所以不会出现两个leader。

T2-T3时间段,选出来的leader必然是拥有Cold_new配置的节点。原因:在T2时刻,Cold_new日志复制成功,表示在Cold, Cnew中 Cold_new日志都占了大多数,因此即使在Cold集群中,如果选举leader成功,必须要一个拥有Cold_new日志的follower,然而该follower更新,他必然会拒绝该请求, 而只会批准哪些拥有Cold_new日志的Candidate.

T3-T4时间段,选举出来的leader可能是拥有Cold_new配置的节点, 也有可能是拥有Cnew配置的节点。但是Cold_new节点要求new节点集群的大部分同意他(也就是说大部分New集群中的节点不会选出第二个leader了),反过来说,如果new节点集群选了一个拥有Cnew配置的节点,那么Cold_new在new节点集群中必然没法得到多数同意, 因此可以看出不会同时存在两个leader。

T4之后,再选leader一定是选择拥有Cnew配置的candidate. 因为假设一个拥有Cold_new的节点申请大家的投票,需要Cnew中的大部分节点同意,但是Cnew中的大部分人都已经写入了日志Cnew,所以他们不会同意Cold_new节点成为leader.

以上是配置切换log写入成功的情况,写入失败是:Cold_new写入失败/Cnew写入失败的情况参考:
http://blog.csdn.net/zhang_shuai_2011/article/details/38585725

你可能感兴趣的:(raft协议-集群成员变化处理)