badger框架学习 (一)

2022-04-15 00:00:00 文件 指针 大小 层级 较小

1.badger是什么?
badger是一种高性能的 K/V数据库。
这是 dgraph.io开发的一款基于 log structured merge (LSM) tree 的 key-value 本地数据库, 使用 Go 开发。

2.badger有什么优势?
事实上,市面上已经有一些知名的基于LSM tree的k/v数据库, 比如 leveldb、goleveldb、rocksdb、boltdb, 可是为什么还要创造新的轮子呢。我们不妨从LSM说起。

Log-structured merge-tree (简称 LSM tree) 可以追溯到1996年 Patrick O’Neil等人的论文。简单的LSM tree是两层树状结构C0,C1。 C0比较小,驻留在内存,当C0超过一定的大小, 一些连续的片段会从C0移动到磁盘中的C1中,这是一次merge的过程。在实际的应用中, 一般会分为更多的层级(level), 而层级C0都会驻留在内存中。
 

回到开始的问题, 既然已经有了一些的开源的LSM tree的项目,为什么dgraph还要创建一个新的轮子呢?

答案是: 更好的性能。

dgraph开发一个新的基于LSM tree的数据库引擎badger是基于这篇论文: WiscKey: Separating Keys from Values in SSD-conscious Storage, 这篇论文很新, 也就是去年(2016年)发表的,这篇论文提出了一种新的设计,专门为SSD所优化,将key和value分别存储以减少I/O放大。

3.badger的功能特性?
Badger分离的key和value,只有key存在LSM tree中, value存在WAL中,叫做value log。通常情况下,key比较小,所以LSM tree比较小,当获取value值的时候,再从SSD存储中读取。

LSM tree主要的性能消耗在于 compaction 过程。 在compaction的时候,多个文件需要读进内存,排序,然后再写回。每个文件都固定大小,如果文件中包含value, 文件大小会显著的增加,compaction会更频繁地发生。Badger不存储value,而是存储value的指针, 如果每个键是16, 每个value的指针是16 byte的话,一个64MB的文件就可以存储200万个键值对。

因为Badger不存储value,而是存储value的指针,compaction的时候只移动key和value指针,对于 1KB大小的value和16 byte的key, 写放大为(10*16 + 1024)/(16 + 1024) ~ 1.14。

因为Badger的LSM tree比较小,所以它的层级相对于普通的LSM tree要少,这也意味着查找会更少。例如1KB大小的value, 22byte的key, 7500万条数据的原始大小是 72GB,但是对于Badger的LSM tree来说,只需要1.7G,完全可以放在内存中,这也是Badger的随机读比RocksDB快-3.5的原因。

Badger还使用技术对value值进行压缩,以便使得log文件更小。

Badger使用起来超级简单, 配置参数页不多,而且提供了默认的配置参数。

Badger支持事务,且事务是基于MVCC实现的。

https://blog.csdn.net/sinat_34070003/article/details/80482323

相关文章