分享
  1. 首页
  2. 文章

使用 Rust 和 Go 从零实现 KV 存储

qwe123654 · · 71 次点击 · · 开始浏览

下仔课:youkeit.xyz/4771/ 在现代大规模数据系统中,LSM 树(Log-Structured Merge Tree)已成为键值(Key-Value, KV)存储引擎的核心架构。从 RocksDB、LevelDB 到 Cassandra、TiKV,LSM 树凭借其对高吞吐写入场景的天然适配性,广泛应用于日志处理、时序数据库、分布式存储等关键领域。然而,随着数据规模和并发负载的持续增长,LSM 树固有的"写放大"与"读放大"问题日益凸显,成为制约系统性能进一步提升的主要瓶颈。如何有效优化读写放大,已成为 KV 存储技术演进的关键方向。 一、LSM 树的性能瓶颈:读写放大的本质 LSM 树通过将随机写转换为顺序写,极大提升了写入效率。但这种优势是以 Compaction(合并压缩)过程中的写放大为代价的。所谓写放大,是指实际写入磁盘的数据量远大于用户提交的数据量。例如,在 Leveled Compaction 策略下,一次写入可能在多层之间反复迁移,导致数倍甚至数十倍的额外 I/O。 与此同时,读放大也不容忽视。由于数据分布在多个层级的 SSTable 文件中,一次查询可能需要访问多个文件,并依赖 Bloom Filter 过滤无效查找。当层级过多或文件碎片化严重时,读取延迟显著上升,尤其在范围查询场景下更为明显。 此外,空间放大——即磁盘上存储的实际数据远超有效数据量——也源于重复版本和删除标记(Tombstone)的累积,进一步加剧了 I/O 和存储成本。 二、传统优化路径及其局限 过去十年,业界围绕 LSM 树的读写放大问题提出了多种优化策略: 调整 Compaction 策略:如 Size-Tiered 与 Leveled 的权衡,或引入 Lazy/Tiered-Leveled 混合模式,试图在写放大与读性能间取得平衡。 优化 Bloom Filter 配置:通过动态调整误判率与内存占用,减少无效磁盘访问。 压缩算法调优:采用 Snappy、LZ4 或 Zstandard 等算法,在存储密度与 CPU 开销之间寻找最优解。 增大 MemTable 与缓存:延缓刷盘频率,减少小文件生成,从而降低后续 Compaction 压力。 然而,这些方法大多是在现有架构内"打补丁",难以从根本上解决 KV 数据耦合带来的结构性缺陷。尤其在 value 较大(如日志、图片元数据)的场景下,Compaction 重写大量无序的 value 数据,成为写放大的主要来源。 三、KV 分离:WiscKey 式架构的突破 针对这一核心痛点,WiscKey 提出了一种革命性的思路:将 Key 与 Value 分离存储。其核心思想是——LSM 树只需维护有序的 Key 及其对应的 Value 位置指针(vpos),而 Value 本身则追加写入一个独立的日志式文件(vlog)。 这种设计带来三大优势: 显著降低写放大:Compaction 仅需重写 Key 和指针,无需搬运庞大的 Value 数据,尤其在 key 小、value 大的典型场景下效果惊人。 提升 LSM 树缓存效率:索引结构体积大幅缩小,更多 Key 可驻留内存,Bloom Filter 与块缓存命中率同步提高。 简化写入路径:Value 写入 vlog 为纯顺序操作,进一步释放 SSD 的 I/O 潜能。 当然,KV 分离也引入新挑战:范围查询可能触发多次随机读取 vlog,影响延迟。对此,WiscKey 采用预读缓存机制,利用 SSD 的内部并行性提前加载后续 Value,有效缓解小范围随机读的性能损失。 四、面向未来的演进方向 WiscKey 的成功启发了后续一系列创新架构,如 BlobDB、PebblesDB 以及现代云原生存储系统中的分层存储设计。未来,KV 存储在读写放大优化上可能朝以下方向发展: 智能分离策略:根据 value 大小动态决定是否分离存储,避免小 value 场景下的额外开销。 vlog 垃圾回收优化:结合 LSM 树状态,实现低干扰、增量式的 vlog 清理,减少后台任务对前台性能的影响。 硬件感知设计:针对 NVMe、CXL 等新型存储介质,重构 I/O 调度与缓存策略,最大化硬件并行能力。 一致性与持久性协同优化:通过 WAL 与 vlog 合并写入、异步刷盘等机制,将两次持久化操作融合为一次,兼顾性能与可靠性。 五、结语 LSM 树作为现代 KV 存储的基石,其性能瓶颈并非不可逾越。通过从"数据组织方式"层面进行根本性重构,如 WiscKey 所示的 KV 分离架构,我们有望在不牺牲写入优势的前提下,大幅缓解读写放大问题。未来,随着存储硬件的演进与系统软件的协同创新,LSM 树将继续在高吞吐、低延迟、高可靠的数据存储场景中扮演不可替代的角色,为下一代数据库与分布式系统提供坚实底座。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
71 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