副本集选举
在本页面
Replica sets使用选举确定哪个集合成员将成为primary。副本集可以触发选举,以响应各种事件,例如:
-
向副本集添加新节点,
-
使用rs.stepDown()或rs.reconfig()之类的方法执行副本集维护,以及
在下图中,主节点不可用的时间比configured timeout长,并触发automatic failover进程。其余的辅助服务器之一要求选择新的主服务器并自动恢复正常操作。
副本集无法处理写入操作,直到选举成功完成。如果将副本集配置为在中学上运行,则副本集可以 continue 提供读取查询。
假设默认为副本配置设置,集群选择新的主要数据库之前的中值时间通常不应超过 12 秒。这包括将主要对象标记为unavailable并调用并完成election所需的时间。您可以通过修改settings.electionTimeoutMillis复制配置选项来调整此时间段。网络延迟之类的因素可能会延长完成副本集选举所需的时间,进而影响群集在没有主数据库的情况下可以运行的时间。这些因素取决于您的特定群集体系结构。
您的应用程序连接逻辑应包括对自动故障转移和后续选举的容忍度。
3.6 版中的新功能:MongoDB 3.6 驱动程序可以一次检测到主数据库的丢失并自动重试某些写入操作,从而提供了对自动故障转移和选举的其他内置处理。
影响选举的因素和条件
复制选择协议
3.2 版中的新增功能:MongoDB 引入了复制协议的版本 1(protocolVersion: 1),以减少副本集故障转移时间并加快对多个同时主数据库的检测。默认情况下,新副本集使用protocolVersion: 1。 MongoDB 的早期版本使用协议的版本 0.有关详细信息,请参见复制选择增强。
Heartbeats
副本集成员每两秒钟发送一次彼此的心跳(ping)。如果心跳在 10 秒钟内未恢复,则其他成员将不良成员标记为不可访问。
Member Priority
副本集具有稳定的主副本后,选举算法将进行“尽力而为”尝试,以使具有最高priority可用值的辅助副本进行选举。成员的优先权会影响选举的时间和结果;具有较高优先级的中学的选举时间比具有较低优先级的中学的选举时间要早,并且也更有可能获胜。但是,即使可以使用较高优先级的次要实例,也可以在短时间内将较低优先级的实例选为主要实例。副本集成员 continue 进行选举,直到具有最高优先级的成员成为主要成员为止。
优先级值为0
的成员不能成为主要成员,也不能寻求选举。有关详细信息,请参见优先级 0 副本集成员。
数据中心丢失
使用分布式副本集,数据中心的丢失可能会影响其他一个或多个数据中心中其余成员选举主数据库的能力。
如果可能,请在数据中心之间分布副本集成员,以最大程度地确保即使丢失数据中心,其余副本集成员之一也可以成为新的主要成员的可能性。
See also
Network Partition
network partition可以将主节点隔离到具有少数节点的分区中。当主节点检测到只能看到副本集中的少数节点时,该主节点将降为主节点并成为辅助节点。独立地,可以与大多数节点(包括自身)进行通信的分区中的成员进行选举以成为新的主节点。
选举否决权
在版本 3.2 中更改:protocolVersion: 1消除了否决权的需要。以下否决权讨论适用于使用较旧的protocolVersion: 0的副本集。
对于使用protocolVersion: 0的副本集,副本集的所有成员都可以否决选举,包括non-voting members。成员将否决选举:
-
如果寻求选举的成员不是选民的成员。
-
从另一个有投票权的成员的角度来看,如果当前的主要成员最近进行的操作(即
optime
更高)比寻求选举的成员更多。 -
如果当前的主要成员与寻求选举的成员具有相同或更多的近期操作(即
optime
更高或相等)。 -
如果优先级 0 成员 [1]是选举时的最新成员。在这种情况下,集合中的另一个合格成员将赶上优先级 0 成员成员的状态,然后尝试成为主要成员。
-
如果寻求选举的成员的优先级低于集合中也有资格选举的另一成员。
[1] | Hidden和delayed表示priority 0配置。 |
Voting Members
副本集成员配置设置members[n].votes和成员state
确定成员是否在选举中投票。
- members[n].votes设置等于 1 投票的所有副本集成员。要排除某个成员在election中投票的权利,请将其members[n].votes配置的值更改为
0
。
在 3.2 版中进行了更改:-非投票成员的priority必须为 0.
-
只有以下 State 的有投票权的成员才有资格投票:
Non-Voting Members
尽管非投票成员不会在选举中投票,但是这些成员持有副本集数据的副本,并且可以接受来自 Client 端应用程序的读取操作。
由于副本集最多可包含50 members,但最多只能包含7 个投票成员,因此无表决权的成员允许副本集具有七个以上的成员。
非投票成员的priority必须为 0.
例如,下面的九个成员副本集具有七个投票成员和两个非投票成员。
{
"_id" : <num>,
"host" : <hostname:port>,
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 0
}
Important
请勿更改投票数以控制哪些成员将成为主要成员。而是,修改members[n].priority选项。 仅在特殊情况下更改票数。例如,允许超过七个成员。
要配置非投票成员,请参阅配置非投票副本集成员。