副本集数据同步

在本页面

为了维护共享数据集的最新副本,副本集sync的辅助成员或从其他成员复制数据。 MongoDB 使用两种形式的数据同步:初始同步以使用完整的数据集填充新成员,以及复制以将正在进行的更改应用于整个数据集。

Initial Sync

初始同步将所有数据从副本集的一个成员复制到另一成员。

Process

执行初始同步时,MongoDB:

  • 克隆除local数据库以外的所有数据库。要进行克隆,mongod将扫描每个源数据库中的每个集合,并将所有数据插入这些集合的自己的副本中。

在版本 3.4 中更改:在为每个集合复制文档时,初始同步将构建所有集合索引。在早期版本的 MongoDB 中,在此阶段仅构建_id索引。

在版本 3.4 中更改:初始同步在数据复制期间提取新添加的操作日志记录。确保目标成员在local数据库中具有足够的磁盘空间,以在此数据复制阶段持续存储这些操作日志记录。

  • 将所有更改应用于数据集。 mongod使用来源中的操作日志,更新其数据集以反映副本集的当前状态。

初始同步完成后,成员将从STARTUP2过渡到SECONDARY

要执行初始同步,请参见重新同步副本集的成员

Fault Tolerance

为了从瞬态网络或操作故障中恢复,初始同步具有内置的重试逻辑。

在版本 3.4 中进行了更改:MongoDB 3.4 改进了初始同步重试逻辑,以更灵活地应对网络上的间歇性故障。

Replication

辅助成员在初始同步后连续复制数据。次要成员从其* sync from *源复制oplog并将这些操作应用于异步过程。 [1]

辅助节点可以根据 ping 时间和其他成员复制状态的变化,根据需要自动更改其* sync from *源。

在版本 3.2 中更改:具有1 vote的 MongoDB 3.2 副本集成员不能与具有0 votes的成员同步。

次要对象避免与delayed membershidden members同步。

如果辅助成员将members[n].buildIndexes设置为true,则它只能与buildIndexestrue的其他成员同步。 buildIndexesfalse的成员可以与任何其他成员进行同步,除非有其他同步限制。 buildIndexes默认为true

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

Multithreaded Replication

MongoDB 使用多个线程批量应用写入操作以提高并发性。 MongoDB 按名称空间(MMAPv1)或文档 ID(WiredTiger)对批处理进行分组,并同时使用不同的线程应用每组操作。 MongoDB 始终以原始写入 Sequences 对给定文档应用写入操作。

在应用批处理时,MongoDB 会阻止所有读取操作。结果,辅助读取查询永远无法返回反映主数据库上不存在的状态的数据。

预取索引以提高复制吞吐量

Note

仅适用于 MMAPv1.

使用MMAPv1存储引擎,MongoDB 可以获取包含受影响数据和索引的内存页面,以帮助提高应用操作日志条目的性能。这个预取阶段可最大程度地减少应用操作日志条目时 MongoDB 保持写锁定的时间。默认情况下,次要对象将预提取所有Indexes

(可选)您可以禁用所有预取或仅预取_id字段上的索引。有关更多信息,请参见secondaryIndexPrefetch设置。