MongoDB 定位 oplog 必须全表扫描吗?

  • 日期:08-10
  • 点击:(1456)

新世纪娱乐官方网站
?

MongoDB oplog(类似于MySQL binlog)记录数据库的所有修改操作,主从同步除外; oplog可以发挥很多技巧,比如

所有oplog的完全备份+增量备份,您可以将MongoDB恢复到任何时间点

通过oplog,除了实现与备用节点的同步外,还可以将数据同步到一个单独的集群(甚至是异构数据库)来实现灾难恢复,多实时场景,比如阿里云开源MongoShake可以基于oplog增量同步。

MongoDB 3.6+版本抽象了oplog并提供了Change Stream的接口。实际上,它是一种可以连续订阅数据库的修改。根据这些更改,可以触发一些自定义事件。

.

通常,MongoDB可以使用oplog与生态系统连接,以实现数据同步,迁移,恢复和其他功能。构建这些功能时通常需要,即工具或应用程序需要能够持续提取oplog;这个过程通常是

根据最后拉出的位置构建光标

不断迭代游标以获得新的oplog

所以问题是,因为MongoDB oplog本身没有编入索引,你是否需要在每次启动oplog时执行全表扫描?

以上是MongoDB oplog的一个例子,oplog MongoDB也是一个集合,但与普通集合不一样

Oplog是一个上限集合,但当它超过配置的大小时,它将删除最早插入的数据

oplog集合没有id字段,ts可以用作oplog的唯一标识符; oplog集合本身的数据按顺序组织

Oplog没有任何索引字段,通常你需要找到一个oplog来完成全表扫描

当我们拉出oplog时,我们第一次从头开始拉它,然后每次使用pull时记录最后一个oplog的ts字段。如果应用程序重新启动,则需要基于最后拉出的ts字段。找到拉动的起点并继续遍历。

注意:以下实现适用于WiredTiger存储引擎,需要支持MongoDB 3.0+版本

如果MongoDB在底部使用WiredTiger存储引擎,那么在存储oplog时它实际上是优化的。 MongoDB将使用ts字段作为键,oplog的内容作为值,以及WiredTiger引擎中的键值。 WiredTiger默认配置使用btree存储,因此oplog数据实际上以WT顺序存储在WT字段中,因为顺序存储,存在二进制搜索优化空间。

MongoDB find命令提供了优化oplog定位的选项。

件是ts字段,那么,MongoDB字段将被优化,二进制搜索将快速定位起始点;当备用节点同步拉取oplog时,它实际上会带来此选项,这样每次备用节点重启时,都可以根据上次同步的站点快速找到同步起点,然后保持同步。

因为咨询问题的学生对内部实施感兴趣,所以这里是关键点的简要概述。要深入理解,有必要深入细节。

作者:张有东

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。

96

阿里云云栖社区

96daa9ff-5e2d-4ab8-9769-04a0eb468046

0.6

2019.07.29 15: 43

字数905

MongoDB oplog(类似于MySQL binlog)记录数据库的所有修改操作,主从同步除外; oplog可以发挥很多技巧,比如

所有oplog的完全备份+增量备份,您可以将MongoDB恢复到任何时间点

通过oplog,除了实现与备用节点的同步外,还可以将数据同步到一个单独的集群(甚至是异构数据库)来实现灾难恢复,多实时场景,比如阿里云开源MongoShake可以基于oplog增量同步。

MongoDB 3.6+版本抽象了oplog并提供了Change Stream的接口,这实际上是一个连续订阅数据库的修改。根据这些更改,可以触发一些自定义事件。

.

通常,MongoDB可以使用oplog与生态系统连接,以实现数据同步,迁移,恢复和其他功能。构建这些功能时通常需要,即工具或应用程序需要能够持续提取oplog;这个过程通常是

根据最后拉出的位置构建光标

不断迭代游标以获得新的oplog

所以问题是,因为MongoDB oplog本身没有编入索引,你是否需要在每次启动oplog时执行全表扫描?

以上是MongoDB oplog的一个例子,oplog MongoDB也是一个集合,但与普通集合不一样

