深入 RocksDB 高性能的技术关键
内容提要
本文介绍了RocksDB的基本架构和运作方式,以及性能挑战和解决方法。RocksDB是高性能的KV数据库,适用于海量数据检索和高速存取场景。主要组件包括MemTable、SSTable和预写日志(WAL)日志。数据写入先写入MemTable,再flush到磁盘上的SSTable文件。SSTable文件按层级存放,每层数据被范围分区为多个SSTable文件。RocksDB通过LSM Trees实现追加写入,通过Compaction操作降低放大因子的影响。主要Compaction策略有Size-Tiered Compaction和Leveled Compaction。文章还介绍了WiscKey和PebblesDB等优化LSM树的方法,降低写入放大。
延伸解读
RocksDB 的定位与适用场景
RocksDB 是一款内嵌式 KV 数据库,没有独立进程,需集成到应用中,共享内存资源,无跨进程通信开销,也不支持网络通信和分布式部署。它专为闪存和 RAM 设计,适用于海量数据检索和高速存取场景,如 Facebook Messenger 的消息存储、Flink 的状态存储和 TiKV 的底层引擎。
LSM Tree 的放大问题与权衡
LSM Tree 通过追加写提升写入性能,但会带来空间放大、读放大和写放大。Compaction 是缓解这些放大的关键操作,但不同策略侧重点不同:Size-Tiered Compaction 空间放大严重,Leveled Compaction 写放大较高。RocksDB 默认使用 Leveled Compaction,其写放大通常在 10~30 之间,而 Tiered Compaction 可降至 4~10。
Compaction 策略的演进与优化
RocksDB 最初优化目标是减少写放大,后转向减少空间放大,并引入 Dynamic Leveled Compaction,根据最后一层大小动态调整各层目标,将空间开销限制在 13% 左右。此外,WiscKey 通过键值分离降低 LSM 树大小,PebblesDB 使用 FLSM 结构减少 compaction 次数,从而降低写放大。
写放大的影响与应对
写放大会消耗磁盘带宽,影响读效率,并加速 SSD 寿命消耗。RocksDB 通过 Compaction 策略调整和动态层级优化来平衡写放大与空间放大。业界还采用键值分离(如 WiscKey)和结构优化(如 PebblesDB)来进一步降低写放大,但需权衡读性能和多一次 IO 的开销。
Q&A
RocksDB的主要组件有哪些?
RocksDB的主要组件包括MemTable、SSTable和预写日志(WAL)。
RocksDB是如何处理数据写入的?
数据首先写入MemTable,然后flush到磁盘上的SSTable文件。
什么是Compaction,它的作用是什么?
Compaction是将MemTable写满后flush到磁盘,并合并低层级的SSTable,以降低放大因子的影响。
RocksDB中有哪些Compaction策略?
主要的Compaction策略有Size-Tiered Compaction和Leveled Compaction。
RocksDB如何降低写入放大?
通过使用WiscKey和PebblesDB等优化方法,降低LSM树的大小和Compaction次数。
Leveled Compaction与Size-Tiered Compaction有什么区别?
Leveled Compaction将SSTable拆分为不相交的小文件,而Size-Tiered Compaction则将相似大小的SSTable合并,导致空间放大较大。