本书大标题是“数据库系统内幕”,其实还有个小标题没有翻译:
A Deep Dive into How Distributed Data Systems Work
简单翻译就是“分布式数据系统运行原理”。
所以本书的主要内容是数据库 + 分布式系统。
第一部分
第一部分主要介绍数据库的存储引擎,其中主要涉及两个数据结构:
- B 树(包括 B 树、B+ 树以及其他变体)
- LSM 树
这二者的区别在于 B 树是可变的存储结构,在修改时直接操作磁盘上的原纪录,而 LSM 可以作为不可变存储结构,仅支持追加存储。
我们知道 B 树是 MySQL InnoDB 存储引擎所采用的数据结构,本书几乎前三分之一的内容都在介绍 B 树相关内容,包括原理、实现、使用等,对于可变性,重点介绍了节点的分裂与合并、页布局,即如何编码数据、组织数据等。
对于 LSM 树,首先介绍其结构,一般包括两部分:内存表(MemTable)、磁盘表(SSTable),其中磁盘方面考虑到后期读时的优化,又可以再加一个压实(Compaction)的表。然后提到不可变结构面临的共通问题:
- 读放大:为了检索数据而读取多个表
- 写放大:压实过程带来额外的写
- 空间放大:一条记录可能同时出现在多层
最后介绍 LSM 的一些实现细节,包括布隆过滤器,采用跳表作为内存表的存储结构等。
第二部分
这一部分的内容最让我感到混乱,明明领导者的选举依赖于共识算法,但是却在第 10 章介绍选举,而在最后一章(第 14 章)才讲共识。并且把同样介绍分布式系统中的故障问题,拆成了两个章节,一个是第 9 章的故障检测,另一个是第 12 章的反觞。
此外主要介绍了分布式系统中的一致性概念,这部分的内容可圈可点,其中提到了各种一致性模型,包括:
- 严格一致性
- 可线性化
- 顺序一致性
- 因果一致性
另外重点介绍了分布式事务相关内容,其中还点到了国产开源数据库 TiDB(值得国人傲娇一下),本节内容对于 Spanner 等分布式数据库提供了一定帮助。
总结
看完本书的总体感觉是:整体思路混乱,部分章节可取。
先说说缺点吧:
- 名为数据库系统,却只说存储,不讲计算。
- 思路混乱,没有过渡感,为什么有了 B 树,还要 LSM 树?从存储引擎到分布式系统的过渡太生硬,两部分的内容很难结合起来,其实我觉得可以增加一张来介绍分布式存储,这样会让整本书更有层次感。
- 部分数据结构与算法讲得太细,却很少提及为什么选择它们的原因,以及与其他方式的对比。
当然优点也有,最重要的恐怕就在于介绍分布式系统底层技术的书籍太少,这本书填补了一些空白,同时提到了一些分布式系统的通用问题,有利于我们站在更高的角度来面对实际生产中的一些问题,比如一致性模型等。
总的来说,还是值得一读。
番外
关于分布式系统,这里推荐一个知乎专栏【分布式系统之美】,目前由 PingCap 的几位大佬维护。另外有三篇文章分别从存储、计算、调度的角度谈 TiDB(关键字:三篇文章了解 TiDB 技术内幕),特别推荐一读!
本文首发于公众号“数据Man”,欢迎关注!