【TIDB】ROCKSDB 的作用与特点

1.ROCKSDB 的作用与特点 
tikv 服务器将数据写入其内部模块RocksDB中落盘,而不是直接将数据写入磁盘。
RocksDB是一个强大的开源单机存储引擎,可以满足对单机数据存取的需求。这里将rocksdb 
简单理解为一个单机的键值映射存储的黑盒子。
RocksDB 针对闪存,SSD存储进行了优化,具有非常低的延迟,并采用了LSM数据结构来存储数据。
具有以下特点:
高性能的键值数据存取引擎。 
完善的持久化机制,同时保证了性能和数据安全性。 
支持范围查询操作。 
专为需要将TB级别的数据存储在本地闪存或RAM的应用服务器设计。 
性能随着CPU数量的增加呈线性提升,并对多核系统非常友好。 

2.RockSDB的写入和文件组织 
RocksDB采用了LSM TREE 的数据结构来存储键值数据。LSM tree 将所有的输入插入,修改,删除 
等操作都是作用在内存中,当达到一定数量后,再批量写入磁盘进行持久化。与传统的B+树数据结构不同,
LSM TREE 在合并过程中采取直接插入新数据的方式,避免了随机写入的问题。
LSM TREE 的结构横跨内存和磁盘,包括 memtable, immutable memtable, SSTABLE 等多个组件。
首先数据会通过WAL技术备份到磁盘上,以防止因内存断电而导致数据丢失,设置参数 sync-log=true, 
可以确保将WAL持久化到磁盘中。而不是仅保存在操作系统缓存中。
完成WAL后,数据会被写入memtable 中,memtable是一个内存数据结构,保存着尚未持久化到的磁盘的数据。
为了保证数据的有序性,Memtable内部的数据可以使用跳跃表或搜索树等数据结构组织。目的是避免 
查询数据时扫描所有的数据。
当memtable 达到一定大小 由 rocksdb 的参数 write_buffer_size 设定。它会转化为 immutable memtable;
immutable memtable 是一个内存中不可修改的数据结构,由于在转存过程中不阻塞写入操作。新的写入
操作将由新的memtable 处理,而不需要等待锁定memtable;
在ROCKSDB中,写入的是插入和删除两种操作。总是读取最后一次操作的内容。
WAL可以理解为一个磁盘(这里的磁盘在ROCKSDB中往往指工业级的PCIe SSD盘)上记流水帐的日志。
由于它是顺序的写,所以速度比较快。写他是因为一开始新数据不是在memtable就是在 immutable memtable中。
这两个地方都是缓存,如果宕机,数据就没有了。所以落盘前必须先写入WAL日志,防止掉电后数据丢失。
当数据从immutable memtable 转存到磁盘后,这些WAL便可以清理了。
WAL的生命周期就是它上面的数据写入磁盘之前的时间。
后台线程会将immutable memtable的内容写入SST 文件落盘。SSTABEL :SORTED String Table;
是LSM TREE 在磁盘上的数据结构。包含了经过排序的键值对集合,同时,关联着这个Memtable 的WAL 也可以被删除。
LSM TREE 使得数据插入和合并非常灵活。

RocksDB 在合并压缩过程中,使用的压缩算法是LZ4;
L0 是刚从内存中落盘的数据,就是immutable memtable直接转存的SST;
除了L0,其他层级都有目标大小,目标大小的设定旨在限制这些层级的数据量,通常采用指数增长的方式。
更新于删除操作都是先打标记,然后通过后台的GC进行进行垃圾回收及合并。

3.ROCKSDB的查询 
在ROCKSDB中,查询操作需要顺序读取 memtable,immutable memtable, L0,L1...; 
因为数据是按照这个顺序写入的。memtable,immutable memtable,L0 的SST 文件是跳跃表 
的数据结构。
L1 以后的SST文件按照键值对的键进行排序。
ROCKSDB的去取效率较低,为了提升读取效率,ROCKSDB使用布隆过滤器。布隆过滤器可以判断相应SST文件 
中是否存在要读取的数据。如果布隆过滤器判断不存在,直接跳过该文件。
布隆过滤器是一个很长的二进制向量和一系列随机映射函数的组合。用于判断一个元素是否属于一个集合。
它有一定的误判性。

ROCKSDB 内部有一个模块为块缓存 BLOCK CACHE; 保存经常访问的数据,如果不在这一部分,则从Memtable获取,
如果在块缓存,优先获取缓存中的数据。

