副本集成员国

副本集的每个成员都有一个状态。

NumberNameState Description
0STARTUP尚未成为任何集合的活跃成员。所有成员都以这种状态启动。 mongodSTARTUP时解析副本集配置文档
1PRIMARY处于状态primary的成员是唯一可以接受写操作的成员。有资格投票。
2SECONDARY处于状态secondary的成员正在复制数据存储。有资格投票。
3RECOVERING成员要么执行启动自检,要么从完成rollbackresync过渡。有资格投票。
5STARTUP2该成员已加入集合,并正在运行初始同步。有资格投票。
6UNKNOWN从集合的另一个成员看,该成员的状态尚不清楚。
7ARBITERArbiters不复制数据,仅存在于选举中。有资格投票。
8DOWN从集合的另一个成员看,该成员是不可访问的。
9ROLLBACK该成员正在积极执行rollback。有资格投票。无法从该成员读取数据。
10REMOVED该成员曾经在副本集中,但随后被删除。

States

Core States

  • PRIMARY

    • 处于PRIMARY状态的成员接受写操作。一个副本集一次最多具有一个主副本。 [1] SECONDARY成员在election之后成为主要成员。 PRIMARYState 的成员有资格投票。
  • SECONDARY

    • 处于SECONDARY状态的成员复制主数据库的数据集,并且可以配置为接受读取操作。次要候选人有资格在选举中投票,如果主要候选人不可用,则可以选举为PRIMARY状态。
  • ARBITER

    • 处于ARBITER状态的成员不复制数据或接受写操作。他们有资格投票,仅在选举中 break 平局。如果副本集的表决成员数为偶数,并且副本集受困,则副本集应仅具有ARBITER状态的成员。任何副本集中最多只能配置一个仲裁器。有关使用仲裁器的注意事项,请参见复制集仲裁器

有关核心状态的更多信息,请参见副本集成员

Other States

  • STARTUP

    • 副本集的每个成员都以STARTUP状态启动。然后mongod加载该成员的副本集配置,并将该成员的状态转换为STARTUP2ARBITERSTARTUP中的成员没有资格投票,因为他们尚未成为任何副本集的公认成员。
  • STARTUP2

    • mongod完成加载该成员的配置后,副本集中的每个数据承载成员都会进入STARTUP2状态,这时它将成为副本集中的活动成员并可以投票。然后,成员决定是否进行初始同步。如果成员开始初始同步,则该成员将保留在STARTUP2中,直到复制了所有数据并构建了所有索引。之后,成员转换为RECOVERING
  • RECOVERING

    • 当副本集的成员尚未准备好接受读取时,它将进入RECOVERING状态。 RECOVERING状态可以在正常操作期间发生,并不一定反映错误情况。 RECOVERINGState 的成员有资格在选举中投票,但没有资格进入PRIMARYState。

在复制足够的数据以保证 Client 端可以读取一致的数据后,成员从RECOVERING过渡到SECONDARYRECOVERINGSECONDARY状态之间的唯一区别是RECOVERING禁止 Client 端读取而SECONDARY允许它们读取。 SECONDARY状态不能保证有关主数据的陈旧性。

由于过载,secondary可能远远落在副本集的其他成员之后,因此可能需要与副本集的其余成员resync。发生这种情况时,成员进入RECOVERING状态并需要手动干预。

  • ROLLBACK
    • 每当副本集在选举中替换primary时,旧的主副本可能包含未复制到secondary成员的文档。在这种情况下,旧的主要成员将还原这些写入。在rollback期间,成员将具有ROLLBACK状态。 ROLLBACKState 的成员有资格在选举中投票。

Error States

处于任何错误状态的成员均无法投票。

  • UNKNOWN

    • 从未将状态信息传递给副本集的成员处于UNKNOWN状态。
  • DOWN

    • 副本集的其余成员将失去与副本集的连接的成员视为DOWN
  • REMOVED

    • 从副本集中删除的成员进入REMOVED状态。当成员进入REMOVED状态时,日志将以replSet REMOVED消息条目标记此事件。
[1]some circumstances中,副本集中的两个节点可能暂时认为它们是主要节点,但是最多,其中一个节点将能够完成{ w: "majority" }写入关注。可以完成{ w: "majority" }写操作的节点是当前主节点,另一个节点是以前的主节点,通常由于network partition而尚未识别其降级。发生这种情况时,尽管已请求读取首选项primary,但连接到先前主服务器的 Client 端仍可能会观察到过时的数据,并且对先前主服务器的新写入最终将回滚。