MongoDB爱好者
垂直技术交流平台

一文带你了解Mongo on RocksDB

本文来自华为云NoSQL数据库高级工程师杨涛老师,杨老师将出席5月29日MongoDB中文社区长沙大会分享,现场有金融证券、存储引擎、数据迁移同步等MongoDB一手干货分享,详情可查看:2021年MongoDB中文社区长沙大会 | 相聚岳麓,共话mongo!

简介:RocksDB引擎凭借特性丰富,社区活跃,应用范围广泛,且支持更为良好的硬件存储性能等特点,更适用于云场景。文档数据库Mongo on RocksDB是华为云基于RocksDB存储引擎开发的云数据库,完全兼容MongoDB接口。本文将针对RocksDB引擎特点进行详细介绍。

前言

MongoDB作为一款优秀的NOSQL数据库,支持海量存储,查询能力丰富以及优秀的性能和可靠性,深受国内外用户和企业的认可。
MongoDB在早期设计时,能够支持多种不同类型的存储引擎,包括:MMAPV1,WiredTiger以及RocksDB。2014年,MongoDB公司收购WiredTiger后,从MongoDB 3.2版本开始,官方便将WiredTiger作为默认存储引擎并一直应用至今,基于RocksDB引擎则陷入沉寂。如今,基于RocksDB的新的MongoDB在华为云上已 “复活”。
RocksDB是Facebook公司基于LevelDB设计开发并开源的一款非常出名的存储引擎,该引擎具备极佳的硬件随机读写性能,其设计原理和LevelDB相同,都采用了LSM树存储,但同时也解决了LevelDB自身存在的问题,更适用在大型硬件,多核CPU,高性能SSD等场景中。该引擎被用在多款数据库上,社区活跃度高。

RocksDB 存储引擎的设计原理和特点

RocksDSM树(Log Structured Merge Tree)算法研发的,其前身是LevelDB,存储引擎的设计原理如下:RocksDB存储引擎设计原理

RocksDB收到MongoDB的写入请求时,会直接将数据写入内存即RocksDB定义的区域Memtable,以及WAL(Write Ahead Logging,防止服务重置导致的数据丢失)中,当写入Memtable的数据达到阈值,则转为不可写入状态Immutable,同时申请新的Memtable供上层应用继续写入。RocksDB会通过异步的方式将数据Flush到SST数据文件中,RocksDB对SST文件的编排就采用了LSM树的管理方式,每层SST到达阈值,RocksDB会启动异步线程进行Compaction操作,将文件内的末端节点数据进行合并到下一层SST的文件中。

优势总结:

1、 RocksDB写入时,数据是直接写入内存,为确保写入性能,数据落盘以及Compaction都是异步流程。

2、 RocksDB允许每一层数据上下有定量的冗余,不及时清理的原因就是为了将更多的IO资源提供给数据写操作。

3、 RocksDB的后台Compaction操作会按照数据Key有序存储在SST中,读取数据时,RocksDB会通过Key前缀过滤,布隆过滤器等优化算法来降低SST文件的访问次数。

RocksDB的算法更加适用在写性能要求高的环境中,对IO也存在高吞吐,低延时的要求。在云场景中,虚拟机内存巨大,底层硬盘都已经使用了SSD和NVME的条件下,无疑这为RocksDB引擎良好的运行环境。

Mongo on RocksDB架构

Mongo on RocksDB支持三种架构:单节点,副本集和集群架构。单节点主要用在测试和教学场景中,本文主要介绍副本集和集群架构,如下图所示: 三节点副本集架构
集群架构
以上两种架构和社区原生MongoDB的架构一致,由于MongoDB采用插件式的存储引擎接口,所以可以做到MongoDB 协议的完全兼容,上层应用在实际使用中并不会感受到接口上的差异。此外,基于RocksDB的MongoDB还继承了RocksDB的下列特点:
1、 由于RocksDB采用了优化的LSM算法,平均写性能有良好的表现。
2、 RocksDB支持多点快照的特性, 利用该特性,能实现独特的快照漫游功能,具体可参考下方的内容。
3、 RocksDB使用LSM数据落盘机制以及规定SST文件大小的存储管理,彻底解决了LAS文件膨胀以及B树的存储空洞问题,从而避免浪费磁盘存储空间.