4.ROCKSDB的列族
TIKV是通过集成ROCKSDB引擎来实现最基本的数据持久化。ROCKSDB的列族和TIKV的事务支持有关。
列族是从ROCKSDB3.0版本开始引入的,无论什么类型的键值都存储在同一个系统的memtable;
immutable memtable,SST 文件中。在ROCKSDB中每个键值对都对应着一个唯一的列族,每个列族
就是一系列的Memtable,immutable memtable ,SST;如果没有指定列族,键值对将会默认对应到
名为default的列族,这是ROCKSDB实例的默认列族。
TIKV利用列族将用户数据,锁信息和事务的提交信息分别放在不同的列族中进行管理。
列族提供了一种逻辑上对数据库进行分片的方法:
(1)支持跨列族的原子写操作。可以原地执行类似于 Write({cf1,key1,value1},{cf2,key2,value2}) 
(2)跨列族的一致性视图。
(3)允许对不同的列族进行不同的配置。
(4)可以即时的添加和删除列族。
列族共享WAL文件,但不共享memtable,SST 文件。每个列族都有独立的memtable,immutablememtable,SST文件。

<think>好的,用户想了解RocksDB的介绍、数据库引擎特点以及使用场景。首先,我需要整理RocksDB的基础知识,确保信息准确。根据提供的引用内容,RocksDB是一个基于LSM-Tree的键值存储引擎,由Facebook开发,适用于高性能场景。特点方面,应该包括高性能写入、压缩优化、灵活配置等。 接下来,要区分RocksDB和传统如InnoDB的不同。InnoDB使用B+树,适合事务处理;而RocksDB的LSM-Tree更适合写密集型任务。需要对比两者的底层原理,优缺点,以及应用场景,如引用1中提到的。 使用场景部分,引用2和3提到了在分布式系统(如TiKV)、Redis持久化(如Pika)中的应用。需要具体说明这些应用实例,帮助用户理解适用情况。 用户可能需要了解基础操作,比如安装和接口使用,引用2提到了安装指南,可以简要提及。同时,考虑用户可能的后续问题,比如性能优化或其他引擎的比较,提前准备相关问题。 最后,确保回答结构清晰,分点列出,并正确引用来源。检查LaTeX格式是否符合要求,数学表达式用$...$,独立公式用$$...$$,但当前内容可能较少涉及数学,需注意是否有需要格式化的部分。保持语言简洁,用中文自然表达,避免技术术语过多,让用户易于理解。</think>### RocksDB数据库引擎详解 #### 一、核心介绍 RocksDB是由Facebook开发的$高性能键值存储引擎$,基于Google的LevelDB改进而来,采用$LSM-Tree(Log-Structured Merge-Tree)$数据结构实现[^1]。其核心设计目标是应对现代存储设备的特性(如SSD)和满足高吞吐量场景需求。 #### 二、技术特点 1. **写入性能优化** $$ \text{写入吞吐量} \propto \frac{\text{顺序写入速度}}{\text{数据压缩率}} $$ 通过批量写入(MemTable)和分层合并(Compaction)机制,实现比B+树引擎高10倍以上的写入性能[^1] 2. **压缩机制** 支持Snappy/ZSTD等多级压缩算法,通过`options.compression`参数可配置不同层级的压缩策略 3. **可调式持久化** 提供`WAL(Write-Ahead Logging)`和`Flush`的异步/同步控制,允许在数据安全性性能之间灵活权衡 4. **多线程支持** 内置线程池管理compaction和flush操作,通过`max_background_jobs`参数控制并发度 #### 三、应用场景对比 | 场景特征 | 推荐引擎 | 典型TPS | |-------------------|----------|---------------| | 写密集型(日志) | RocksDB | 50万+/秒 | | OLTP事务处理 | InnoDB | 1万-5万/秒 | | 时序数据存储 | RocksDB | 10万+/秒 | | 二级索引查询 | InnoDB | 5千-2万/秒 | #### 四、典型应用案例 1. **TiDB分布式数据库** TiKV使用RocksDB作为底层存储引擎,支持分布式事务的持久化存储[^3] 2. **Redis持久化方案** Pika数据库通过RocksDB实现Redis协议支持的数据结构持久化[^2] 3. **MySQL可插拔引擎** Facebook维护的MySQL分支支持将RocksDB作为存储引擎 ```cpp // 基础API示例(C++) rocksdb::DB* db; rocksdb::Options options; options.create_if_missing = true; rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db); std::string value; rocksdb::Status s = db->Get(rocksdb::ReadOptions(), "key1", &value); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值