etcd 实战课
唐聪
腾讯云资深工程师,etcd 活跃贡献者
28449 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 28 讲
开篇词 (1讲)
etcd 实战课
15
15
1.0x
00:00/00:00
登录|注册

10 | boltdb:如何持久化存储你的key-value数据?

管理页面的分配
校验码
上一次写事务ID
总的页面数量
freelist页面ID
根bucket信息
页大小
版本号
文件标识
空闲页(free page)
空闲页管理页(freelist page)
B+ tree叶子节点页(leaf page)
B+ tree索引节点页(branch page)
元数据页(meta page)
持久化meta page
将用户更新操作产生的dirty page数据持久化到磁盘中
持久化freelist
调整B+ tree,进行重平衡、分裂操作
bucket的Put API
创建bucket
B+ tree的查找算法
根据meta page中记录root bucket的root page
校验meta page的有效性
读取两个meta page到db对象实例中
mmap机制将db文件映射到内存
打开db文件并增加文件锁
freelist
branch page
bucket数据结构
meta page数据结构
page磁盘页结构
提交事务
使用bucket对象更新一个key
使用事务对象创建key bucket
参数true表示创建一个写事务
打开boltdb文件
freelist
meta page数据结构
文件内容由若干个page组成
为什么boltdb有两个meta page呢?
若持久化key-value数据到磁盘成功了,此时突然掉电,元数据还未持久化到磁盘,那么db文件会损坏吗?数据会丢失吗?
事务提交原理
Put原理
Open原理
核心数据结构介绍
boltdb API
boltdb的磁盘布局
思考题
etcd数据存储在boltdb
唐聪
如何持久化存储你的key-value数据?

该思维导图由 AI 生成,仅供参考

你好,我是唐聪。
在前面的课程里,我和你多次提到过 etcd 数据存储在 boltdb。那么 boltdb 是如何组织你的 key-value 数据的呢?当你读写一个 key 时,boltdb 是如何工作的?
今天我将通过一个写请求在 boltdb 中执行的简要流程,分析其背后的 boltdb 的磁盘文件布局,帮助你了解 page、node、bucket 等核心数据结构的原理与作用,搞懂 boltdb 基于 B+ tree、各类 page 实现查找、更新、事务提交的原理,让你明白 etcd 为什么适合读多写少的场景。

boltdb 磁盘布局

在介绍一个 put 写请求在 boltdb 中执行原理前,我先给你从整体上介绍下平时你所看到的 etcd db 文件的磁盘布局,让你了解下 db 文件的物理存储结构。
boltdb 文件指的是你 etcd 数据目录下的 member/snap/db 的文件, etcd 的 key-value、lease、meta、member、cluster、auth 等所有数据存储在其中。etcd 启动的时候,会通过 mmap 机制将 db 文件映射到内存,后续可从内存中快速读取文件中的数据。写请求通过 fwrite 和 fdatasync 来写入、持久化数据到磁盘。
上图是我给你画的 db 文件磁盘布局,从图中的左边部分你可以看到,文件的内容由若干个 page 组成,一般情况下 page size 为 4KB。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

boltdb是一种用于持久化存储key-value数据的技术,基于B+树实现了快速查找、写入和事务提交。文章深入介绍了boltdb的磁盘布局和API操作,包括元数据页、B+树索引节点页、B+树叶子节点页等核心数据结构,以及打开boltdb文件、开启写事务、创建bucket和写入key-value数据等操作。boltdb使用B+树高效管理子bucket和key-value数据,同时通过freelist管理页面的分配。此外,文章还解释了boltdb的Open API原理、Put API原理以及事务提交原理。通过对boltdb的核心数据结构和操作流程的深入分析,读者可以快速了解和掌握boltdb持久化存储key-value数据的技术特点。同时,文章提出了思考题,引发读者对于事务提交过程中数据持久化和元数据损坏的思考,为读者提供了进一步思考和探讨的空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《etcd 实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(24)

  • 最新
  • 精选
  • issac
    唐聪老师,能把每节课的思考题解答一下吗?觉得都是重点有意思的地方,非常感谢老师的辛苦付出!

    作者回复: 嗯,一定会的,春节快乐,近期大量时间投入在新稿,思考题后面我会一个个抽空更新,先看看大家自己思考情况,你也可以把你的想法观点在留言里面回复下。

    2021-02-10
    2
    10
  • Geek_7d539e
    事务提交原理 这小节,没有讲清楚单个的客户端事务请求跟批量事务的关系。麻烦老师再放大讲讲下?多谢。老师看着很年轻,造诣确不一般,了不起。

    作者回复: 感谢支持,受限篇幅的确有一些内容没覆盖到或更深入介绍,后面加餐的时候我看看能否覆盖到。

    2021-07-25
    2
  • 写点啥呢
    请问下唐老师,文章中“boltdb API”一节的示例代码里,"defer tx.Rollback()"将事务回滚放到defer链里,如果事务正常提交了,这时候defer链再调用Rollback会是什么效果?是不是Rollback报错而我们直接忽略掉?

    作者回复: 事务正常提交后,tx.db等相关字段会设置为空,执行tx.RollBack后发现tx.db为空,就直接返回了哈,相当于空操作

    2021-02-10
    1
  • types
    是key-value数据与consistent index在同一个boltdb事务中更新 请问consistent index 在哪边更新的?

    作者回复: 就是你发起一个写请求,MVCC写事物通过boltdb API执行,put写入hello的时候,它也会通过如下的boltdb API, 更新consistent index, 只是bucket名字不一样,最终这两个数据写入,都是在同一个大的boltdb事务中提交的。 如果还有疑问,可以参考下这块代码 https://github.com/etcd-io/etcd/blob/v3.4.9/mvcc/kvstore.go#L546:L556 // put the index into the underlying backend // tx has been locked in TxnBegin, so there is no need to lock it again tx.UnsafePut(metaBucketName, consistentIndexKeyName, bs) atomic.StoreUint64(&s.consistentIndex, ci)

    2021-03-03
    3
  • 唐聪
    文中提到的bbolt是etcd社区基于boltdb fork的一个版本,etcd社区负责维护此版本,原因是boltdb作者认为boltdb已经足够成熟稳定,经过了大规模生产环境检验,新特性和优化点合入会对boltdb稳定性造成一定的影响,个人没更多时间再投入到boltdb上,因此boltdb项目变成archived状态
    2021-02-10
    17
  • 黄骏
    “下来是两个字节描述 boltdb 的版本号 0x2” ,这里应该是4个字节的版本号吧?
    2022-11-25归属地:湖北
    1
  • 登顶计划
    老师您好,请问bbolt工具在哪里下载呢?
    2022-08-07归属地:广东
    1
  • 菜花
    第二行的讲解是不是 有问题。或者是哪个图有问题。 有点蒙了。请老师抽空给解答一下。真的。
    2024-01-19归属地:北京
  • 心如水滴
    课后题: db文件掉电后,key-value数据落库后应该不能损坏。 通过重启etcd后,boltdb需要重新扫描数据构建meta page索引。
    2024-01-04归属地:北京
  • 南北
    开篇的问题,为什么etcd适合读多写少的场景?boltdb使用b+ tree组织数据,读取数据时,访问磁盘的次数有限,内存还有可能做缓存,而写的commit需要rebalance,对磁盘又大量的写入
    2022-12-04归属地:上海
收起评论
显示
设置
留言
24
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部