0
0
0
0
专栏/.../

梳理下TiDB的TiKV持久化层RocksDB的结构和写入流程

 kljyrx  发表于  2025-02-05

最近在学习《TiDB 数据库核心原理与架构(101) :TiKV-持久化》这篇课程的时候https://learn.pingcap.cn/learner/player/1110001;id=1110001;classroomId=1560001;rcoId=1710006;courseDetailId=960001;learnerAttemptId=1737590879178学习到了作为持久化层RocksDB的结构和写入流程,在这里重新梳理下:

RocksDB 的写入流程基于 LSM-Tree(Log-Structured Merge Tree)结构,核心目标是高效地管理内存和磁盘之间的数据流动,同时保证持久化和一致性。

一、流程

1. 写入 WAL(Write-Ahead Log)

  • 数据首先被写入 WAL 文件(磁盘上的顺序日志文件)。

  • 如果 sync_log=true

    • 每次写入会强制同步到磁盘,避免依赖操作系统缓存,防止因操作系统崩溃而丢失数据。
  • WAL 的作用:

    • 提供数据的 崩溃恢复能力
    • 在系统崩溃后,能够通过 WAL 重建数据。

2. 写入 MemTable(内存表)

  • 数据被写入 MemTable(内存中的有序结构)。

  • 如果写入的 MemTable 数据量达到 write_buffer_size 限制:

    • 当前 MemTable 被标记为 Immutable MemTable
    • 开辟一个新的 MemTable 接收后续写入。

3. Immutable MemTable 刷盘

  • Immutable MemTable 不可修改,只能被异步刷入磁盘生成 SST 文件

    • 生成的 SST 文件存储在 Level 0
  • 通过这种机制:

    • 避免数据阻塞在 MemTable 中,保证写入性能。

4. Write Stall(写入限制)

  • 如果 Immutable MemTable 累积到超过阈值(默认 5 个),会触发 Write Stall

    • RocksDB 限制写入速度,客户端可能感受到写入性能下降。
    • 相关信息可在日志中看到 write stall 的提示。

二、数据存储结构与压缩过程

1. Level 0

  • 刷入的 Immutable MemTable 会生成无序的 SST 文件,直接存储在 Level 0。

  • 默认 Level 0 最多存放 4 个 SST 文件:

    • 超过阈值时,会触发 Compaction(压缩)。

2. Compaction(压缩机制)

  • Level 0 → Level 1 压缩:

    • 将多个无序的 SST 文件合并为一个有序的 SST 文件,并写入 Level 1。
    • SST 文件内部的键值是按顺序排列的,可以通过 二分查找 快速定位。
  • 每一层的数据按范围划分,越低层的数据范围越大,数据密度越高。

3.删除操作与修改的特点

  • 删除并不立即从磁盘中移除数据:

    • 数据会在 MemTable 中写入一条 delete 标记
    • 在后续的 Compaction 过程中,带有删除标记的数据才会被真正移除。
  • 修改就是追加一条新数据,版本比之前的新

三、读优化机制

1. Block Cache

  • RocksDB 使用 Block Cache 缓存最近访问的热数据块,减少磁盘 IO。

2. Bloom Filter

  • 每一层 SST 文件配备 Bloom Filter

    • 快速判断某个键是否存在。
    • 如果返回“不存在”,则该键一定不在文件中;
    • 如果返回“可能存在”,则需要进一步查询 SST 文件。

四、优势与特点

  1. 高效写入:数据写入是顺序的,避免了随机写磁盘的开销。

2.层级存储:数据通过 Compaction 从上层迁移到下层,结构简单且高效。

3.可靠性:WAL 提供持久性保障,确保数据不会因系统崩溃而丢失。

4.读写分离:内存、磁盘分工明确,读写性能优化明显。

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论