参考官方文档:
为了维护共享数据集的最新副本,副本的辅助成员设置同步或复制来自其他成员的数据。 MongoDB使用两种形式的数据同步:初始同步以使用完整数据集填充新成员,和复制将持续更改应用于整个数据集。
初始化同步
初始同步将所有数据从副本集的一个成员复制到另一个成员。
过程
当你执行一个初始化同步,MongoDB:
1.克隆除本地数据库之外的所有数据库。 要进行克隆,mongod会扫描每个源数据库中的每个集合,并将所有数据插入到这些集合的所属的副本中。
版本3.4中的变更:初始同步会在为每个集合复制文档时构建所有集合索引。 在早期版本的MongoDB中,在此阶段仅构建_id索引。
版本3.4中的变更:初始同步在数据复制期间提取新添加的oplog记录。 确保目标成员在本地数据库中有足够的磁盘空间,以便在此数据复制阶段的持续时间内临时存储这些oplog记录。
容错
要从瞬态网络或操作故障中恢复,初始同步具有内置重试逻辑。
版本3.4中更改:MongoDB 3.4改进了初始同步重试逻辑,使其更能适应网络上的间歇性故障。
复制
辅助成员在初始同步后不断复制数据。 辅助成员从其源中同步复制oplog,并在异步的应用这些操作。
辅助节点可以基于ping时间和其他成员复制状态的变化,来自动更改其从源的同步。
在版本3.2中更改:具有1 vote 的MongoDB 3.2副本集成员无法从具有0 vote 的成员同步。
辅助节点避免与延迟成员和隐藏成员同步。
如果辅助成员将members [n] .buildIndexes设置为true,则它只能从buildIndexes为true的其他成员同步。 buildIndexes为false的成员可以从任何其他成员同步,禁止其他同步限制。 默认情况下,buildIndexes为true。
多线程复制
MongoDB使用多线程批量应用写操作以提高并发性。 MongoDB按名称空间(MMAPv1)或文档ID(WiredTiger)对批处理进行分组,并使用不同的线程同时应用每组操作。 MongoDB始终以原始写入顺序将写入操作应用于给定文档。
在应用批处理时,MongoDB会阻止所有读取操作。 因此,辅助读取查询永远不会返回反映主数据库中从未存在的状态的数据。
预取索引以提高复制吞吐量
注意:
只应用于MMAPv1
使用MMAPv1存储引擎,MongoDB可以获取包含受影响数据和索引的内存页,以帮助提高应用oplog条目的性能。 此预取阶段最大限度地减少了MongoDB在应用oplog条目时保持写锁定的时间。 默认情况下,辅助节点将预取所有索引。
可选地,您可以禁用所有预取或仅预取_id字段上的索引。 有关更多信息,请参阅secondaryIndexPrefetch设置。