<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LSM-Tree on 我的技术博客</title><link>https://buvidk1234.github.io/tags/lsm-tree/</link><description>Recent content in LSM-Tree on 我的技术博客</description><generator>Hugo -- 0.153.0</generator><language>zh-cn</language><lastBuildDate>Sun, 22 Mar 2026 14:14:08 +0800</lastBuildDate><atom:link href="https://buvidk1234.github.io/tags/lsm-tree/index.xml" rel="self" type="application/rss+xml"/><item><title>LSM-Tree 原理与消息存储选型</title><link>https://buvidk1234.github.io/posts/lsm-tree/</link><pubDate>Sun, 22 Mar 2026 14:14:08 +0800</pubDate><guid>https://buvidk1234.github.io/posts/lsm-tree/</guid><description>&lt;h2 id="1-概述"&gt;1. 概述&lt;/h2&gt;
&lt;p&gt;LSM-Tree（Log-Structured Merge-Tree）是一种典型的&lt;strong&gt;写优化&lt;/strong&gt;存储结构。它的核心思路是：不追求每次写入都直接落到最终有序位置，而是将写入拆成**&amp;ldquo;前台快速落地 + 后台异步整理&amp;rdquo;**两个阶段。&lt;/p&gt;
&lt;p&gt;设计目标可以归纳为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顺序化写入&lt;/strong&gt;：前台写入以追加为主，避免随机写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后台整理&lt;/strong&gt;：异步 Compaction 控制查询路径复杂度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可调节的权衡&lt;/strong&gt;：在写吞吐、读延迟和空间占用之间提供调优空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-整体架构与核心组件"&gt;2. 整体架构与核心组件&lt;/h2&gt;
&lt;p&gt;LSM-Tree 的运行依赖以下组件协同工作：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组件&lt;/th&gt;
&lt;th&gt;位置&lt;/th&gt;
&lt;th&gt;职责&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WAL（Write-Ahead Log）&lt;/td&gt;
&lt;td&gt;磁盘&lt;/td&gt;
&lt;td&gt;写前日志，保证崩溃恢复&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MemTable&lt;/td&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;有序表，接收实时写入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Immutable MemTable&lt;/td&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;写满后冻结，等待刷盘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSTable&lt;/td&gt;
&lt;td&gt;磁盘&lt;/td&gt;
&lt;td&gt;有序、不可变的持久化文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compaction&lt;/td&gt;
&lt;td&gt;后台任务&lt;/td&gt;
&lt;td&gt;合并 SSTable，版本收敛与空间回收&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;数据在组件间的流转路径如下：&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
W[Write Request] --&gt; L[Append WAL]
L --&gt; M[Insert MemTable]
M --&gt;|Threshold reached| IM[Immutable MemTable]
IM --&gt; F[Flush to SSTable]
F --&gt; C[Compaction]
C --&gt; S[(Merged SSTables)]&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-写路径"&gt;3. 写路径&lt;/h2&gt;
&lt;p&gt;写入的关键原则是 &lt;strong&gt;&amp;ldquo;先确认可恢复，再确认可查询&amp;rdquo;&lt;/strong&gt;。具体步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;追加 WAL&lt;/strong&gt;——保证持久化，崩溃后可重放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新 MemTable&lt;/strong&gt;——对外可查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冻结 MemTable&lt;/strong&gt;——达到阈值后转为 Immutable。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flush 为 SSTable&lt;/strong&gt;——后台将 Immutable MemTable 写入磁盘。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这条路径带来的关键特性：&lt;/p&gt;</description></item></channel></rss>