副本集成员

MongoDB 中的副本集是一组mongod个进程,它们提供了冗余和高可用性。副本集的成员是:

  • Primary.

    • 主服务器接收所有写操作。
  • Secondaries.

    • 辅助数据库从主数据库复制操作以维护相同的数据集。辅助服务器可能具有用于特殊用途配置文件的其他配置。例如,次要对象可以是non-votingpriority 0

副本集的最低推荐配置是具有三个数据承载成员的三个成员副本集:一个primary和两个secondary成员。在某些情况下(例如您有一个主服务器和一个辅助服务器,但由于成本限制,禁止添加另一个辅助服务器),您可以选择包含arbiter。仲裁者参加elections,但不保存数据(即不提供数据冗余)。

在 3.0.0 版中进行了更改:副本集最多可以有50 members个,但只有 7 个投票成员。 [2]在以前的版本中,副本集最多可包含 12 个成员。

Primary

主节点是副本集中接收写操作的唯一成员。 MongoDB 在primary上应用写操作,然后在主oplog上记录操作。 Secondary成员复制此日志并将操作应用于其数据集。

在下面的三成员副本集中,主数据库接受所有写入操作。然后,辅助服务器复制操作日志以应用于其数据集。

读写主数据库的默认路由图。

副本集的所有成员都可以接受读取操作。但是,默认情况下,应用程序将其读取操作定向到主要成员。有关更改默认读取行为的详细信息,请参见Read Preference

副本集最多可以有一个主副本。 [3]如果当前的主要数据库不可用,则选举确定新的主要数据库。有关更多详细信息,请参见副本集选举

Secondaries

辅助数据库维护primary's数据集的副本。为了复制数据,辅助服务器在异步进程中将主服务器oplog的操作应用于其自己的数据集。 [1]一个副本集可以具有一个或多个辅助副本。

以下三成员副本集具有两个辅助成员。辅助节点复制主节点的操作日志,并将操作应用于其数据集。

由一个主要成员和两个次要成员组成的 3 成员副本集的示意图。

尽管 Client 端无法将数据写入辅助数据库,但是 Client 端可以从辅助成员读取数据。有关 Client 端如何将读取操作定向到副本集的更多信息,请参见Read Preference

中学可以成为小学。如果当前的主要节点不可用,则副本集会保留一个election来选择哪个辅助节点成为新的主要节点。

有关更多详细信息,请参见副本集选举

您可以为特定目的配置辅助成员。您可以将辅助配置为:

  • 防止它成为选举中的主要对象,从而使其可以驻留在辅助数据中心或充当冷备用数据库。参见优先级 0 副本集成员

  • 阻止应用程序从中读取数据,这使它可以运行需要与正常流量隔离的应用程序。参见隐藏副本集成员

  • 保留运行中的“历史”快照,以用于从某些错误(例如意外删除的数据库)中恢复。参见延迟副本集成员

[1]对于从版本 3.6.11 开始的 MongoDB 3.6 部署,副本集的辅助成员现在为记录操作日志条目,所花费的时间超过了慢操作阈值。这些慢速 oplog 消息将在文本applied op: <oplog entry> took <num>ms下的REPL组件下的diagnostic log中记录。这些慢操作日志条目仅取决于慢操作阈值。它们不取决于日志级别(系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。

Arbiter

在某些情况下(例如,您有一个主服务器和一个辅助服务器,但由于成本限制,禁止添加另一个辅助服务器),您可以选择将仲裁器添加到副本集。仲裁人没有数据集副本,也不能成为主要副本。但是,仲裁员参加小学选举。仲裁员的选举权恰好是1

在 3.6 版中进行了更改:从 MongoDB 3.6 开始,仲裁者的优先级为0。将副本集升级到 MongoDB 3.6 时,如果现有配置的仲裁者的优先级为1,则 MongoDB 3.6 会将仲裁器的优先级重新配置为0

Important

不要在还承载副本集主要成员或次要成员的系统上运行仲裁程序。

要添加仲裁器,请参见将仲裁器添加到副本集

有关使用仲裁器的注意事项,请参见复制集仲裁器

[2]虽然建议将副本集用于生产,但副本集最多可支持50 members。如果您的部署需要 50 个以上的成员,则需要使用master-slave复制。但是,主从复制缺少自动故障转移功能。
[3]some circumstances中,副本集中的两个节点可能暂时认为它们是主要节点,但是最多,其中一个节点将能够完成{ w: "majority" }写入关注。可以完成{ w: "majority" }写操作的节点是当前主节点,另一个节点是以前的主节点,通常由于network partition而尚未识别其降级。发生这种情况时,尽管已请求读取首选项primary,但连接到先前主服务器的 Client 端仍可能会观察到过时的数据,并且对先前主服务器的新写入最终将回滚。