leveldb 文档

Posted by elrond on June 26, 2021

1. leveldb 文档

[TOC]

了解一款软件最快的方式是看文档、部署、使用,这里看下文档

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
    • 向后兼容 – kv结构版本
  • 性能优化 – 配置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默认大小时会转化为一个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. 其他

  • LOCK

锁文件

  • .dbtmp

临时文件 – 这个还注意过

1.6. Level 0

log文件超过一定大小(默认为block size 4M),会创建一个新的memtable和log文件,并把后续的个更新定向到新得文件

实现细节

  • 将前一个memtable内容写到sstable中
  • 丢弃这个memtable
  • 删除旧的log和memtable
  • 把新的sstable写入level0

后面几点没读完,读完再补