技术小百科 | GaussDB(for Mongo)时间漫游读能力
简介
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-
相关文章