1. leveldb 文档
了解一款软件最快的方式是看文档、部署、使用,这里看下文档
1.1. index.md
index.md
这个文章翻译的比较通顺
index中主要提到leveldb的功能和特性
1.1.1. 常规操作
- 打开数据库
- 状态获取(主要用来用来捕获错误)
- 关闭数据库
- 读/写
1.1.2. 进阶操作
- 原子性更新和批量更新(主要使用
leveldb::WriteBatch
实现) - 同步写入 – 默认异步写入,为了确保某些记录的数据可靠性可单独设置同步写入
- 并发 – 单进程的线程共享
leveldb::DB
对象 - 迭代 – 打印所有kv、打印指定范围kv、反向迭代(一般比较慢)
- 快照 – 提供一致性只读视图(没太理解这个概念)
有个使用场景就是,遍历某个时间点的数据库 - slice 针对迭代器返回的key和value,其他的后面遇到再补充
- 比较器 – 比较k v
- 性能优化 – 配置
include/options.h
中默认值
- block size-- 默认未压缩的为4096 byte
- 压缩
- 缓存
- key布局
- key读取过滤
- 数据校验
- 近似空间大小 – 获取key区间占用文件系统的金丝大小
- 环境变量 – 用户可以通过实现
leveldb::Env
定制环境变量 - 可移植性 – 其他平台的适配
1.2. impl.md
impl.md
1.3. File
本质上,leveldb的实现思路和单点的bigtable类似,文件组织形式不通,主要有如下类型的文件
1.4. Log files
.log 文件 日志文件
记录最新的更新方式为追加,存储在内存
LOG大小达到 [block size默认大小](# 1.1.3)时会转化为一个Sort tables,且创建一个新的LOG
1.5. Sort tables
.sst/.ldb文件 Sort tables持久化文件,存储在磁盘
- 存储内容
- 以key排序存储
- 记录的要么是key,要么是key被删除的标记(删除标记的意义在于删除的时候不用查找旧的sort table中的内容)
- 组织形式
- 通过level的方式组织sort table
- 从log文件中生成的sort table在 level0
- 当level0的.sst/.ldb个数超过4个就会进行合并,把所有的level0和与当前level0有重叠的level1进行合并,每个level1文件大小2MB
- 只有不同的level0文件可能存在重复的key
- level和合并的文件大小关系为 sst/ldb size > 10^L(MB),例如leve1 10M level2 100M level3 200M
leveldb的设计精髓–level就在这里体现了
- log文件达到限定大小时压缩成level0
- level0 文件个数达到4个压缩成level1
- level1 文件总大小达到10M以上就压缩成level2
只有level0 是通过文件个数来压缩的
…
一致压缩下去
1.5.1. manifest
mainifest记录了key与sorted table的对应关系,每次打开db都会新建一个manifest,以log格式(后面详细看)追加存储
1.5.2. Current
current文件记录了当前正在使用的manifest的文件名,以txt格式存储
1.5.3. Info logs
数据库运行日志
1.5.4. 其他
锁文件
临时文件 – 这个还注意过
1.6. Level 0
log文件超过一定大小(默认为block size 4M),会创建一个新的memtable和log文件,并把后续的个更新定向到新得文件
实现细节
- 将前一个memtable内容写到sstable中
- 丢弃这个memtable
- 删除旧的log和memtable
- 把新的sstable写入level0
后面几点没读完,读完再补