文档菜单
文档首页
/
MongoDB 手册
/ /

副本集选举

本页内容

  • 影响选举的因素和条件
  • 投票成员
  • 非投票成员

副本集使用选举来确定哪个成员将成为主节点。副本集可以响应各种事件触发选举,例如

在下图中,主节点不可用时间超过了配置的超时时间,并触发了自动故障转移过程。剩余的次级节点之一将发起选举以选择新的主节点,并自动恢复正常操作。

Diagram of an election of a new primary. In a three member replica set with two secondaries, the primary becomes unreachable. The loss of a primary triggers an election where one of the secondaries becomes the new primary
点击放大

副本集在选举成功完成之前无法处理写操作。如果配置了在次级上运行,副本集可以继续服务读查询。

集群选举新的主节点所需的中位时间通常不应超过12秒,前提是默认的副本配置设置。这包括将主节点标记为不可用所需的时间,以及进行和完成一个选举的时间。您可以通过修改settings.electionTimeoutMillis副本配置选项来调整此时间段。网络延迟等因素可能会延长副本集选举完成所需的时间,从而影响集群在没有主节点的情况下可能运行的时间。这些因素取决于您的特定集群架构。

您的应用程序连接逻辑应包括对自动故障转移和随后选举的容忍度。MongoDB驱动程序可以检测主节点的丢失,并自动重试某些写操作一次,提供额外的内置自动故障转移和选举处理。

兼容驱动程序默认启用可重试的写操作

副本集的 protocolVersion: 1 降低了副本集故障切换时间,并加速了多个同时主节点的检测。

您可以使用 catchUpTimeoutMillis 在更快的故障切换和保留 w:1 写入之间进行优先级排序。

有关 pv1 的更多信息,请参阅 自管理副本集协议版本。

副本集成员每两秒钟向彼此发送心跳(ping)。如果一个心跳在10秒内没有返回,其他成员将该成员标记为不可访问。

在副本集有一个稳定的-primary 之后,选择算法将尽力确保具有最高 priority 的二级成员进行选择。成员优先级影响选举的时间和结果;优先级较高的二级成员比优先级较低的二级成员相对更早地调用选举,并且更有可能获胜。然而,即使有更高优先级的二级成员可用,较低优先级的实例也可能在短时间内被选为-primary。副本集成员会继续调用选举,直到可用的最高优先级成员成为-primary。

优先级值为 0 的成员不能成为主节点,也不会寻求选举。详细信息,请参阅优先级 0 复制集成员。

MongoDB 提供了镜像读取,以预加热可选举的辅助成员的缓存,使其包含最近访问的数据。使用镜像读取,主节点可以镜像它接收到的操作子集,并将它们发送到可选举的辅助节点子集。预热辅助节点的缓存可以帮助在选举后更快地恢复性能。

详细信息,请参阅镜像读取。

在分布式复制集中,数据中心的丢失可能会影响其他数据中心或数据中心的剩余成员选举主节点的能力。

如果可能,请将复制集成员分布在不同数据中心,以最大限度地提高即使数据中心丢失,剩余的复制集成员中仍有可能成为新主节点的可能性。

提示

另请参阅

网络分区可能会将主节点分割成只有少数节点的分区。当主节点检测到它只能看到副本集的少数投票节点时,主节点会下台并成为从节点。独立地,一个可以与大多数投票节点(包括它自己)通信的分区成员将进行选举,成为新的主节点。

副本集成员配置设置 members[n].votes 和成员 state 决定了成员是否在选举中投票。

尽管非投票成员不参与投票,但这些成员持有副本集数据的副本,并可以接受来自客户端应用程序的读取操作。

由于副本集最多可以有50个成员,但只有7个投票成员,非投票成员允许副本集拥有超过七个成员。

非投票成员(即 votes0)必须有 priority 为 0。

例如,以下九成员副本集有七个投票成员和两个非投票成员。

Diagram of a 9 member replica set with the maximum of 7 voting members.

非投票成员的votespriority都等于0

{
"_id" : <num>,
"host" : <hostname:port>,
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 0
}

重要

不要更改投票数量来控制哪些成员将成为主节点。相反,修改members[n].priority选项。仅在特殊情况中更改投票数量。例如,允许超过七个成员。

要配置非投票成员,请参阅配置非投票自我管理副本集成员。

返回

高可用性