RocksDB

RocksDB是Facebook基于LevelDB开发的LSM-tree存储引擎,常用于键值存储。它将数据先写入WAL再存入内存,达到高写吞吐。内存达到阈值后,数据转存为SST文件,多层结构降低磁盘读取。TiKV使用RocksDB作为核心存储,有两个实例分别存储Raft日志和用户数据,有不同的ColumnFamily配置。RocksDB内存占用受限于BlockCache和MemTable,空间占用受多版本和空间放大系数影响。后台线程负责数据持久化和合并,过多的L0文件会导致WriteStall。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

RocksDB 简介

TiKV 架构

RocksDB 的内存占用

RocksDB 的空间占用

RocksDB 后台线程与 Compact

WriteStall

RocksDB 简介

RocksDB 是由 Facebook 基于 LevelDB 开发的一款提供键值存储与读写功能的 LSM-tree 架构引擎。用户写入的键值对会先写入磁盘上的 WAL (Write Ahead Log),然后再写入内存中的跳表(SkipList,这部分结构又被称作 MemTable)。LSM-tree 引擎由于将用户的随机修改(插入)转化为了对 WAL 文件的顺序写,因此具有比 B 树类存储引擎更高的写吞吐。

内存中的数据达到一定阈值后,会刷到磁盘上生成 SST 文件 (Sorted String Table),SST 又分为多层(默认至多 6 层),每一层的数据达到一定阈值后会挑选一部分 SST 合并到下一层,每一层的数据是上一层的 10 倍(因此 90% 的数据存储在最后一层)。

RocksDB 允许用户创建多个 ColumnFamily ,这些 ColumnFamily 各自拥有独立的内存跳表以及 SST 文件,但是共享同一个 WAL 文件,这样的好处是可以根据应用特点为不同的 ColumnFamily 选择不同的配置,但是又没有增加对 WAL 的写次数。

TiKV 架构

TiKV 的系统架构如下图所示:

 

RocksDB 作为 TiKV 的核心存储引擎,用于存储 Raft 日志以及用户数据。每个 TiKV 实例中有两个 RocksDB 实例,一个用于存储 Raft 日志(通常被称为 raftdb),另一个用于存储用户数据以及 MVCC 信息(通常被称为 kvdb)。kvdb 中有四个 C

RocksDB 是一个高效的嵌入式键值存储引擎,广泛用于需要高性能读写操作的场景。它最初由 Facebook 开发,基于 Google 的 LevelDB 项目,并进行了大量优化以支持现代硬件环境,特别是 SSD 存储介质。 ### 功能特性 RocksDB 提供了丰富的功能,包括但不限于: - **多线程压缩**:通过并行处理 SST 文件的压缩任务来提高吞吐量。 - **内存管理**:提供了多种机制来控制内存使用,比如 block cache 和 memtable 的大小调整。 - **快照与事务**:支持快照隔离级别的一致性视图和 ACID 事务[^3]。 - **列族(Column Families)**:允许将数据逻辑上划分为不同的列族,每个列族可以独立配置选项,这为不同类型的数据显示了灵活性[^3]。 ### 使用教程 要开始使用 RocksDB,首先需要安装库文件。对于 C++ 开发者来说,可以通过源码编译安装或者利用包管理器进行安装。Python 用户则可以借助 `python-rocksdb` 这样的第三方模块。 以下是一个简单的 RocksDB 数据库创建和基本操作的例子: ```cpp #include <rocksdb/db.h> #include <rocksdb/options.h> int main() { rocksdb::DB* db; rocksdb::Options options; // Optimize RocksDB. This is important for performance. options.IncreaseParallelism(); options.OptimizeLevelStyleCompaction(); // create the DB if it's not already present options.create_if_missing = true; // open DB rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db); assert(status.ok()); // put key-value status = db->Put(rocksdb::WriteOptions(), "key1", "value"); assert(status.ok()); std::string value; // get value status = db->Get(rocksdb::ReadOptions(), "key1", &value); assert(status.ok()); assert(value == "value"); // delete database object before exit delete db; return 0; } ``` ### 性能优化 为了获得最佳性能,对 RocksDB 的参数进行调优是必要的。例如,调整内存相关的设置如 `write_buffer_size` 和 `max_write_buffer_number` 可以影响写入性能;而 `block_cache_size` 则会影响读取速度。此外,还可以根据工作负载的特点选择合适的压缩算法和策略。 在 Flink 中使用 RocksDB 作为状态后端时,可以通过修改配置文件中的参数来进行调优,比如增加 `state.backend.rocksdb.memory.managed` 设置为 `true` 来启用托管内存模式,从而让 Flink 更好地管理和限制 RocksDB 的内存占用[^2]。 ### 应用场景 RocksDB 被设计成可以在各种环境中高效运行,尤其是在那些要求低延迟、高吞吐量以及大规模数据集的情况下。典型的应用场景包括: - **分布式数据库系统**:如 TiKV 和其他分布式数据库系统采用 RocksDB 作为底层存储引擎,因为其出色的性能表现和对 LSM-Tree 结构的支持。 - **实时数据分析平台**:Apache Flink 等流处理框架中,RocksDB 常被用作状态后端,因为它能够很好地处理连续不断的数据流带来的状态更新需求[^1]。 - **缓存服务**:由于 RocksDB 支持快速查找且具有良好的压缩特性,因此也非常适合用来构建本地缓存解决方案。 以上只是关于 RocksDB 的简要介绍及其一些核心方面的概述。实际应用中可能还需要深入理解具体的业务需求和技术细节才能充分发挥 RocksDB 的潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野狼e族

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值