策略
成员数量
最大投票成员:
一个复制集群最多可以有50个成员,但是最多只能有7个可投票成员。
成员数:
成员数应为奇数,偶数集群应该添加仲裁(Arbiter)节点。
仲裁节点不保存数据,占用资源更少。
容错:
成员数 | 可进行投票的最小成员数量 | 可容忍错误数 |
---|---|---|
3 | 2 | 1 |
4 | 3 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
特殊功能成员
hidden和delayed成员,可实现特殊功能,如备份或者报警。
影响选举的因素
选举协议
在3.2之后,mongodb使用protocolVersion:1
作为选举协议。
心跳
每个成员每两秒会发送一个心跳请求到所有成员,如果10秒内没有回应,会被发送心跳的成员标记为不可达。
成员优先级
就算复制集群已经有主节点后,选举算法也会尽可能的让优先级最高的从节点发起新的选举。
拥有高优先级的从节点相比那些优先级较低的,会更频繁的提出选举请求,并且更有可能被选举为主节点。
低优先级从节点也有可能被选举为主节点,但是高优先级的从节点会很快发出新的请求,从而代替低优先级的节点成为主节点。
网络隔离。
当主节点与少数节点被网络隔离时,主节点会主动退位,变为从节点。同时,一个能与大部分节点连接的节点会发起投票从而选出新的主节点。
否决
ProtocolVersion 1中取消了否决票,详见Vetos。
投票成员
复制集群通过members[n].votes
属性与成员状态state
来判断一个成员是否可以参与投票。
Vote:3.2:
- 不可投票的成员
votes
为0,priority
为0, priority
为0的成员votes
不能为0.
State:
只有一下状态的成员可以参与投票。
- PRIMARY
- SECONDARY
- RECOVERING
- ARBITER
- ROLLBACK
跨数据中心部署。
官方建议将节点部署在不同的数据中心,以防止核弹摧毁数据中心。