乐趣区

关于go:Go存储引擎资料分享

背景

最近逛知乎的时候看到了这个问题,“Go 语言如何写数据库?”。说来我业余时间在这个畛域有一些工夫精力的投入了,所以想答复一下。我投入的方向是存储引擎方面,所以这篇文章次要是总结一下我看过的一些比拟好的 Go 存储引擎的材料。列举一些论文,开源我的项目。读者能够自行去理解。

什么是存储引擎?

简略来说存储引擎就是寄存和读取用户数据的中央,对于长久化的存储引擎而言,数据的归宿是非易失性的存储介质(艰深意义上来说就是磁盘)所以该以什么模式组织和存储数据,这就是存储引擎设计的艺术所在。这一块波及到和操作系统打交道 (次要是 IO 操作),还有如何更快的解决数据,这里波及到并发事物如何解决,另外思考空间局部性和工夫局部性原理,这里波及到对数据缓存的设计。整体来说 scope 还是比拟大的,钻研空间比拟广。上面举荐的是磁盘 IO 相干的文章和数据存储相干的视频材料。而这篇文章次要列举的是 Hash,B+Tree,LSM-Tree 三种存储引擎的材料。

  1. 磁盘 IO 那些事
  2. 数据存储与检索 (详解 b + 树存储引擎 (innodb、boltdb、buntdb 等)、lsm 树存储引擎 (bitcask、moss、pebble、leveldb 等)

1. Hash

Hash 存储引擎绝对实现比较简单,这里就放在第一个讲了。Bitcask 是 hash 存储引擎的典型实现,而 Bitcask 在 go 中有两个实现,nutsdb 和 rosedb,而 nutsdb 是我去年开始参加保护的,tiny-bicask 是我写的一个简略版 bitcask 实现,目标是不便 nutsdb 社区小伙伴疾速上手我的项目。上面是我举荐的 bitcask 相干材料和我的项目:

  1. Bitcask paper
  2. nutsdb
  3. rosedb
  4. tiny-bitcask
  5. nutsdb 设计与实现 Go 夜读分享
  6. rosedb 设计与实现 Go 夜读分享

2. B+Tree

B+ Tree 是大家耳熟能详的一种存储引擎架构,赫赫有名的 MySQL innodb 存储引擎就是基于 B + Tree 实现的。在 Go 中 Boltdb 是 B +Tree 的典型实现,其中驰名的分布式存储 etcd,底层用的是 boltdb 存储元数据。上面是 B +Tree 存储引擎的一些相干材料:

  1. Boltdb
  2. 自底向上剖析 BoltDB 源码
  3. Google B-Tree 实现

3. LSM-Tree

LSM-Tree 的典型代表有 leveldb 和 rocksdb,目前支流的 NoSQL 数据库底层采纳的存储引擎个别都是基于 LSM-Tree 实现的。而在 go 中有 goleveldb 和 badgerdb 两个实现,而 badger 是基于论文 WiscKey 实现的 Key Value 拆散的 LSM 架构存储。

  1. LSM paper
  2. Wisckey paper
  3. goleveldb
  4. badgerdb
  5. leveldb hand-book

总结

其实要怎么写数据库,我感觉这个问题还是太宽了,然而如果你对这方面的确感兴趣,能够先从学习相干实践,并且选一些开源我的项目去钻研源码,必要时候能够参加到开源我的项目的开发之中。没有比理论入手写更好的学习形式了。另外在前面的学习过程中还会有更多优良的学习材料,所以打算把这些材料整顿到 github 我的项目外面,前面不便保护,https://github.com/elliotchen…,大家对这方面感兴趣的话能够 star 和提 PR,感激。

退出移动版