RocksDB系列一:基本概念

0 引言

RocksDB 是 Facebook 基于 Google 的 LevelDB 代码库于 2012 年创建的高性能持久化键值存储引擎。它针对 SSD 的特定特性进行了优化,目标是大规模(分布式)应用,并被设计为嵌入在更高层次应用中的库组件。RocksDB应用范围很广,比如:

  • 流处理:RocksDB 用于在 Apache Flink、Kafka Stream、Samza 和 Facebook 的 Stylus 中存储暂存数据。
  • 日志/队列服务:RocksDB 被 Facebook 的 LogDevice(使用 SSD 和 HDD)、Uber 的 Cherami 和 Iron.io 使用。
  • 索引服务:RocksDB 被 Facebook 的 Dragon 和 Rockset 使用。
  • SSD 上的缓存:像 Netflix 的 EVCache 、360 的 Pika 和 Redis 这样的内存缓存服务,使用 RocksDB 将从 DRAM 的数据存储在 SSD 上
  • 数据库:比如MySQL、TiDB

本文首先介绍一些基本概念。

一、重点概念

LSM tree

LSM-Tree(Log-Structured-Merge-Tree)个人认为更是一种设计思想,而非一个具体的数据结构,如下图所示:

在这里插入图片描述

核心点:

  1. 不支持磁盘原地修改,避免磁道随机访问, 提高写入能力
  2. 写入不可变文件,随着时间再做merge处理

工作原理如下:

  1. 数据写入

    • 数据首先写入到内存中的 MemTable(内存表),通常使用跳表、平衡树或哈希表等数据结构实现。
    • MemTable 支持快速的写入操作,以处理高吞吐量的写入请求。
  2. 数据刷新

    • 当 MemTable 达到一定大小或条件时,它会被写入到磁盘,成为一个不可变的 SSTable(Sorted String Table)文件。
    • MemTable 刷新后会被清空,并准备接收新的写入操作。
  3. 合并compation

    • 磁盘上会有多个层次的 SSTable 文件。为了保持查询性能和存储效率,LSM-Tree 定期进行合并操作。
    • 合并操作将多个 SSTable 文件的数据合并到一个新的、更大的 SSTable 文件中,通常分为多个层次,每一层的大小递增。
  4. 读取操作

    • 读取数据时,首先在 MemTable 中查找,如果未找到,再在最近的 SSTable 文件中查找。
    • 如果需要,还会查找更早的 SSTable 文件。通常会使用布隆过滤器(Bloom Filter)来快速判断某个键是否在特定的 SSTable 文件中。
  5. 删除和更新

    • 删除操作通过插入删除标记(如删除标记的条目)来标记数据已被删除。
    • 更新操作通过插入新版本的数据来覆盖旧的数据。最终,这些删除和更新会在合并过程中得到处理。

memtable

MemTable 是一种在内存中保存数据的数据结构,用于提高写入性能和减少对磁盘的频繁访问。MemTable 在数据达到一定量时,会将其内容 flush(刷新)到磁盘上的 SST (Sorted String Table) 文件中。MemTable 支持读写操作,并且可以使用不同的数据结构实现,具体包括:

  • 跳表(Skip List):支持并发操作,适合高并发场景。它通过多层索引实现高效的插入、删除和查找操作。
  • 平衡树(如 AVL 树或红黑树):支持高效的查找、插入和删除操作,但并不一定适合高并发场景。
  • 数组(Vector):提供简单的顺序访问,但对于查找和插入的效率可能较低。
  • 哈希表(Hash Table):提供高效的查找操作,但可能不支持范围查询。
    选择不同的数据结构作为 MemTable 实现,取决于系统的性能需求和使用场景。

Flush

Flush 时机:

以RocksDB为例:

  • 内存表大小超过阈值

    • 当内存表的大小超过了 write_buffer_size 时,会触发 flush 操作。
  • 全部列族的内存表总大小超过阈值

    • 当所有列族的内存表总大小超过了 db_write_buffer_size,或者 write_buffer_manager 发出了 flush 指令时,会触发 flush 操作。在这种情况下,会选择最大的memtable进行 flush 操作。
  • WAL 文件总大小超过阈值

    • 当全部的 Write-Ahead Logging(WAL)文件的大小超过了 max_total_wal_size 时,会触发 flush 操作。在这种场景下,内存中数据最老的memtable会被选择执行 flush 操作,并且对应的 WAL 文件会被回收。

Write-Ahead Log (WAL)

概述:
Write-Ahead Log(WAL)是一种类似于数据库日志的机制,用于故障和异常恢复。在 RocksDB 中,每次数据写入都会写入到两个位置:

  1. 内存表(MemTable):

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值