2021年10月30日
背景 LevelDB每次写入key-value都是写入到内存中的Memtable中的,但是Memtable的空间不是无限的,Memtable写满后,就需要调用MakeRoomForWrite把Memtable转存为Immutable Memtable,并创建新……
阅读全文
2021年10月28日
leveldb对外提供的写入接口是Put,Put的实现如下: Status DB::Put(const WriteOptions &opt, const Slice &key, const Slice &value) { WriteBatch batch; batch.Put(key, value); return Write(opt, &batch); } WriteBatch是一个比较简单的类,只有一个string类型的成员变量rep_。提供了插入、删除、遍历等操作,详细实现可以参考LevelDB源码解析(5)……
阅读全文
2021年10月26日
背景 LevelDB的名字中的Level表示文件是分层存储的,默认最多7层,每层有0到N个文件。除了L0层,每层内部的文件之间都是有序的(所谓Sorted String Table),互斥的(相互之间的key范围没有重叠)。而L0层的文件都是从Memtable直接落盘的,……
阅读全文
2021年10月6日
背景 LevelDB源码解析(4) MemTable介绍了Memtable,LevelDB会先把key-value插入到MemTable中。如果MemTable写满了,就会新建一个MemTable进行写入。旧的Memtablex会落盘。一个Memtable会产……
阅读全文
2021年10月5日
背景 前面我们逐渐深入的介绍了LevelDB从插入key-value到落盘的整个过程,感兴趣的读者可以移步相关文章: LevelDB源码解析(4) MemTable LevelDB源码解析(5) WriteBatch LevelDB源码解析(6) 写任务(WriterBatch)合并 LevelDB源码……
阅读全文
2021年10月5日
背景 在LevelDB源码解析(4) MemTable中我们介绍了Memtable,LevelDB会先把key-value插入到MemTable中。如果MemTable写满了,就会新建一个MemTable进行写入。旧的Memtable(也叫Immutable M……
阅读全文
2021年10月4日
背景 Filter block为SST中一个区块,filter block由多个filter组成,每个data block对应一个filter(但是一个filter可能对应多个data block)。LevelDB在进入data block中查找前会先检查filter,如果fi……
阅读全文
2021年10月4日
背景 一个SST文件由5个区块组成,其中三个区块都是由BlockBuilder构建的,所以在讲SST文件的构建之前,先讲一下BlockBuilder。BlockBuilder接受一组key-value,将其序列化到buffer中,buffer的数据就是要写入……
阅读全文
2021年10月2日
背景 LevelDB每次写key-value不会直接写到文件中,而是先暂存在Memtable中,Memtable写满后再写到文件中。如果发生故障(比如宕机),保存在Memtable中的key-value就会全部丢失。所以为了保证数据的原子性和持久性,每次写k……
阅读全文
2021年10月1日
背景 写任务合并是由函数BuildBatchGroup来完成的,BuildBatchGroup会把任务队列writers_中若干个Writer的数据合并到一起,从而减少磁盘写次数,提高写性能。虽然每次写入的时候是往Memtable里写,但是为了在故障发生时保……
阅读全文