选举规则
- 一旦发现主节点没有响应 / 发送心跳请求, 那么副节点就会认为主节点挂了
- 一旦发现主节点挂了, 任意一个副节点都可以发起选举
- (发起选举的节点我们称之为
候选节点
, 每一个节点内部都有一个选举计数器
) - 发起选举的节点会给自己先投一票, 然后将自己的票数依次发送给其它节点
其它节点收到投票请求后, 会先利用发送过来的票数同步自己计数器的票数:
- 然后再对比自己的数据和候选节点的数据哪个更完整
- 如果自己的更完整, 那么会投出反对票
- 如果候选节点的更完整, 那么会投出赞同票
- 最后如果超过半数的节点投出赞同票, 那么候选节点就会变成主节点
- 最后如果没有超过半数节点投出赞同票, 那么其它节点会重新发起选举, 重复上述过程
!> 一个复制集中最多只能有 7
个投票节点
!> 如果某个节点没有返回投票结果, 那么默认就是不赞同, 挂掉的节点不会返回结果
!> 因为选举需要超过半数节点同意, 才会将副节点变成主节点, 所以在企业开发中一个复制集至少需要 3 个节点,否则一旦主节点挂了, 永远无法完成投票
!> 因为选举需要超过半数节点同意, 才会将副节点变成主节点, 所以在企业开发中节点的个数最好是 奇数
触发选举的其它条件
- 初始化复制集时, 会自动触发选举
- 有新节点加入时, 会自动触发选举
- 当前主节点挂掉时, 会自动触发选举