一套从源码出发、面向原理的中文知识库,逐模块解析 bbolt 嵌入式数据库的设计与实现。
本项目是对 bbolt(etcd 官方维护的嵌入式 key-value 数据库)的深度中文源码解析。
bbolt 是 etcd 的存储引擎,也被 Kubernetes 等大量生产系统使用。它在 1 万行 Go 代码里实现了:
- 全可序列化 ACID 事务
- 无锁 MVCC(多读单写)
- B+ 树 + mmap 的混合存储架构
- 自带崩溃恢复的两阶段提交
这套知识库的目标不是 API 手册,而是回答那些官方文档不讲、源码里藏得很深的问题:
- mmap 重映射时,正在进行的读事务怎么办?
- Inline Bucket 何时升级为独立页?升级过程会不会丢数据?
- Commit 的六步里,哪一步崩溃会导致数据丢失?
DB.Batch()到底批量了什么?真的能提升写入吞吐吗?
| # | 文章 | 核心主题 | 状态 |
|---|---|---|---|
| 00 | 项目总览 | 项目背景、历史血脉(LMDB→Bolt→bbolt)、设计哲学 | ✅ |
| 01 | 架构设计 | DB/Tx/Bucket/Cursor 四大核心类型、锁体系、数据访问路径 | ✅ |
| 02 | 磁盘文件格式 | Page 结构、Meta 页、双 Meta 崩溃恢复、两阶段写入 | ✅ |
| 03 | 内存映射与页管理 | mmap 只读映射、mmaplock 并发模型、allocate 双轨制、pagePool | ✅ |
| 04 | B+树与Cursor | Cursor 栈模型、spill/rebalance、dereference 深度解析 | ✅ |
| 05 | Bucket 机制 | Inline Bucket 升降级、嵌套实现、MoveBucket O(1)、Sequence | ✅ |
| 06 | 事务系统 | MVCC 原理、Commit 六步流程、Batch 优化、失效场景雷区 | ✅ |
| 07 | Freelist 管理 | 空闲页管理、Array vs HashMap 实现 | 📝 计划中 |
| 08 | Cursor 与遍历 | Cursor 实现细节、范围查询 | 📝 计划中 |
| 09 | 并发模型 | 读写锁、多读单写、事务隔离保证 | 📝 计划中 |
| 10 | Compact 与维护 | 数据库压缩、Surgery 工具 | 📝 计划中 |
| 11 | CLI 工具详解 | bbolt 命令行全部子命令 | 📝 计划中 |
| 12 | API 使用指南 | 完整 API 参考 + 实战代码示例 | 📝 计划中 |
| 13 | 对比分析 | bbolt vs LMDB vs 原版 Bolt vs BadgerDB | 📝 计划中 |
| 14 | 性能特征与调优 | 性能模型、调优参数、最佳实践 | 📝 计划中 |
| 15 | 测试与可靠性 | 测试策略、故障注入、鲁棒性 | 📝 计划中 |
每篇文章遵循固定结构:
- 为什么(设计动机)——先讲问题,再讲方案,让你理解"为什么这么设计"
- 是什么(数据结构/算法)——精确的数据结构描述 + ASCII/Mermaid 图示
- 怎么做(代码走读)——关键代码片段逐行注释,附源文件行号
- 失效场景(雷区)——什么情况下会出错,为什么,怎么避免
- 常见问题——面向实际使用的 FAQ
- bbolt 版本:
v1.4.x(etcd-io/bbolt) - Go 版本:
go1.21+
- 想深入理解嵌入式数据库实现原理的 Go 工程师
- 准备面试需要理解 etcd 存储层的工程师
- 想从 bbolt 源码里学习 B+ 树、mmap、MVCC 实现的学习者