一边搭建一边理解MongoDB副本集(副本集中数据同步)
作者:链上研发-175405
时间:2017-01-15
为了维持共享数据集的最新状态,副本集中的从节点成员从其他成员同步或复制。MongoDB通过两种方式同步数据:初始同步来为新成员填充完整的数据集,复制来应用正在进行的修改在
整个数据集上。
初始同步
初始同步从副本集中一个成员中拷贝了所有数据到另一个成员中。
过程
当你进行一次初始同步时,MongoDB:
克隆除了local数据库的所有数据库。为了克隆,mongod扫描了所有源数据库中所有集合并且把所有数据插入到自己的拷贝集合中。
3.4版本的改变:当每一个集合中的文档被拷贝时,初始化同步会为集合建立完整的索引。在早期版本的MongoDB,只有_id索引会在这个阶段被创建。
3.4版本的改变:初始同步在数据拷贝时拉取最近的oplog记录。需要保证目标成员在local数据库拥有足够的磁盘空间来暂存由于数据拷贝阶段的oplog记录。
在数据集上应用所有的修改。使用从源成员拷贝来的oplog, mongod更新自己的数据集来展示副本集的当前状态。
当初始同步完成后,副本集成员从STARTUP2状态转变为SECONDARY。
容错
为了从短暂的网络或操作故障中恢复,初始同步内置有重试逻辑。
3.4版本的改变:MongoDB 3.4 改进了重试逻辑更能适应网络的间歇性故障。
复制
从节点成员在初始同步之后持续的复制数据。从节点成员从他们同步的源节点复制oplog并且在异步进程中应用这些操作。
从节点成员可能基于ping time和其他成员的状态来自动改变他们的同步源。
3.2版本的改变:MongoDB 3.2副本集有1个投票权的成员不能从0投票权的成员同步。
从节点成员不会从延迟成员和隐藏成员同步。
如果有一个从节点成员的members[n].buildIndexes 被设置为true, 这个从节点成员只会向buildIndexes为true的其他成员同步。buildIndexes为false的成员可以从任何成员同步数据,忽略了其他的同步限制。buildIndexes默认是true。
多线程复制
MongoDB使用使用多线程来增加批量应用写操作的并发性。MongoDB使用namespace(MMAPv1)或文档id(WiredTiger)分组同时使用不同的线程对每一个分组应用操作。MongoDB总是保证按原来的写顺序来应用写操作。
当批量应用操作时,MongoDB阻塞了所有的读操作。因此,从节点的读请求返回的数据不能反映主节点不存在的状态。
预读索引来提升吞吐量
NOTE:
只适用于MMAPv1
使用MMAPv1存储引擎, MongoDB获取内存页来存储受影响的数据和索引来保住提高应用oplog的性能。预读阶段最小化了MongoDB在更新oplog时持有所的时间。从节点成员会默认预读所有索引。
你也可以选择关闭所有的预读或者只预读_id索引。
作者:链上研发-175405
时间:2017-01-15