<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Connection-Pool - 标签 - 星河拾贝录</title><link>https://blog.liubang.cc/tags/connection-pool/</link><description>Connection-Pool - 标签 - 星河拾贝录</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>Sun, 24 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.liubang.cc/tags/connection-pool/" rel="self" type="application/rss+xml"/><item><title>MiniDFS 02: 元数据持久化</title><link>https://blog.liubang.cc/minidfs/2026-05-24-minidfs-02-metadata/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><author><name>liubang</name></author><guid>https://blog.liubang.cc/minidfs/2026-05-24-minidfs-02-metadata/</guid><description><![CDATA[<p>NameNode 的核心职责是管理元数据。HDFS 用 EditLog + FsImage 实现持久化——这套方案在生产中经受了海量验证，但它的复杂度（checkpoint 合并、HA 下的 JournalNode 同步、启动时重放 EditLog）对一个教学项目来说是过度的。MiniDFS 选择了一条不同的路：直接用 MySQL 做元数据后端。</p>
<p>这篇文章深入讲解这个设计选择的 tradeoff，以及在 MySQL 之上构建的三层关键机制：连接池 RAII 封装、事务绑定、ID 原子分配。</p>
<p><figure><a class="lightgallery" href="/images/minidfs/metadata-layer.svg" title="MiniDFS 元数据层架构" data-thumbnail="/images/minidfs/metadata-layer.svg" data-sub-html="<h2>元数据层整体架构：从 NameNode Manager 到 MySQL 的分层设计</h2><p>MiniDFS 元数据层架构</p>"><img  loading="lazy" src='/images/minidfs/metadata-layer.svg'   alt="MiniDFS 元数据层架构"  ></a><figcaption class="image-caption">元数据层整体架构：从 NameNode Manager 到 MySQL 的分层设计</figcaption>
</figure></p>
<h2 id="hdfs-的-editlog--fsimage为什么复杂" class="headerLink">
    <a href="#hdfs-%e7%9a%84-editlog--fsimage%e4%b8%ba%e4%bb%80%e4%b9%88%e5%a4%8d%e6%9d%82" class="header-mark"></a>HDFS 的 EditLog + FsImage：为什么复杂</h2><p>HDFS 的元数据持久化遵循经典的 WAL（Write-Ahead Log）思路。每次元数据变更——创建文件、追加 block、修改权限——都以一条 EditLog record 追加写入磁盘。FsImage 则是某一时刻的全量 namespace 快照。NameNode 启动时加载最近的 FsImage，然后顺序重放此后的所有 EditLog 条目，恢复到最新状态。</p>
<p>这个方案的工程复杂度主要体现在三处。第一是 Checkpoint 过程：SecondaryNameNode（或 HA 架构下的 StandbyNameNode）需要定期将 EditLog 合并进 FsImage 以避免重放时间无限增长，大集群的 FsImage 动辄数十 GB，合并本身就是一个不可忽视的 I/O 密集操作。第二是 HA 方案引入的 JournalNode 集群：Active NameNode 将 EditLog 写入多数派 JournalNode，Standby 从 JournalNode 拉取并重放，保持 namespace 同步——这套机制引入了 Paxos 式的多数派确认、fencing、epoch 管理等分布式一致性的全套复杂度。第三是 EditLog 自身的格式管理：segment 滚动、序列化版本升级、损坏恢复工具。</p>]]></description></item></channel></rss>