社区编辑申请
注册/登录
一个全新的 kv 存储引擎-LotusDB
存储 存储架构
有了 rosedb 在 bitcask 模型上的实践之后,以及自己在存储这方面的一些经验积累,去年底的时候,在上班路上突然想到的一个 idea,让我有了做一个新的 kv 存储引擎的想法。

经历了大概 4 个月的打磨,LotusDB 的第一个 release 版本终于发布了,我看了下,有 200 多次 commit(接近 rosedb 一年多的 commit 次数了)。

项目地址:https://github.com/flower-corp/lotusdb

有了 rosedb 在 bitcask 模型上的实践之后,以及自己在存储这方面的一些经验积累,去年底的时候,在上班路上突然想到的一个 idea,让我有了做一个新的 kv 存储引擎的想法。

有了想法之后便是验证,因为其实心里还是没谱,我又在 Github 上翻了翻,并没有同类型的实现。后来又找一些大佬沟通了下,证明我的想法是可行的。

这期间还发现了 Usenix Fast 上的一篇关于优化 LSM 的论文,发现论文的内容跟我的 idea 非常类似,这算是又多了一个理论依据,于是便决定开干了。

众所周知,数据存储引擎,目前最主流的两种模型是 B+ 树和 LSM 树,B+ 树在关系型数据库例如 Mysql 中应用比较广泛,而 LSM 的典型代表 rocksdb 也是大多数分布式系统数据落盘的首选。

B+ 树读性能稳定,而 LSM 写吞吐高,LotusDB 在这基础上做了一个巨大的改动,就是完全舍弃掉 LSM 中的 SST 文件,改由 B+ 树来存储索引,而 value 存放则参考了 Wisckey 和 bitcask 模型的设计,存储到单独的 value log 文件中。

LotusDB 是对 LSM 和 B+ 树的优势结合,目前并没有同类型的实现,我们应该是第一个吃螃蟹的人。

LotusDB 的架构图如下:

前台的写入和 LSM 完全一致,先写 wal 再写 memtable。

而读取则会从 memtable 开始,如果 memtable 找到了,直接返回;没找到的话则从 B+ 树中查询索引,然后根据索引信息到 value log 中获取 value。

大家可以先了解个大概,后续我会出一个完整的《LotusDB 设计与实现》系列文章,全面解析 LotusDB 的架构细节以及代码实现,目前已经写了几篇待发布,欢迎关注公众号的后续更新:

再来看看 LotusDB 提供的一些基本接口,目前实现了基础的 Put、Get、Delete 接口,并且支持 Column Family(借鉴于 rocksdb),以及 value log 的自动 GC 回收。

简单的使用方法如下:

package main

import (
"github.com/flower-corp/lotusdb"
"io/ioutil"
"time"
)

// basic operations for LotusDB:
// put
// put with options
// get
// delete
// delete with options
func main() {
path, _ := ioutil.TempDir("", "lotusdb")
opts := lotusdb.DefaultOptions(path)
db, err := lotusdb.Open(opts)
if err != nil {
panic(err)
}
defer db.Close()

// 1.----put----
key1 := []byte("name")
err = db.Put(key1, []byte("lotusdb"))
if err != nil {
// ...
}

key2 := []byte("feature")
// 2.----put with options----
writeOpts := &lotusdb.WriteOptions{
Sync: true,
ExpiredAt: time.Now().Add(time.Second * 100).Unix(),
}
err = db.PutWithOptions(key2, []byte("store data"), writeOpts)
if err != nil {
// ...
}

// 3.----get----
val, err := db.Get(key1)
if err != nil {
// ...
}
if len(val) > 0 {
// ...
}

// 4.----delete----
err = db.Delete(key1)
if err != nil {
// ...
}

// 5.----delete with options----
deleteOpts := &lotusdb.WriteOptions{
Sync: false,
DisableWal: true,
}
err = db.DeleteWithOptions([]byte("dummy key"), deleteOpts)
if err != nil {
// ...
}
}

目前自认为 LotusDB 的代码质量比之前的 RoseDB 好多了,单元测试更加完备,注释清晰,代码也更加简洁规范,如果你是 Go 新手,或者准备学习 Go,也能够把项目当做练习素材,自己对照着来学习。

当然我们的愿景还是打造一个能够在生产环境中实际落地的存储引擎,目前的版本只是一个开始,后续还会有非常多的工作,包括但不限于:

  • batch 操作,保证原子性
  • 多个 Column Family 保证原子性
  • 基于 SSI 的事务
  • Iterator 迭代器
  • 数据压缩
  • 数据备份
  • index 的分裂
责任编辑:武晓燕 来源: roseduan写字的地方
相关推荐

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-04-01 10:08:21

SQL 优化MySQL数据库

2022-03-10 08:24:17

Docker容器SaaS

2022-04-06 08:49:44

SSTKV存储引擎

2022-04-26 08:00:00

存储UFSeMMC

2022-05-20 11:25:59

中台计算数据

2022-05-11 14:05:11

区块链网络安全存储

2022-04-14 17:53:50

携程AWS上云

2022-03-23 15:19:00

低代码开源阿里巴巴

2022-04-06 13:55:22

DockerLinux

2022-04-26 08:10:33

MySQL存储InnoDB

2022-05-12 14:44:38

数据中心IT云计算

2022-04-12 11:15:31

Redis消息队列数据库

2022-04-12 09:48:22

云计算安全云服务云安全

2022-04-27 08:22:43

Prometheus监控数据库

2022-05-17 11:46:48

高并发服务数据库

2022-05-13 10:24:44

WineWindowsLinux

2022-04-28 15:38:42

WebViewJavaUI

2022-04-12 15:48:47

物联网

2022-05-07 13:51:24

云计算公有云数据

同话题下的热门内容

一篇学会缓存穿透、缓存击穿、缓存雪崩

编辑推荐

NAS、DAS和SAN三种存储架构的区别一文看懂分布式存储架构,这篇分析值得收藏基于Redis+MySQL+MongoDB存储架构应用如何做数据存储架构技术选型?如何设计企业云存储架构
我收藏的内容
点赞
收藏

51CTO技术栈公众号