4

一文带你了解Mongo on RocksDB

 3 years ago
source link: https://mongoing.com/archives/78714
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
一文带你了解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收到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相关技术进行进一步探讨或者有使用需求的小伙伴,欢迎邮件交流。此外,招聘通道也同步开启,欢迎投递简历。联系方式:[email protected]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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK