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

复制

本页内容

  • 冗余和数据可用性
  • MongoDB 中的复制
  • 异步复制
  • 自动故障转移
  • 读取操作
  • 事务
  • 更改流
  • 附加功能

MongoDB 中的 副本集 是一组mongod 进程,用于维护相同的数据集。副本集提供冗余和高可用性,是所有生产部署的基础。本节介绍了 MongoDB 中的复制以及副本集的组件和架构。本节还提供了与副本集相关的常见任务的教程。

您可以在 在 UI 中部署副本集 以托管在 MongoDB Atlas。

复制提供冗余并提高 数据可用性。在多个数据库服务器上存储数据的多个副本,可以提供对单个数据库服务器丢失的容错能力。

在某些情况下,复制可以提高读取能力,因为客户端可以将读取操作发送到不同的服务器。在不同数据中心维护数据副本可以提高分布式应用程序的数据本地性和可用性。您还可以为专用目的(如灾难恢复、报告或备份)维护额外的副本。

副本集是一组保持相同数据集的 mongod 实例。一个副本集包含多个数据节点和一个可选的仲裁节点。在数据节点中,只有一个成员被认为是主节点,其他节点被认为是次级节点。

警告

每个副本集节点必须属于一个副本集,且仅属于一个副本集。副本集节点不能属于多个副本集。

主节点 接收所有写操作。副本集只能有一个主节点能够使用 { w: "majority" } 写关注来确认写操作;尽管在某些情况下,另一个 mongod 实例可能暂时认为自己也是主节点。 [1] 主节点将其数据集的所有更改记录在其操作日志中,即 oplog。有关主节点操作的更多信息,请参阅 副本集主节点

Diagram of default routing of reads and writes to the primary.
点击放大

次级节点 复制主节点的 oplog 并将操作应用于其数据集,使次级节点的数据集反映主节点的数据集。如果主节点不可用,则合格的次级节点将进行选举,以选举自己成为新的主节点。有关次级成员的更多信息,请参阅 副本集次级成员

Diagram of a 3 member replica set that consists of a primary and two secondaries.

在某些情况下(例如,你有主节点和次级节点,但成本限制阻止添加另一个次级节点),你可以选择将一个 mongod 实例作为 仲裁者 添加到副本集中。仲裁者参与 选举 但不持有数据(即不提供数据冗余)。有关仲裁者的更多信息,请参阅 副本集仲裁者

Diagram of a replica set that consists of a primary, a secondary, and an arbiter.

仲裁者(arbiter)始终是仲裁者,而主节点(primary)可能会降级成为辅助节点(secondary),在选举过程中辅助节点也可能成为主节点。

辅助节点会异步复制主节点的oplog并将操作应用到它们的数据集中。由于辅助节点数据集反映了主节点数据集,即使在成员失败的情况下,副本集仍可继续运行。

有关复制的详细信息,请参阅副本集Oplog副本集数据同步

副本集的辅助节点现在会记录应用时间超过慢操作阈值的oplog条目。这些慢操作oplog消息

  • 被记录在辅助节点的诊断日志中。

  • REPL组件下记录,文本为已应用操作:<oplog条目>耗时 <num>ms

  • 不依赖于日志级别(无论是系统级别还是组件级别)

  • 不依赖于分析级别。

  • slowOpSampleRate影响。

分析器不会捕获慢操作oplog条目。

复制延迟是主节点上的操作与将此操作从操作日志应用到副节点之间的延迟。一些小的延迟可能是可以接受的,但随着复制延迟的增加,将出现重大问题,包括在主节点上建立缓存压力。

管理员可以通过限制主节点应用其写入的速度,以保持大多数已提交延迟在一个可配置的最大值flowControlTargetLagSeconds以下。

默认情况下,流量控制是启用的。

注意

要启用流量控制,副本集/分片集群必须具有4.2功能兼容性版本(fCV)大多数已启用的读取关注。也就是说,如果fCV不是4.2或读取关注大多数被禁用,则启用流量控制没有效果。

在启用流量控制的情况下,随着延迟接近flowControlTargetLagSeconds,主节点上的写入必须获得票证才能在获取锁之前应用写入。通过限制每秒发行的票证数量,流量控制机制试图将延迟保持在目标以下。

有关更多信息,请参阅检查复制延迟流量控制

当主节点与集合中的其他成员超过配置的electionTimeoutMillis时间(默认为10秒)不通信时,一个符合条件的从节点将请求进行选举,以将自己指定为新主节点。集群尝试完成新主节点的选举并恢复正常操作。

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秒,假设默认的replica configuration settings。这包括将主节点标记为不可用以及调用和完成选举所需的时间。您可以通过修改settings.electionTimeoutMillis复制配置选项来调整此时间间隔。网络延迟等因素可能会延长副本集选举完成所需的时间,这反过来又会影响集群在没有主节点的情况下可能运行的时间。这些因素取决于您的特定集群架构。

electionTimeoutMillis复制配置选项从默认值10000(10秒)降低可以更快地检测主节点故障。然而,由于诸如临时网络延迟等因素,即使主节点本身状态良好,集群也可能更频繁地调用选举。这可能导致回滚w : 1写操作的增加。

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

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

MongoDB提供镜像读取,以使用最近访问的数据预热可选举的从节点缓存。预热从节点的缓存可以帮助在选举后更快地恢复性能。

