作者:招生咨询1232013 | 来源:互联网 | 2023-06-01 18:18
一、常规处理成员变更存在的问题我们先将成员变更请求当成普通的写请求,由领导者得到多数节点响应后,每个节点提交成员变更日志,将从旧成员配置(Cold)切换到新成员配置(Cnew)。但
一、常规处理成员变更存在的问题
- 我们先将成员变更请求当成普通的写请求,由领导者得到多数节点响应后,每个节点提交成员变更日志,将从旧成员配置(Cold)切换到新成员配置(Cnew)。
- 但每个节点提交成员变更日志的时刻可能不同,这将造成各个服务器切换配置的时刻也不同,这就有可能选出两个领导者,破坏安全性。
1.1、案例
如图,蓝色代表新的配置。绿色代表老的配置。Old状态有三台机器Server1、2、3。 New加入两台server4、5。
考虑以下这种情况:集群配额从3 台机器变成了5 台,可能存在这样的一个时间点(红色箭头),两个不同的领导者在同一个任期里都可以被选举成功(双主问题),一个是通过旧的配置,一个通过新的配置。
1. 在箭头那个时候,发起leader选举
1. server1、2使用老配置,他们之中的一个会被当选为leader。
2. 3、4、5使用新的配置,他们之中的一个会被当选为leader。
1.2、出现双主的场景
- 成员变更存在的问题是增加或者减少的成员太多了,导致旧成员组和新成员组没有交集,因此出现了双主。
二、解决方案(只需要保证不会让新或者旧配置单独作出决定就行)
- 每次成员变更只允许增加或删除一个成员(如果要变更多个成员,连续变更多次)