副本集节点
MongoDB 中的副本集是一个可提供冗余和高可用性的 mongod
进程群组。副本集的节点包括:
- 主节点
- 主节点接收所有写入操作。
- 从节点
- 从节点复制主节点的操作以维护相同的数据集。从节点可能有针对特殊使用配置文件的额外配置。例如,从节点可以是 non-voting 或 priority 0。
副本集的最低推荐配置是具有三个承载数据成员的三成员副本集:一个主副本和两个辅助副本成员。在某些情况下(例如您有一个主副本和一个辅助副本,但成本限制禁止添加其辅助副本),您可以选择包括仲裁程序。仲裁程序参与选举,但不持有数据(即不提供数据冗余)。
一个副本集最多可以有 50 个节点,但只能有 7 个具有投票权的节点。
主节点
主节点是副本集中唯一接受写入操作的节点。MongoDB 在主节点上应用写入操作,然后在主节点的 oplog 上记录这些操作。从节点复制该日志,并将操作应用于其数据集。
在以下三节点副本集中,主节点接受所有写入操作。然后,从节点复制 oplog 以应用于其数据集。
副本集的所有节点都可以接受读取操作。但是,默认情况下,应用程序将其读取操作定向到主节点。有关更改默认读取行为的详细信息,请参阅读取偏好(Read Preference)。
副本集最多可以有一个主节点。[2] 如果当前的主节点不可用,则将通过选举决定新的主节点。有关更多详细信息,请参阅副本集选举。
从节点
从节点维护主节点的数据集副本。为了复制数据,从节点在异步过程中将来自主节点 oplog 的操作应用到自己的数据集。[1] 一个副本集可以有一个或多个从节点。
以下三节点副本集有两个从节点。从节点复制主节点的 oplog 并将操作应用于其数据集。
尽管客户端无法将数据写入从节点,但客户端可以自从节点读取数据。有关客户端如何将读取操作定向到副本集内节点的更多信息,请参阅读取偏好(Read Preference)。
一个从节点可以变成主节点。如果当前主节点变得不可用,副本集将进行选举以选择哪个从节点成为新的主节点。
有关更多详细信息,请参阅副本集选举。
您可以出于特定目的配置从节点。您可以配置一个从节点用于:
防止它在选举中成为主节点,从而允许它驻留在辅助数据中心或充当冷备份。请参阅 Priority 0 副本集节点。
防止应用程序从中读取数据,这样它就可以运行需要与正常流量分离的应用程序。请参阅隐藏的副本集节点。
保留正在运行的“历史”快照,以用于从某些错误(例如意外删除的数据库)中恢复。请参阅延迟的副本集节点。
[1] | 现在,副本集的从节点会记录应用时间超过慢操作阈值的 oplog 条目。这些慢 oplog 消息:
|
投票节点
在某些情况下(例如,当您有一个主节点和一个从节点,但受成本限制您无法添加其他从节点时),您可以选择向副本集中添加仲裁节点。仲裁节点将参与主节点的选举,但仲裁节点没有数据集的副本,从而无法成为主节点。
仲裁节点只有1
张选举票。默认情况下,仲裁节点优先级为 0
。
重要
不要在同时托管副本集主节点或从节点的系统上运行投票节点。
警告
如果承载数据的从节点不可用,则在分片集群中对分片使用主节点-从节点-仲裁节点 (PSA) 架构可能会导致可用性丧失。PSA 集群与典型的副本集不同:在分片集群中,分片执行 w: majority
写关注操作,如果确认操作所需的其余集群成员有仲裁节点,这些操作就无法完成。
要添加仲裁节点,请参阅将仲裁节点添加到自管理副本集。
有关使用投票节点时的注意事项,请参见副本集投票节点。
[2] | 在某些情况下,副本集中的两个节点可能会暂时认为它们是主节点,但最多只能有其中一个节点能够完成具有{ w:
"majority" } 写入关注的写入操作。可以完成{ w: "majority" } 写入操作的节点是当前主节点,另一个节点是尚未识别其降级(通常是由于网络分区)的前主节点。发生这种情况时,尽管已请求读取偏好primary ,但连接到前主节点的客户端可能会观察到过时数据,并且对前主节点的新写入操作最终将回滚。 |