副本集的数据复制

  副本集中次要成员同步或者复制来自其他成员的数据,MongoDB使用两种形式的数据同步:

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