副本集中次要成员同步或者复制来自其他成员的数据,MongoDB使用两种形式的数据同步:
- 新成员的初始同步
- 复制除local库外的所有数据库,对其库进行扫描和复制;
- 在3.4版本中会在复制集合文档的时候构建所有集合索引,在旧版本中复制过程只创建_id索引,其他的索引会在复制完成后重建;
- 拉取新添加的oplog记录,临时保存这些oplog记录;
- 根据原数据库的oplog记录,mongod会变更自身的状态;
- 同步完成后,成员状态从StartUp2转换到Secondary。
- 同步过程中若同步源上的集合名发生更改,那么目标成员的初始化同步将失败并且重新启动以避免数据损坏。
- 已有成员之间的持续复制
- Secondary成员在初始化同步后不断复制数据,即将oplog从其源同步中复制,并在异步过程中应用这些操作;
- Secondary根据ping时间和其他成员复制状态的变化自动选择同步源;
- Secondary不会从隐藏节点和延迟节点同步;
- 从3.2版本起,具有vote权限的成员不能从不具备vote权限的成员同步;
- buildIndexes为true的成员只能从buildIndexes为true的其他成员进行同步,buildIndexes为false的成员可以从任何其他成员同步,buildIndexes默认为false;
- 多线程复制:
-
- 多线程批量写入,以提高并发性;
- MMAPv1引擎以namespace(MMAPv1引擎)为groups,WiredTiger引擎以文档ID(WiredTiger引擎)为groups,将写入操作“groups batches“,同时使用不同的线程来应用每组操作;
- 写入操作以原始写入顺序应用于给定文档中;
- 在应用批量处理时,MongoDB将阻止所有读取操作。