RocksDB 概述

简介

RocksDB 在Facebook开始作为各种存储介质上的服务器工作负载的存储引擎,最初专注于快速存储(尤其是闪存)。它是一个 C++ 库,用于存储键和值,键和值是任意大小的字节流。它同时支持点查找和范围扫描,并提供不同类型的 ACID 保证。

在可定制性和自适应性之间取得平衡。RocksDB 具有高度灵活的配置设置,可以调整以在各种生产环境中运行,包括 SSD、硬盘、ramfs 或远程存储。它支持各种压缩算法和用于生产支持和调试的好工具。另一方面,也努力限制旋钮的数量,提供足够好的开箱即用性能,并在适用的地方使用一些自适应算法。

RocksDB 借鉴了开源leveldb项目的重要代码以及Apache HBase的想法。初始代码是从开源 leveldb 1.5 派生出来的。它还建立在 RocksDB 之前在 Facebook 开发的代码和想法之上。

表现:

RocksDB 的主要设计点是它应该对快速存储和服务器工作负载具有高性能。它应该支持高效的点查找和范围扫描。它应该是可配置的,以支持高随机读取工作负载、高更新工作负载或两者的组合。它的架构应该支持轻松调整不同工作负载和硬件的权衡。

支持:

RocksDB 的设计方式应使其具有对有助于在生产环境中进行部署和调试的工具和实用程序的内置支持。如果存储引擎还不能自动适配应用和硬件,我们会提供一些参数让用户调优性能。

兼容性:

这个软件的新版本应该是向后兼容的,这样现有的应用程序在升级到新版本的 RocksDB 时不需要改变。除非使用新提供的功能,否则现有应用程序也应该能够恢复到最近的旧版本

高层架构

RocksDB 是一个键值存储接口的存储引擎库,其中键和值是任意字节流。RocksDB 按排序顺序组织所有数据,常用操作有Get(key), NewIterator(), Put(key, val), Delete(key), 和SingleDelete(key)。

RocksDB 的三个基本结构是memtable、sstfile和logfile。memtable是内存中的数据结构——新的写入被插入到 memtable 中,并可选择写入日志文件(又名。预写日志(WAL))。日志文件是存储上按顺序写入的文件。当 memtable 填满时,它会被刷新到存储上的sstfile,并且可以安全地删除相应的日志文件。sstfile 中的数据经过排序以方便查找键。
在这里插入图片描述

特点

列族

RocksDB 支持将数据库实例划分为多个列族。所有数据库都创建了一个名为“default”的列族,用于未指定列族的操作。
RocksDB 保证用户在列族之间有一致的视图,包括在启用 WAL 或启用原子刷新时的崩溃恢复之后。它还通过WriteBatchAPI 支持原子跨列系列操作。

更新

APIPut将单个键值插入到数据库中。如果该键已经存在于数据库中,则先前的值将被覆盖。APIWrite允许在数据库中自动插入、更新或删除多个键值。数据库保证将单个调用中的所有键值Write插入到数据库中,或者它们都不会插入到数据库中。如果这些键中的任何一个已经存在于数据库中,以前的值将被覆盖。DeleteRangeAPI 可用于删除范围内的所有键。

获取、迭代器和快照

键和值被视为纯字节流。键或值的大小没有限制。APIGet允许应用程序从数据库中获取单个键值。APIMultiGet允许应用程序从数据库中检索一组密钥。通过调用返回的所有键值MultiGet都是彼此一致的。

数据库中的所有数据在逻辑上按排序顺序排列。应用程序可以指定一个键比较方法,该方法指定键的总排序。APIIterator允许应用程序对数据库进行范围扫描。可以Iterator搜索指定的键,然后应用程序可以从该点开始一次扫描一个键。APIIterator还可用于对数据库中的键进行反向迭代。Iterator创建时会创建数据库的一致时间点视图。因此,通过 返回的所有键都Iterator来自数据库的一致视图。

APISnapshot允许应用程序创建数据库的时间点视图。和GetAPIIterator可用于从指定快照读取数据。从某种意义上说,aSnapshot和 anIterator都提供了数据库的时间点视图,但它们的实现不同。短期/前台扫描最好通过迭代器完成,而长时间运行/后台扫描最好通过快照完成。AnIterator保留对与数据库的该时间点视图相对应的所有基础文件的引用计数 - 这些文件在发布之前不会被删除Iterator。Snapshot另一方面,A不会阻止文件删除;相反,压实过程理解的存在Snapshots并承诺永远不会删除任何现有Snapshot.

Snapshots不会在数据库重启后持久化:重新加载 RocksDB 库(通过服务器重启)会释放所有预先存在的Snapshots.RocksDB 支持多操作事务

持久化

