为了维护共享数据集的最新副本,副本集的辅助成员同步或复制其他成员的数据。MongoDB使用两种形式的数据同步:初始同步以使用完整的数据集填充新成员,以及复制以将正在进行的更改应用于整个数据集。
初始同步将所有数据从副本集的一个成员复制到另一成员。
执行初始同步时,MongoDB:
克隆除本地数据库外的所有数据库。为了进行克隆,mongod
扫描将
扫描每个源数据库中的每个集合,并将所有数据插入这些集合的自己的副本中。
在版本3.4中更改:在为每个集合复制文档时,初始同步将构建所有集合索引。在早期版本的MongoDB中,_id
在此阶段仅构建索引。
在版本3.4中进行了更改:初始同步在数据复制期间提取新添加的操作日志记录。确保目标成员在local
数据库中有足够的磁盘空间来在此数据复制阶段持续存储这些操作日志记录。
将所有更改应用于数据集。使用源中的操作日志,mongod
更新其数据集以反映副本集的当前状态。
要执行初始同步,请参阅 重新同步副本集的成员。
辅助成员在初始同步后连续复制数据。次要成员从源同步复制操作日志,并在异步过程中应用这些操作。[1]
辅助节点可以根据ping时间和其他成员复制状态的更改,根据需要自动从源更改其同步。
如果辅助部件已members[n].buildIndexes
设置为true
,它能够从其它成员只有sync其中buildIndexes
是true
。构件其中buildIndexes
就是false
可以从任何其它构件同步,除非其它同步的限制。
buildIndexes
是true
默认。
[1] | 从版本4.2(也从版本4.0.6开始可用)开始,副本集的辅助成员现在
记录的oplog条目所花费的时间比慢操作阈值要长。这些缓慢的oplog消息会在组件下的文本中记录为次要日志。这些慢操作日志条目仅取决于慢操作阈值。它们不依赖于日志级别(在系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。diagnostic log REPL applied
op: <oplog entry> took <num>ms |
MongoDB使用多个线程批量应用写入操作以提高并发性。MongoDB按文档ID(WiredTiger)对批处理进行分组,并同时使用不同的线程应用每组操作。MongoDB始终以原始写入顺序将写入操作应用于给定文档。
在版本4.0中更改。
从MongoDB 4.0开始,如果读取操作发生在正在应用复制批处理的辅助数据库上,则针对次要数据库的读取操作将
被配置为具有或 将要从数据的WiredTiger快照读取的关注级别
。从快照读取可以保证数据的一致视图,并允许读取与正在进行的复制同时发生,而无需锁定。结果,需要这些读取关注级别的辅助读取不再需要等待复制批处理被应用,并且可以在收到复制批处理时进行处理。"local"
"majority"
从MongoDB 4.2开始,管理员可以限制主数据库应用其写入的速率,以将延迟保持在可配置的最大值以下。majority
committed
flowControlTargetLagSeconds
默认情况下,流量控制为enabled
。
注意
为了启用流控制,副本集/分片集群必须具有:featureCompatibilityVersion(FCV) of
4.2
并读取关注。也就是说,如果未启用FCV 或禁用了多数读功能,则启用的流控制无效。majority enabled
4.2
有关更多信息,请参见流控制。