有关MongoDB故障转移过程的更多信息,请参阅

默认情况下,客户端从主节点读取[1];然而,客户端可以指定读取偏好,将读取操作发送到辅助节点。

Diagram of an application that uses read preference secondary.
点击放大

异步复制到辅助节点意味着从辅助节点读取的数据可能不会反映主节点的数据状态。

包含读取操作的分布式事务必须使用读取偏好primary。给定事务中的所有操作必须路由到同一成员。

有关从副本集读取的信息,请参阅读取偏好。

根据读取关注点,客户端可以在写入之前看到写入的结果:

  • 无论写入的写入关注点如何,使用"local""available"读取关注点的其他客户端可以在写入操作被确认之前看到写入操作的结果。

  • 使用 "local""available" 读取关注度的客户端可以读取在副本集故障转移期间可能被 回滚 的数据。

在多文档事务的操作中,当事务提交时,事务中做出的所有数据更改都会被保存并对外可见。也就是说,事务不会在回滚某些更改的同时提交其他更改。

直到事务提交,事务中做出的数据更改在事务外部是不可见的。

然而,当事务写入多个分片时,并非所有的外部读取操作都需要等待提交的事务结果在分片间可见。例如,如果一个事务提交并在分片A上可见写入1,但在分片B上写入2尚未可见,则在外部读取关注度为 "local" 时可以读取写入1的结果,而不会看到写入2。

有关MongoDB的读取隔离、一致性和最新性更多信息,请参阅读取隔离、一致性和最新性。

镜像读取减少了断电或计划性维护后主选举的影响。在副本集的 故障转移 之后,接管新主机的二级副本更新其缓存以响应新查询。当缓存正在预热时,性能可能会受到影响。

镜像读取预先加热可选举的二级副本集成员的缓存。为了预热可选举二级的缓存,主节点将其接收到的支持的操作的样本镜像到可选举的二级。

接收镜像读取的可选举二级副本集成员的子集大小可以通过mirrorReads 参数进行配置。有关更多详细信息,请参阅启用/禁用镜像读取支持

注意

镜像读取不会影响主节点对客户端的响应。主节点镜像到二级的读取是“点火并忘记”的操作。主节点不会等待响应。

镜像读取支持以下运算

镜像读取默认启用,并使用默认的 采样率0.01。要禁用镜像读取,将 mirrorReads 参数设置为 { samplingRate: 0.0 }

db.adminCommand( {
setParameter: 1,
mirrorReads: { samplingRate: 0.0 }
} )

采样率大于 0.0 时,主节点会将支持的读取操作镜像到一组可选举的从节点中。采样率为 0.01 时,主节点会将它接收到的支持读取操作的百分之一镜像到一组可选举的从节点中。

例如,考虑一个由一个主节点和两个可选举从节点组成的副本集。如果主节点接收 1000 可镜像的操作,并且采样率为 0.01,则主节点会将大约 10 支持读取操作镜像到可选举的从节点。每个可选举的从节点只会接收 10 个读取操作中的一小部分。主节点将每个镜像读取操作发送到随机选择的不为空的可选举从节点集合中。

要修改镜像读的采样率,将 mirrorReads 参数设置为介于 0.01.0 之间的数字

  • 采样率为 0.0 将禁用镜像读

  • 采样率在 0.01.0 之间,主节点将根据指定的采样率随机选择支持的读操作发送到可选举的辅助节点。

  • 采样率为 1.0 时,主节点将所有支持的读操作发送到可选举的辅助节点。

有关详细信息,请参阅 mirrorReads

在执行操作时指定字段,serverStatus 命令和 db.serverStatus() 脚本方法将返回 mirroredReads 指标

db.serverStatus( { mirroredReads: 1 } )

多文档事务适用于副本集。

包含读取操作的分布式事务必须使用读取偏好primary。给定事务中的所有操作必须路由到同一成员。

直到事务提交,事务中做出的数据更改在事务外部是不可见的。

然而,当事务写入多个分片时,并非所有的外部读取操作都需要等待提交的事务结果在分片间可见。例如,如果一个事务提交并在分片A上可见写入1,但在分片B上写入2尚未可见,则在外部读取关注度为 "local" 时可以读取写入1的结果,而不会看到写入2。

更改流适用于副本集和分片集群。更改流允许应用程序在不需要尾随操作日志的复杂性和风险的情况下访问实时数据更改。应用程序可以使用更改流订阅集合或集合上的所有数据更改。

副本集提供多种选项来支持应用需求。例如,您可能需要部署具有多个数据中心成员的副本集,或者通过调整某些成员的 members[n].priority 来控制选举结果。副本集还支持专门的成员用于报告、灾难恢复或备份功能。

请参阅优先级 0 副本集成员隐藏副本集成员延迟副本集成员获取更多信息。

[1](1, 2) 在某些情况下,副本集中的两个节点可能会暂时认为自己是主节点,但最多只有一个节点能够以{ w: "majority" }写关注级别完成写入。能够以{ w: "majority" }写关注级别完成写入的节点是当前的主节点,而另一个节点是尚未承认其降级的前主节点,这通常是由于网络分区引起的。当这种情况发生时,连接到前主节点的客户端可能会观察到陈旧的数据,尽管它们已经请求了primary读偏好,并且最终对新前主节点的写入将回滚。

返回

数据库引用