当主节点与集群中的其他成员通信的时间超过配置的 electionTimeoutMillis
(默认为 10 秒)时,符合选举要求的从节点将要求选举,并提名自己为新的主节点。集群尝试完成选举新主节点并恢复正常工作。
选举完成前,副本集无法处理写入操作。如果将副本集配置为:在主节点处于脱机状态时,在次节点上运行,则副本集可以继续提供读取查询。
假设副本配置 (opens new window)采用默认配置,则集群选择新节点的时间通常不应超过 12 秒,这包括:将主节点标记为不可用并完成选举所需的时间。可以通过修改 settings.electionTimeoutMillis
(opens new window)配置选项来调整此时间。网络延迟等因素可能会延长完成选举所需的时间,进而影响集群在没有主节点的情况下可以运行的时间。这些因素取决于集群实际的情况。
将默认为 10 秒的 electionTimeoutMillis
(opens new window)选项数值缩小,可以更快地检测到主要故障。但是,由于网络延迟等因素,集群可能会更频繁地进行选举,即使该主节点实际上处于健康状态。这可能导致 w : 1 (opens new window)写操作的回滚次数增加。
应用程序的连接逻辑应包括对自动故障转移和后续选举的容错处理。从 MongoDB 3.6 开始,MongoDB 驱动程序可以检测到主节点的失联,并可以自动重试一次某些写入操作。
从 MongoDB4.4 开始,MongoDB 提供镜像读取:将可选举的从节点的最近访问的数据,预热为缓存。预热从节点的缓存可以帮助在选举后更快地恢复。