Badger的GC初步探究

类似 RocksDB, badger 是 Go 基于 LSM 实现的 KV 数据库。本文介绍基于 badger 的 1.62 版本。 与传统的LSM 不同,对于 value 数据,badger 会写入 value log,来减少写放大和读放大。但是也会造成问题,就是磁盘会占用过多。 value log 的 gc 实现的比较简单。 我们先看下 badger 写入链路。 数据会优先写入 value log , 这里实际当成了 WAL 使用 value pointer 会记录 写入 value log 文件的 fid ,offset, len 然后把数据写入 memtable ,如何memtable 数据写满的话,会变成不可更改的 memtable , 然后写入到 SST Tables 中。 那么何时刷新 memtable , 目前有两种情况: 一个是 memtable 大小控制,超过 memtable 规定的大小,就会刷新。默认是 64M , 通过WithMaxTableSize 可以指定 在一个通过 LogRotatesToFlush 控制,这个参数是说 写入 value log 的文件轮转了多少次,默认是 2 次。 超过这个数值也会刷新。 当 badger 进行重启的时候,会对部分数据进行回放操作。从哪个点的数据进行回放,是通过 head pointer 实现的。 head pointer 记录了 fid 和 offset , 数据比这个 head pointer 晚的话,都会进行回放。...

March 4, 2025 · 2 min · 235 words