绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
高性能key-value数据库nessDB介绍
2022-04-11 16:38:56
style="POSITION: absolute; BORDER-BOTTOM-STYLE: none; BORDER-RIGHT-STYLE: none; MARGIN: 0px; WIDTH: 70px; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; TOP: -10000px" id="I0_1356615949188" tabindex="0" vspace="0" marginheight="0" src="https://plusone.google.com/_/+1/fastbutton?bsv&size=small&hl=en-US&origin=http%3A%2F%2Fblog.nosqlfan.com&url=http%3A%2F%2Fblog.nosqlfan.com%2Fhtml%2F3851.html&ic=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.zh_CN.o5EfsmDNisM.O%2Fm%3D__features__%2Fam%3DiQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAItRSTMAZszERHfSot5-hp_5VGiqm0kOJg#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled&id=I0_1356615949188&parent=http%3A%2F%2Fblog.nosqlfan.com" frameborder="0" width="" allowtransparency="" name="I0_1356615949188" marginwidth="0" scrolling="no" hspace="0">

nessDB是一个小巧、高性能、可嵌入式的key/value存储引擎,使用标准C开发,支持Linux, *BSD, OS X and Solaris等系统,无第三方库依赖。本文来自nessDB作者@BohuTANG 的投稿分享,推荐给大家。

同时nessDB还提供一个服务端,支持Redis的 PING, SET, MSET, GET, MGET, DEL, EXISTS, INFO, SHUTDOWN 命令,您可以使用任何一款Redis客户端来连接和操作nessDB。

整个引擎基于LSM-Tree思想开发,对随机写非常友好。为提高随机读,nessDB使用了Level LRU和Bloom Filter策略。

nessDB结构介绍

主要包括:Memory-Table,Sorted-Table(*.sst)、Meta和Log四大部分。

1. Memory-Table 是个有序内存表,使用Skiplist实现。

所有的添加/删除首先会写到这个内存表,当这个内存表达到一定数量后,进入immutable只读状态,后台线程开始对其进行merge操作。同时会新建一个内存表,继续接受添加/删除操作。

Memory-Table数据结构如下:

keyvalue-offsetoperation
  • ‘key’:key数据
  • ‘value-offset’:value在DB文件里的偏移地址
  • ‘operation’:标识,是添加还是删除操作

由于不存储value,可以对更多的数据进行缓存和排序,对随机写更友好(这点与levelDB不同)。

nessDB同时多有2个Memory-Table,一个处于可读写的active状态,另一个处于只读的immutable状态。

2. Sorted-Table key有序存储的索引文件(*.sst)。每个sst索引文件默认存储25000条记录,任何两个sst索引文件没有区间重叠(也没有level之分,这点与levelDB不同)。

一个sst索引文件结构如下:

key1value1-offset(big-endian)
key2value2-offset(big-endian)
… more key and value offset …
keyNvalueN-offset(big-endian)
last-keycountcrc

后一行是个FOOTER结构,存储着当前索引文件大的key(即last key),当前索引文件拥有的记录数目(count)和一个crc值。

3. Meta 索引Meta信息表

nessDB每次启动的时候,读取所有sst索引文件的FOOTER信息,组成一个内存索引meta信息表,结构如下:

begin keyend keysst file namesequential number
… all the other items …

此meta信息表的作用是可根据key二分查找出所在的sst索引文件。

4. Log

log是Memory-Table在磁盘上的一个镜像,如果因为某种原因crash,下次重启时,nessDB会自动检测并进行数据恢复。

性能

这有个不太专业的性能测试报告:https://gist.github.com/2235147

该测试基于: Linux 3.0.0内核,Ext4文件系统,CFQ调度器。

如果您有兴趣,可以下载源码:

./make db-bench
./db-bench write <count>

进行性能测试,不同机器结果会有差别。

关于nessDB

nessDB是一个开源项目,目前已有十多位代码贡献者,希望更多的人参与进来。

源码地址:https://github.com/shuttler/nessDB

希望使用B树开发自己NoSql产品的朋友,可以尝试下LSM-Tree,它思想朴素、简单,性能好。 

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Key-Value 数据库
创建时间:2022-04-11 15:50:47
Key-Value 数据库
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~