基于RocksDB 快照实现时间漫游

针对如下场景的应用,数据库保存大量静态数据,数据只在维护时间窗内集中更新,每次更新的数据量在上百GB。在数据更新期间,并不希望这部分数据被访问。

整个过程为:

1、 创建名称为Stable的快照,终端用户默认访问T1时间点“稳定的历史数据”。

2、 客户维护工程师开始更新数据,直到时间点T2,数据维护完成,未验证,不对外发布。

3、 到达T3时间点,数据更新完成,新版本数据发布,释放快照,终端用户访问最新版本数据。

通过新开发的Snapshot创建快照命令,该命令调用了RocksDB的API,RocksDB会自动捕获在创建的时间点的DB一致性视图,并保持在内存中。客户在T1和T2分别创建快照,无论数据如何变化,当用户切换到某快照视图时,应用查到的都只有对应时间点版本的数据,从而即简单又快捷的满足了需求。
数据库快照并非RocksDB的独特能力,WiredTiger也有快照,但WiredTiger的快照功能并不像RocksDB那样提供一个显性接口,他被内部设计在多文档事务数据检查点(CheckPoint特性)的特性中使用,它并不能被接口显性调用,且关键制约是,引擎对快照的设计只支持了单快照,并不支持同时打多个点的快照。而对比RocksDB,则支持创建多个不同点的快照,且提供了对外的接口,这就为时间漫游的应用模式提供了独一无二的基础。

更灵活的Compact操作

Compact命令是MongoDB下发给存储引擎的关键命令,其主要作用是让存储引擎对集合数据和索引进行碎片整理。MongoDB对集合数据做删除操作时(排除drop集合和数据库的操作),MongoDB会对删除数据打一个标记,而并非真正对集合数据做删除,等异步线程在后台慢慢删除,这么做好处是大规模的数据删除操作并不会对IO有巨大影响,但问题是会带来磁盘碎片以及数据高水位线问题。Compact操作就是通过重写集合和索引数据,真正的释放磁盘空间给操作系统。
Compact过程中,用户无法对所在数据库进行操作,所以该命令在大多数实际场景下只能在系统维护期间执行。当被Compact的集合数据量越大,该命令的执行时间也就越长,这种场景下会影响客户的业务运行。
RocksDB引擎的特点刚好可以应对这样的场景,由于使用分层的SST存储,每个SST设定了64M的阈值,清理时,只针对需要清理的SST文件进行了锁和重写,Compact的阻塞范围就天然比B树小了很多,由于阻塞范围大幅降低,所以在做Compact操作时就灵活了很多,可以不阻塞数据库的读写操作

总结

在云场景下,由于SSD硬盘的普遍使用,让RocksDB引擎的特点更充分的发挥,适合应用在低成本,大量数据频繁操作的应用场景,例如:网络游戏,物联网,车联网,大数据计算等众多领域。

本文作者:杨涛  华为云NoSQL数据库高级工程师
希望对Mongo on RocksDB相关技术进行进一步探讨或者有使用需求的小伙伴,欢迎邮件交流。此外,招聘通道也同步开启,欢迎投递简历。
联系方式:work.yangtao@huawei.com
5月28日参加完广州·Gdevops全球敏捷运维峰会,北上长沙来参加5月29日MongoDB中文社区2021年第一场线下大会吧!金融证券、存储引擎、数据迁移同步等诸多MongoDB一手实践干货在现场等你来!

长沙大会速递Conference

时间:2021年5月29日(周六)  13:30 – 17:30

地点:长沙市岳麓区中南大学科技园(研发)总部1号栋3楼309多功能厅

名额: 150人

报名链接: https://sourl.cn/EJNURJ

* 9.9元票请添加小芒果(微信ID:mongoingcom)按照说明获取。

* 分享活动还有机会领取MongoDB周边礼品!

您也可以直接阅读相关活动介绍:2021年MongoDB中文社区长沙大会 | 相聚岳麓,共话mongo!

大会奖品Prizes

赞(10)
未经允许不得转载:MongoDB中文社区 » 一文带你了解Mongo on RocksDB

评论 抢沙发

评论前必须登录!