当前位置: 首页 > news >正文

LSM-Tree数据结构和数据库

LSM-TreeLog-Structured Merge-Tree,日志结构合并树)是一种专门为高写入吞吐量场景设计的存储结构。它被广泛应用于现代 NoSQL 数据库和大数据系统中,如 LevelDB、RocksDB、Cassandra、HBase、InfluxDB 等。

它的核心思想是:将随机写入转换为顺序写入,以换取极高的写入性能,而读取性能则通过后台合并和缓存机制来优化。


为什么需要 LSM-Tree?

传统 B+ 树数据库在处理高并发写入时面临挑战:

  • 每次写入(插入/更新/删除)都可能需要修改磁盘上的多个页面(随机写)。
  • 磁盘(尤其是机械硬盘)的随机写速度远慢于顺序写。
  • 在 SSD 上,频繁的随机写也会加剧“写放大”问题,影响寿命和性能。

LSM-Tree 通过“先写日志,再批量合并”的策略,完美解决了这个问题。


LSM-Tree 的核心组件与工作流程

一个典型的 LSM-Tree 存储系统包含以下几个关键组件:

1. 内存组件:MemTable
  • 作用: 一个内存中的有序数据结构(通常是跳表 SkipList 或平衡树)。
  • 写入流程
    1. 当有新数据写入(PUT key=value),系统首先将操作追加到磁盘上的预写日志(WAL) 中(确保数据不丢失)。
    2. 然后将 key-value插入到 MemTable 中。
  • 特点
    • 写入是内存操作,极快
    • MemTable 有序,支持高效的内存查找。
2. 磁盘组件:SSTable (Sorted String Table)
  • 作用: 一种持久化、不可变、按键有序存储的磁盘文件格式。
  • 生成流程
    1. 当 MemTable 的大小达到阈值(如 64MB)时,它会被冻结(frozen) 并标记为只读。
    2. 一个后台线程将其内容顺序写入磁盘,生成一个新的 SSTable 文件。
    3. 同时,一个新的 MemTable 被创建,接收新的写入请求。
  • 特点
    • 顺序写入: 高效利用磁盘带宽。
    • 不可变(Immutable): 一旦写入磁盘,文件内容不再修改。
    • 有序: 键值对按键排序,支持二分查找。
3. 后台任务:Compaction (合并)
  • 问题: 随着时间推移,磁盘上会产生大量 SSTable 文件。同一个 key 可能在多个文件中(旧版本),查找时需要检查多个文件,效率低下。
  • 解决方案Compaction(合并)。
  • 过程
    1. 后台线程定期选择多个较小的 SSTable 文件。
    2. 将它们合并成一个更大的 SSTable 文件。
    3. 在合并过程中:
      • 去重: 保留 key 的最新版本。
      • 删除: 移除已标记为删除的 key(Tombstone)。
    4. 合并完成后,删除旧的 SSTable 文件。
  • 好处
    • 减少文件数量,降低读取开销。
    • 清理无效数据,回收空间。
    • 维持存储效率。

LSM-Tree 的读取流程

读取比写入复杂,需要检查多个组件:

  1. 查询 MemTable: 检查最新的写入是否在内存中。
  2. 查询 Immutable MemTable(如果有): 检查正在刷盘的旧内存表。
  3. 查询 SSTable 文件
    • 最新的 SSTable 开始查找(因为新数据在新文件中)。
    • 每个 SSTable 通常带有布隆过滤器(Bloom Filter),可以快速判断某个 key 一定不存在,避免不必要的磁盘 I/O。
    • 如果布隆过滤器说“可能存在”,则在 SSTable 中进行二分查找。
  4. 返回结果: 找到第一个匹配的 key(最新版本)即返回。

⚠️ 注意: 读取可能需要访问多个 SSTable,因此读取性能通常低于写入性能,但通过布隆过滤器和缓存可以大幅优化。


