RocksDB详解

RocksDB 详解

性能好,支持事务。

秒杀库存扣减中使用了缓存 + Write-Ahead Logging 技术。

事务随机读写。Redo日志是追加文件顺序读写,性能差异有30-40倍。

事务的实现上,MySQL使用的是WAL机制来的。所有的修改都先被写到日志中,然后再被应用到系统重。包括
redo,undo.

RocksDB是Facebook开源的高性能,持久化的KV存储引擎,最初是Facebook数据库工程师团队基于 Google LevelDB开发。
一般很少使用到RocksDB保存数据。

越来越多的新生代数据库都选择RocksDB作为他们的存储引擎。比如:CockroachDB(蟑螂)一个开源,可伸缩,跨地域复制且
兼容事务的ACID特性的分布式数据库,思路来源于Google的全球性分布式数据库Spanner,其理念是将数据分布在多数据中心的
多台服务上。

YugabyteDB,Tidb 作为CockroachDB的竞争产品,底层也是RocksDB.

MyRocks使用RocksDB给MySQL做引擎,目的是取代现有的InnoDB存储引擎。MySQL的请兄弟MariaDB已经接纳了MyRocks作为
它的存储引擎。

实时计算引擎Flink,其State就是一个KV存储,它用的也是RocksDB

MongoDB,Cassandra,Hbase都在开发基于RocksDB的引擎。

原因是 RocksDB性能高,并且支持事务。

随机读写能达到: 18w-19w qps
覆盖操作能达到:9w tps
多读单鞋:10w qps

所以用RocksDB实现 Write-Ahead Logging

RocksDB为什么这么快呢

内存+磁盘IO,读写性能主要取决于他的存储结构。MySql B+树,Oracle B*,RocksDB LSM-tree

LSM-Tree

保证顺序写入的前提下,还能保证很好的查询性能。
WAL,跳表和一个分层的有序表(sorted String table,SSTable).LSM-Tree专门为key-value设计的
存储系统,以牺牲部分读性能为代价提高写入性能。通常适合于写多读上的场景。

LSM-Tree 描述图如下

图片

在SSD搞并行下,扩展LevelDB以显示利用SSD的多通道,优化并发I/O请求的调度和调度策略,将常规SSD
上运行LevelDB的吞吐量再提高4倍。

Log写入是使用的WAL机制,顺序写。

MemTable,跳表(类似红黑树)

c端过来写MemTable和log后就可以返回了。MemTable 32M,写满后会Dump成ImultableMemTable(不可变)
如果write继续,会重新创建一个MemTable.

问题:写入磁盘,部分有序全局无序。

解决方案:Level0,Level1,会进行合并。

SSTable分层,越热的数据越靠上。对热数据比较友好。