副本集的每个成员都有一个状态。
状态号 | 状态名称 | 释义 | 说明 |
0 | STARTUP | 启动 | 尚未成为任何集群的活跃成员。所有成员都以这种状态启动。 mongod在启动时会解析副本集配置文档。 |
1 | PRIMARY | 主 | 处于primary状态的成员是唯一可接受写操作的成员。 有资格投票。 |
2 | SECONDARY | 辅助 | 处于secondary状态的成员正在复制数据存储。 有资格投票。 |
3 | RECOVERING | 恢复 | 成员执行启动自检,或从 完成回滚或重新同步 过渡。 有资格投票。 |
5 | STARTUP2 | 启动2 | 该成员已加入集群,并且正在运行初始同步。 有资格投票。 |
6 | UNKNOWN | 未知 | 从集群中另一个成员的角度看,该成员的状态未知。 |
7 | ARBITER | 仲裁 | 仲裁不复制数据,仅存在于选举中。 有资格投票。 |
8 | DOWN | 掉线 | 从该集群的另一个成员看,该成员无法访问。 |
9 | ROLLBACK | 回滚 | 该成员正在积极执行回滚。 有资格投票。 无法从该成员读取数据。从4.2版开始,当成员进入ROLLBACK状态时,MongoDB将终止所有正在进行的用户操作。 |
10 | REMOVED | 已删除 | 此成员曾经在副本集中,但随后被删除。 |
一、核心状态
1. PRIMARY
处于PRIMARY状态的成员接受写操作。
一个副本集一次最多具有一个主副本。
SECONDARY成员在选举后成为主成员[1]。
PRIMARY状态的成员有资格投票。
2.SECONDARY
处于SECONDARY状态的成员复制主数据库的数据集,并且可通过配置接受读取操作。
辅助节点有资格在选举中投票,如果主节点不可用,则可以选举为PRIMARY。
3.ARBITER
处于ARBITER状态的成员不复制数据或接受写操作。
他们有资格投票,仅在选举中打破平局。
如果副本集的表决成员数将是偶数,并且副本集可能受困,则副本集应仅具有处于ARBITER状态的成员。
任何副本集中最多只能配置一个仲裁。有关使用仲裁的注意事项,请参阅副本集仲裁。
有关核心状态的更多信息,请参见副本集成员。
二、其他状态
1. STARTUP
副本集的每个成员都以STARTUP状态启动。然后mongod加载该成员的副本集配置信息,并将其状态转换为STARTUP2或ARBITER。 STARTUP中的成员尚未获得任何投票集的公认成员资格,因此没有资格投票。
2.STARTUP2
mongod完成加载该成员的配置后,副本集中的每个数据承载成员都会进入STARTUP2状态,这时它将成为副本集中的活跃成员并可以投票。然后,成员决定是否进行初始同步。如果成员开始初始同步,则该成员将保留在STARTUP2中,直到复制所有数据并构建所有索引为止。之后,成员转换为RECOVERING。
3.RECOVERING
当副本集的成员尚未准备好接受读取时,它将进入RECOVERING状态。 RECOVERING状态可能在正常操作期间发生,并不一定反映错误情况。处于RECOVERING状态的成员有资格在选举中投票,但没有资格进入PRIMARY状态。
在复制了足够的数据以保证用于客户端读取的数据的一致视图之后,成员从RECOVERING过渡到SECONDARY。 RECOVERING和SECONDARY状态之间的唯一区别是RECOVERING禁止客户端读取,而SECONDARY允许它们读取。 SECONDARY状态不能保证任何有关主数据过时问题。
由于过载,辅助副本可能远远落在副本集的其他成员之后,因此它可能需要与副本集中的其余成员重新同步。发生这种情况时,成员将进入RECOVERING状态,并且需要手动干预。
4.ROLLBACK
每当副本集替换一次选举中的主副本时,旧的主副本可能包含未复制到辅助成员的文档。在这种情况下,旧的主要成员将还原这些写入。在回滚期间,成员将具有ROLLBACK状态。处于ROLLBACK状态的成员有资格在选举中投票。
从4.2版开始,当成员进入ROLLBACK状态时,MongoDB将终止所有正在进行的用户操作。
三、错误状态
处于任何错误状态的成员都无法投票。
1.UNKNOWN
从未将状态信息传递给副本集的成员处于UNKNOWN状态。
2.DOWN
副本集的其余成员将失去与副本集的连接的成员视为DOWN。
3.REMOVED
从副本集中删除的成员进入“REMOVED”状态。 当成员进入REMOVED状态时,日志将使用replSet REMOVED消息条目记录此事件。
[1]在某些情况下,副本集中的两个节点可能会短暂地认为它们是主要节点,但是最多,其中一个节点将能够完成{w:“ majority”}写入问题。 可以完成{w:“ majority”}写入的节点是当前主节点,另一个节点是以前的主节点,通常由于网络分区而尚未意识到其降级。 发生这种情况时,尽管已请求前一个主服务器读取优先级,但连接到前一个主服务器的客户端仍可能会观察到过时的数据,并且对前一个主服务器的新写入最终将回滚。