LSM-Tree 的优缺点总结

优点缺点
极高的写入吞吐量: 写入 = 内存操作 + 顺序写 WAL,几乎没有随机写。读取延迟较高: 可能需要检查多个 SSTable 和内存表。
对 SSD 友好: 减少随机写,降低写放大。写放大(Write Amplification): Compaction 过程会重复读写数据,增加 I/O。
高效的范围查询: SSTable 有序,顺序扫描很快。空间放大(Space Amplification): 旧版本数据和多个 SSTable 副本会占用额外空间。
崩溃恢复快: 通过 WAL 重放即可恢复 MemTable。延迟突刺(Latency Spikes): 大规模 Compaction 可能占用大量 I/O,导致短暂延迟升高。

与 B+ 树的对比

特性LSM-TreeB+ 树
写入性能极高(顺序写)一般(随机写)
读取性能一般(多源查找)极高(单次磁盘 I/O 定位)
存储结构分层(内存 + 多级磁盘文件)单一树结构
更新方式写新版本,旧版本后台清理原地更新或页分裂
典型应用写密集型 NoSQL、时序数据库传统关系型数据库(MySQL, PostgreSQL)

总结

LSM-Tree 是一种“以空间换时间,以读取换写入”的存储结构

  • 它用复杂的读取路径和后台合并任务,换取了无与伦比的写入性能
  • 其核心是 MemTable + SSTable + Compaction 三部曲。
  • 它是现代高性能、可扩展数据库的基石,特别适合写多读少、数据量大、允许最终一致性的场景。

你可以把它想象成一个“先记草稿,再抄写整理”的学霸:写作业(写入)飞快,但找答案(读取)时可能需要翻几本草稿本,不过他每天晚上都会把草稿整理成一本整洁的笔记(Compaction),让下次查找更容易。

http://www.dtcms.com/a/410226.html

相关文章:

  • 理解Modbus地址:设备手册地址 (40001) vs. 协议地址 (0)
  • 自己做电商网站网站建设 万网
  • Linux系统编程:线程概念
  • 【pycharm---pytorch】pycharm配置以及pytorch学习
  • 学做网站培训 上海南昌网站页面优化
  • 《C++ Primer Plus》读书笔记 第二章 开始学习C++
  • 【精】C# 精确判断XML是否存在子节点
  • 从零开始学神经网络——GRU(门控循环单元)
  • XML中的 CDATA mybaitis xml中的 <![CDATA[ xxxx ]]>
  • iOS 26 系统流畅度剖析:Liquid Glass 动画表现 + 用户反馈
  • JavaScript学习笔记(十四):ES6 Set函数详解
  • 应用网站如何做wordpress 不同数据库
  • Nginx 访问控制、用户认证与 HTTPS 配置指南
  • 老板让做公司网站设计社交网站开发公司
  • 电影级深黄色调人像风光摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 【C++】:模板进阶
  • 【java 语法】Java枚举(Enum)全面详解
  • 栈的顺序存储基本概述
  • 休闲食品网站建设中土集团北方建设有限公司网站
  • 车载以太网100/1000BASE-T1物理层的基础概念和应用注意事项
  • Bandzip去除公告
  • 上颌磨牙根方解剖特点与拔牙器械应用策略
  • 三数之和_优选算法(C++)双指针
  • 鸿蒙开发 一 (九)、嵌套滚动,Scroll + List
  • 【展厅多媒体】互动虚拟翻书技术应用全解析
  • 外贸网站建设定制开发小型办公室中式装修
  • WaveTerminal+cpolar:命令行工具的远程协作新体验
  • 基于C++的分布式RPC框架(一)
  • 【有源码】基于Hadoop+Spark的AI就业影响数据分析与可视化系统-AI驱动下的就业市场变迁数据分析与可视化研究-基于大数据的AI就业趋势分析可视化平台
  • 爆炸特效:Unity+Blender-02-火焰