现在首先实现内存的数据结构, 其实我一开始想直接用基于红黑树的std::map的, 但发现LevelDB和RocksDB使用的低层数据结构都是跳表, 主要是因为: 1. 跳表天然支持顺序遍历,适合 LSM Tree 的 Compaction 和范围查询 2. 跳表的代码实现和维护成本低 3. 跳表的插入更简单, 而红黑树需要通过左旋或右旋来保证黑色节点...
我每天都在使用这个存储引擎,但是对它的了解还流于表面,所以我想要自己实现一次LSM-Tree加深理解。 本次实现我们采用了Zig语言,简要的实现LSM-Tree的核心功能(读写、数据压缩、持久化,不包含MVCC的内容)。 Zig是一种新兴的系统编程语言,其设计目标是提供现代特性的同时保持低复杂性。 本项目极大的受到了Mini-Lsm这...
LSM-Tree全称是Log Structured Merge Tree,是一种分层,有序,面向磁盘设计的数据结构,其核心思想是利用磁盘批量的顺序写要比随机写性能高的特点,将所有更新操作都转化为追加写方式,提升写入吞吐。LSM-tree类的存储引擎最早源于Google三驾马车之一的BigTable的存储引擎以及它的开源实现LevelDB。LSM-tree存储引擎有几个特...
笔者使用 Go 语言来实现 LSM Tree 数据库,因为 LSM Tree 的实现要求对文件进行读写、锁的处理、数据查找、文件压缩等,所以编码过程中也提高了对 Go 的使用经验,项目中也使用到了一些栈、二叉排序树等简单的算法,也可以巩固了基础算法能力。适当给自己设定挑战目标,可以提升自己的技术水平。 下面,我们来了解 LSM ...
现在我们跳出来看看基于B+tree和基于LSM-tree两种数据组织结构在实现技术上的对比。首先要回到一个基本点,B+tree是原地更新,而LSM-tree是追加写,这带来的区别就是B+tree的数据视图在内存和外存一个缓存映射关系,而LSM-tree是一个叠加的关系。因而需要面对的技术问题也不同,B+tree需要刷脏,需要有double-write(在P...
基于LSM-tree引擎实现一写多读面临着与B+tree引擎不一样的技术挑战,首先是存储引擎日志不一样,LSM-tree引擎是双日志流,需要解决双日志流的物理复制问题;其次是数据组织方式不一样,LSM-tree引擎采用分层存储,追加写入新数据,需要解决多个计算节点一致性物理快照以及Compat...
实现难度有点高,现在这个实现是KV数据库,算是列式数据库了,大名鼎鼎的HBase,底层数据库引擎就是LSM-Tree的技术思想。 LSM-Tree 是啥子 LSM-Tree 英文全称是 Log Structured Merge Tree (中文:日志结构合并树),是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能...
LSM tree (log-structured merge-tree) 是一种对频繁写操作非常友好的数据结构,同时兼顾了查询效率。LSM tree 是许多 key-value 型或日志型数据库所依赖的核心数据结构,例如 BigTable、HBase、Cassandra、LevelDB、SQLite、Scylla、RocksDB 等。 LSM tree 之所以有效是基于以下事实:磁盘或内存的连续读写性能远高于随...
然后我们发现 TiKV 的写放大比较高。高写放大主要由两部分组成:1) raft 日志数据具有 FIFO 模式,使用 LSM-Tree 引擎存储它效率不高;2)在压缩过程中反复重写 LSM-Tree 中的大值,导致数据部分的写放大很多。 对于raft 日志部分,我从 2017 年开始了 raft-engine 项目来解决这个问题。对于第二部分,我在 2017 年...