为了维护共享数据集的最新副本,副本集的备份服务器可以从其他成员那里同步或者复制最新的数据。MongDB使用两种形式进行数据同步:
使用initial sync来为新成员填充数据;然后会执行正在进行的数据同步。
初始化同步(initial sync)
当你执行了一个初始化同步,MongoDB:
- 克隆除本地数据库以外的所有数据库,Mongod会扫描所有源数据库中的每个集合并且将这些集合的数据插入到这些集合的副本中。
3.4的改变:初始化同步会为每个集合的所有索引也一同复制到副本中,在早期的版本中,只有_id的索引会被复制到副本中。
3.4的改变:初始化同步会将所有最新的oplog记录在复制的过程中也一同拉取过来。请确保目标成员所在的本地数据库中有足够的磁盘空间来存放临时的oplog。 - 要将所有改变应用到数据集。mongod会用源oplog来反应出当前该副本集的状态。
当初始化同步完成后,成员的状态会从STARTUP2
转变为SECONDARY
容错
为了从短暂性网络或操作错误中恢复,初始化同步内置重试逻辑。
3.4的改变:3.4以后MongoDB改善了在断断续续的网络错误中恢复的重试逻辑。
复制
备份服务器成员会在初始化同步以后不断的从主服务器的oplog中复制和应用数据,该步骤会在异步线程中执行。
如果有需要的话,备份服务器会基于心跳链接的时间和复制的状态下自动同步源代码。
3.2的改变:3.2版本以后 1 vote
状态下的成员不能从 0 votes
.状态下的成员同步数据。
备份服务器避免从 delayed members and hidden members.同步数据
除非有其他限制,否则 members[n].buildIndexes
都为true的两个成员之间才能进行数据同步,但 buildIndexes
为false的成员可以从其他任何成员里面同步数据。默认情况下, buildIndexes
为true。
多线程复制
MongDB支持利用多线程批量写入以提高并发效率。
MongDB通过 (MMAPv1)的命名空间或者 (WiredTiger)类型的id进行批量处理,同时支持每一组操作运行在不同线程下。MongDB总是按照原始文档的写入顺序写入。
当应用了一个批量处理的时候,MongDB禁止所有读操作。备份服务器的读查询永远不可能返回数据,反应了一个从来未在主服务器下存在过的状态。
当备份服务器正在进行批处理的时候,MongDB阻塞所有读操作。因此,备份服务器无法返回数据,因为该数据的状态从未在主服务器中存在过。
Pre-Fetching索引来提高复制的吞吐量
仅支持MMAPv1存储引擎