RocksDB 有一个预写日志(WAL)。所有写操作(Put,Delete和Merge)都存储在称为 memtable 的内存缓冲区中,并可选择插入到 WAL 中。重新启动时,它会重新处理日志中记录的所有事务。

可以将 WAL 配置为存储在与存储 SST 文件的目录不同的目录中。对于您可能希望将所有数据文件存储在非持久性快速存储中的情况,这是必需的。同时,您可以通过将所有事务日志放在较慢但持久的存储上来确保不会丢失数据。

每个Put都有一个标志,通过 设置WriteOptions,指定是否Put应将其插入到事务日志中。还WriteOptions可以指定在声明提交之前是否fsync向事务日志发出Put调用。

在内部,RocksDB 使用批处理提交机制将事务批处理到日志中,以便它可以使用单个fsync调用潜在地提交多个事务。

数据校验和

RocksDB 使用校验和来检测存储中的损坏。这些校验和针对每个 SST 文件块(通常大小介于 到 之间4K)128K。块一旦写入存储,就永远不会被修改。RocksDB 还维护一个Full File Checksum和可选的per key-value checksum。

多线程压缩

在存在持续写入的情况下,需要压缩以提高空间效率、读取(查询)效率和及时删除数据。Compaction 删除已删除或覆盖的键值绑定,并重新组织数据以提高查询效率。如果配置的话,压缩可能发生在多个线程中。

整个数据库存储在一组sstfiles中。当memtable已满时,其内容将写入 LSM 树的 Level-0 (L0) 中的文件。RocksDB 在将 memtable 刷新到 L0 中的文件时会删除 memtable 中重复和覆盖的键。在compaction中,一些文件会被周期性地读入并合并成更大的文件,通常会进入下一个 LSM 级别(比如 L1,直到 Lmax)。

LSM 数据库的整体写入吞吐量直接取决于压缩发生的速度,尤其是当数据存储在 SSD 或 RAM 等快速存储中时。RocksDB 可以配置为从多个线程发出并发压缩请求。据观察,与单线程压缩相比,当数据库位于 SSD 上时,多线程压缩的持续写入率可能会增加多达 10 倍。

压缩样式

Level Style Compaction 和 Universal Style Compaction 都将数据存储在数据库中固定数量的逻辑层级中。较新的数据存储在 Level-0 (L0) 中,较旧的数据存储在更高编号的级别中,直到 Lmax。L0 中的文件可能具有重叠键,但其他级别中的文件通常在每个级别形成单个排序运行。

Level Style Compaction(默认)通常通过最小化每个压缩步骤中涉及的文件来优化磁盘占用空间与逻辑数据库大小(空间放大):将 Ln 中的一个文件与其在 Ln+1 中的所有重叠文件合并,并用新文件替换它们ln+1。

Universal Style Compaction 通常通过一次合并潜在的许多文件和级别来优化写入磁盘的总字节数与逻辑数据库大小(写放大),需要更多的临时空间。与 Level Style Compaction 相比,Universal 通常会导致较低的写入放大率,但会导致更高的空间和读取放大率。

FIFO 样式压缩在过时时丢弃最旧的文件,可用于类似缓存的数据。在 FIFO 压缩中,所有文件都处于 0 级。当数据的总大小超过配置的大小时(CompactionOptionsFIFO::max_table_files_size),我们删除最旧的表文件。

我们还使开发人员能够开发和试验自定义压缩策略。出于这个原因,RocksDB 有适当的钩子来关闭内置的压缩​​算法,并有其他 API 允许应用程序运行自己的压缩算法。 Options.disable_auto_compaction,如果设置,则禁用本机压缩算法。APIGetLiveFilesMetaData允许外部组件查看数据库中的每个数据文件并决定合并和压缩哪些数据文件。调用CompactFiles压缩你想要的文件。APIDeleteFile允许应用程序删除被视为过时的数据文件。

只读模式

数据库可以以只读模式打开,在这种模式下,数据库保证应用程序不能修改数据库中的任何内容。这导致更高的读取性能,因为经常遍历的代码路径完全避免了锁定。

数据压缩

RocksDB 支持 lz4、zstd、snappy、zlib 和 lz4_hc 压缩,以及 Windows 下的 xpress。RocksDB 可以配置为在数据所在的最底层支持不同的数据压缩算法90%。典型的安装可能会为最底层配置 ZSTD(或 Zlib,如果不可用),为其他级别配置 LZ4(或 Snappy,如果不可用)

完整备份和复制

RocksDB 提供了备份 API BackupEngine,. 您可以在这里阅读更多相关信息:如何备份 RocksDB

RocksDB 本身不是复制的,但它提供了一些辅助功能,使用户能够在 RocksDB 之上实现他们的复制系统,请参阅Replication Helpers。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值