On this page
副本集数据同步
在本页面
为了维护共享数据集的最新副本,副本集sync的辅助成员或从其他成员复制数据。 MongoDB 使用两种形式的数据同步:初始同步以使用完整的数据集填充新成员,以及复制以将正在进行的更改应用于整个数据集。
Initial Sync
初始同步将所有数据从副本集的一个成员复制到另一成员。
Process
执行初始同步时,MongoDB:
在版本 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 members和hidden members同步。
如果辅助成员将members[n].buildIndexes设置为true
,则它只能与buildIndexes为true
的其他成员同步。 buildIndexes是false
的成员可以与任何其他成员进行同步,除非有其他同步限制。 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设置。