简介
GaussDB(for Mongo)是华为云自主研发兼容MongoDB4.0接口的文档数据库。
GaussDB(for Mongo)近期发布了一个新特性:时间漫游读能力。对于MongoDB的Find操作,用户可以指定 一个readAt参数,指定读取数据库历史上的某个时间点的数据。这个特性的用途有:
对历史数据做报表,省去了用户自己按时间分库分表的麻烦
在不影响业务读写的情况下,对数据做Point in Time的备份
该特性使用户可以在一个数据库实例,甚至同一个表空间上,管理多个历史时态的数据。时态数据库的概念,在SQL2011中被正式定义,主流数据库,如Oracle/MSSQL都支持该功能,MongoDB官方社区版/企业版目前还不支持这一能力。
用户接口
创建快照命令
mongos> db.runCommand({snapshot:1, op:"create", name:"s1"})
该命令创建了一个名为s1的快照。
通过快照查询Point In Time 的数据
mongos> db.runCommand({find:"foo",readAt:"s1"})
在find命令中,指定readAt : s1,表示从s1这个快照中读取数据。如下所示,在s1创建之后,我们插入的 {a:3,c:3}这条记录对用户是不可见的。
mongos> db.foo.insert({a:1, c:1})mongos> db.foo.insert({a:2, c:2})mongos> db.runCommand({snapshot:1, op:"create", name:"s1"})mongos> db.foo.insert({a:3, c:3})mongos> db.runCommand({find:"foo",readAt:"s1"}){"cursor" :{"firstBatch":[{"_id" : ObjectId("5dd75662b9c50d4bdca52721"), "a" : 1, "c" : 1},{"_id" : ObjectId("5dd75687b9c50d4bdca52723"), "a" : 2, "c" : 2}]}}
与MongoDB4.0/4.2提供的readAtClusterTime 能力不同的是,GaussDB(for Mongo)的时间漫游读提供的快照是持久化的,可以长期保留在系统中。用户可以通过命令删除快照,删除后快照会被自动清理。
删除快照命令
db.runCommand({snapshot:1, op:"delete", name:"s1"})
实现思路
kMajorityCommitted,从Raft Common Point快照读
kLastApplied,从系统最新快照读 allCommitTs,从没有oplog空洞的快照读
Map<String,SequenceNumber> // snapshotName <-> SequenceNumber(aka snapshot)


案例介绍



总结
-END-

文章转载自HW云数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