Oplog是一个上限集合,但当它超过配置的大小时,它将删除最早插入的数据

oplog集合没有id字段,ts可以用作oplog的唯一标识符; oplog集合本身的数据按顺序组织

Oplog没有任何索引字段,通常你需要找到一个oplog来完成全表扫描

当我们拉出oplog时,我们第一次从头开始拉它,然后每次使用pull时记录最后一个oplog的ts字段。如果应用程序重新启动,则需要基于最后拉出的ts字段。找到拉动的起点并继续遍历。

注意:以下实现适用于WiredTiger存储引擎,需要支持MongoDB 3.0+版本

如果MongoDB在底部使用WiredTiger存储引擎,那么在存储oplog时它实际上是优化的。 MongoDB将使用ts字段作为键,oplog的内容作为值,以及WiredTiger引擎中的键值。 WiredTiger默认配置使用btree存储,因此oplog数据实际上以WT顺序存储在WT字段中,因为顺序存储,存在二进制搜索优化空间。

MongoDB find命令提供了优化oplog定位的选项。

件是ts字段,那么,MongoDB字段将被优化,二进制搜索将快速定位起始点;当备用节点同步拉取oplog时,它实际上会带来此选项,这样每次备用节点重启时,都可以根据上次同步的站点快速找到同步起点,然后保持同步。

因为咨询问题的学生对内部实施感兴趣,所以这里是关键点的简要概述。要深入理解,有必要深入细节。

作者:张有东

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。

MongoDB oplog(类似于MySQL binlog)记录数据库的所有修改操作,主从同步除外; oplog可以发挥很多技巧,比如

所有oplog的完全备份+增量备份,您可以将MongoDB恢复到任何时间点

通过oplog,除了实现与备用节点的同步外,还可以将数据同步到一个单独的集群(甚至是异构数据库)来实现灾难恢复,多实时场景,比如阿里云开源MongoShake可以基于oplog增量同步。

MongoDB 3.6+版本抽象了oplog并提供了Change Stream的接口。实际上,它是一种可以连续订阅数据库的修改。根据这些更改,可以触发一些自定义事件。

.

通常,MongoDB可以使用oplog与生态系统连接,以实现数据同步,迁移,恢复和其他功能。构建这些功能时通常需要,即工具或应用程序需要能够持续提取oplog;这个过程通常是

根据最后拉出的位置构建光标

不断迭代游标以获得新的oplog

所以问题是,因为MongoDB oplog本身没有编入索引,你是否需要在每次启动oplog时执行全表扫描?

以上是MongoDB oplog的一个例子,oplog MongoDB也是一个集合,但与普通集合不一样

Oplog是一个上限集合,但当它超过配置的大小时,它将删除最早插入的数据

oplog集合没有id字段,ts可以用作oplog的唯一标识符; oplog集合本身的数据按顺序组织

Oplog没有任何索引字段,通常你需要找到一个oplog来完成全表扫描

当我们拉出oplog时,我们第一次从头开始拉它,然后每次使用pull时记录最后一个oplog的ts字段。如果应用程序重新启动,则需要基于最后拉出的ts字段。找到拉动的起点并继续遍历。

注意:以下实现适用于WiredTiger存储引擎,需要支持MongoDB 3.0+版本

如果MongoDB在底部使用WiredTiger存储引擎,那么在存储oplog时它实际上是优化的。 MongoDB将使用ts字段作为键,oplog的内容作为值,以及WiredTiger引擎中的键值。 WiredTiger默认配置使用btree存储,因此oplog数据实际上以WT顺序存储在WT字段中,因为顺序存储,存在二进制搜索优化空间。

MongoDB find命令提供了优化oplog定位的选项。

件是ts字段,那么,MongoDB字段将被优化,二进制搜索将快速定位起始点;当备用节点同步拉取oplog时,它实际上会带来此选项,这样每次备用节点重启时,都可以根据上次同步的站点快速找到同步起点,然后保持同步。

因为咨询问题的学生对内部实施感兴趣,所以这里是关键点的简要概述。要深入理解,有必要深入细节。

作者:张有东

阅读原文

本文是云栖社区的原创内容,未经许可,不得转载。