<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Leveldb - 标签 - 星河拾贝录</title><link>https://blog.liubang.cc/tags/leveldb/</link><description>Leveldb - 标签 - 星河拾贝录</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>it.liubang@gmail.com (liubang)</managingEditor><webMaster>it.liubang@gmail.com (liubang)</webMaster><copyright>Copyright © 2019-2026 LiuBang. All Rights Reserved.</copyright><lastBuildDate>Tue, 12 Jan 2021 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.liubang.cc/tags/leveldb/" rel="self" type="application/rss+xml"/><item><title>LevelDB 源码阅读之 Compaction</title><link>https://blog.liubang.cc/posts/storage/2021-01-12-leveldb%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E4%B9%8Bcompaction/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><author><name>liubang</name></author><guid>https://blog.liubang.cc/posts/storage/2021-01-12-leveldb%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E4%B9%8Bcompaction/</guid><description><![CDATA[<h2 id="1-概览" class="headerLink">
    <a href="#1-%e6%a6%82%e8%a7%88" class="header-mark"></a>1. 概览</h2><p>要谈论 LevelDB 的 Compaction 就不得不从 LevelDB 的整个数据写入流程入手。LevelDB 的基本写入流程大致为：</p>
<ol>
<li>数据先写入到 WAL 日志中，做持久化</li>
<li>然后数据同步到<code>mutable memtable</code>中</li>
<li>当<code>mutable memtable</code>大小达到<code>Options.write_buffer_size</code>设置的大小时，就会变成<code>immutable memtable</code>，并且创建一个新的<code>mutable memtable</code></li>
<li>后台的 Compaction 线程会把<code>immutable memtable</code>dump 成 sstable 文件，并设置于 Level 0 层</li>
<li>当 Level i 达到一定条件后，就会和 Level i + 1 层的 sstable 进行合并，从而触发 Compaction 过程，并在 Level
n + 1 层生成一个新的 sstable 文件</li>
</ol>
<h2 id="2-compaction-分类" class="headerLink">
    <a href="#2-compaction-%e5%88%86%e7%b1%bb" class="header-mark"></a>2. Compaction 分类</h2><p>在 LevelDB 中，Compaction 大体上可以分为两类，分别是：</p>
<ul>
<li><code>immutable memtable compaction</code>，也叫做<strong>minor compaction</strong>，指的是将<code>immutable memtable</code>dump 到 sstable 文件的过程</li>
<li><code>sstable compaction</code>，也叫做<strong>major compaction</strong>，指的是 sstable 文件之间的合并过程</li>
</ul>
<p>而对于<code>sstable compaction</code>又可以细分为三种：</p>
<ul>
<li><code>manual compaction</code>，是指外部通过调用<code>DBImpl::CompactRange</code>接口触发的</li>
<li><code>size compaction</code>，是指程序根据每个 Level 的总文件大小通过一定规则自动触发的</li>
<li><code>seek compaction</code>，每个 sstable 文件内部维护了一个<strong>seek miss</strong>的 counter，当达到一定条件的时候，LevelDB 就认为这个文件需要 Compact</li>
</ul>
<p>从<code>DBImpl::BackgroundCompaction</code>的代码逻辑中不难看出，这些 Compaction 策略的优先级为：</p>]]></description></item></channel></rss>