![精通LevelDB](https://wfqqreader-1252317822.image.myqcloud.com/cover/398/41600398/b_41600398.jpg)
前言
为什么要写这本书
笔者在滴滴工作期间,公司某团队实现了一个兼容Redis协议的分布式NoSQL数据库Fusion。Fusion是构建在SSD磁盘上的存储服务,底层使用存储引擎RocksDB来保存数据。因为兼容Redis协议,所以在数据量特别大的一些场景下,我们开始使用Fusion替代之前使用的Redis。
RocksDB,是一个基于LevelDB开发、实现持久性键-值存储的C++库。而LevelDB则是由Google的Jeff Dean与Sanjay Ghemawat于2011年开发完成并且开源的键-值嵌入式C++库。
虽然同属键-值存储,但Redis是一个基于内存的数据存储引擎,而LevelDB会将数据写入硬盘。出于好奇,笔者业余时间开始阅读LevelDB的源码并零零散散写了一些文章。由于之前写作《Redis 5设计与源码分析》一书时结识了高婧雅编辑,而高编辑跟进的一本LevelDB源码分析的书籍正好需要一名合著者。于是,本书就这样诞生了。
本书特色
虽然国内各大互联网厂商有各类基于LevelDB(或者RocksDB)的分布式键-值存储,但还没有一本系统分析LevelDB实现原理的中文书籍。本书首先介绍LevelDB的基本使用,然后介绍LevelDB的三大基本操作——读取、写入及删除,接着详细介绍LevelDB中的公用基础类,包括文件操作、数值编码、内存管理等。掌握这些基础之后,开始分模块介绍LevelDB的实现,包括Log模块、MemTable模块以及SSTable模块,最后介绍LevelDB中层级的原理以及如何管理各个层级。
通过阅读本书,读者会对很多问题有更加深入的了解,例如:
- 如何实现快照读取;
- Redo Log(重做日志)如何设计;
- LevelDB为何会分多个层级;
- LSM树到底是什么,为何该数据结构适用于写多读少的场景。
许多底层知识其实是相通的,我们常用的关系型数据库MySQL也有重做日志,也有快照读取。
LevelDB中的SSTable在各种存储引擎中得到了广泛的应用,包括HBase、Cassandra等。LevelDB中的布隆过滤器、归并排序以及LRU Cache等结构更是大量应用于各种场景。
学习LevelDB,不仅能了解如何设计高性能键-值存储,还能加深对数据库实现的整体认知,同时对各种数据结构的实现和使用场景有更加直观的了解。
读者对象
- 数据库从业人员
- 应用开发人员
- 计算机相关专业学生
- 对数据库技术感兴趣的人员
如何阅读本书
本书从逻辑上分为两大部分。
第一部分着重讲解LevelDB的基础知识。
第1章介绍LevelDB的诞生、特性及其衍生产品。
第2章介绍LevelDB的基本数据结构,了解这些基本数据结构有助于对后续知识的理解。阅读本章,也可以加深对比较器、迭代器等常见数据结构的理解。
第3章介绍LevelDB的基本使用,包括数据库打开、关闭以及基本的读写操作。
第4章介绍LevelDB的总体架构与设计思想,通过本章可以了解LevelDB的模块组成。
第5章介绍LevelDB的公用基础类,帮助读者了解在LevelDB中如何实现数值编码、内存管理以及文件读取等。
第二部分着重讲解LevelDB各模块的实现细节。
第6章介绍LevelDB中Log模块的实现细节,以及如何从Log文件恢复并生成一个MemTable。
第7章介绍LevelDB中MemTable模块的实现细节,以及MemTable超过内存阈值时如何生成一个SSTable。
第8章介绍LevelDB中SSTable模块的实现细节。
第9章介绍LevelDB中的Compaction原理与多版本管理。
附录简要介绍RocksDB对LevelDB的优化。
通过阅读本书,不只可以熟悉LevelDB的底层原理,还可以加深对整个数据库实现的了解。
勘误和支持
由于笔者水平有限,编写时间仓促,书中难免会出现错误或者不准确的地方,恳请读者批评指正。如果你有更多的宝贵意见,可以通过https://github.com/erpeng联系笔者,期待能够得到你们的真挚反馈,在技术之路上互勉共进。
致谢
感谢本书的合作者——环宇,因为你,才有了这本书的诞生。
感谢伟大的开源运动促进了计算机行业的蓬勃发展。
感谢Jeff Dean与Sanjay Ghemawat创造了LevelDB。
特别致谢
最后,我要特别感谢我的父母、妻子与女儿,为写作这本书,我牺牲了很多陪伴他们的时间。同时因为他们的鼓励与支持,我才能坚持写下去。
感谢高婧雅编辑,得益于她的专业与耐心审稿,才进一步提升了本书的质量。
谨以此书献给热爱计算机行业的朋友们!
张仕华