分布式数据库系统是大多数企业和绝大多数应用程序不可或缺的一部分。这些应用程序提供业务逻辑和用户界面,而数据库系统则负责确保数据的完整性、一致性和冗余性。
回到2000年,那时如果你要选择一个数据库,则只有少数几个选项,而且其中大部分都属于关系型数据库,因此它们之间的差异相对较小。当然,这并不是说所有数据库都是完全相同的,只是它们的功能和使用场景都非常相似。
其中一些数据库专注于水平扩展(scale out),即通过运行多个数据库实例(表现得像是一个单一逻辑单元)来提高性能并增加容量,例如:Gamma数据库机器项目、Teradata、Greenplum、Parallel DB2等。如今,水平扩展仍然是客户期望的最重要的数据库特性之一,云服务的日益普及诠释了这一点。相较于将数据库迁移至更大型、功能更强大的计算机进行垂直扩展(scale up),启动一个新实例并将其添加到集群中通常要容易得多。因为迁移可能会耗时冗长且令人痛苦不堪,还可能会导致停机。
在2010年左右,一类新型的最终一致性数据库开始逐步涌现,并且一些诸如NoSQL、大数据等术语也日益流行。在过去的15年间,开源社区、大型互联网公司和数据库供应商构建了众多的数据库和工具,以至于当人们在试图理解它们的使用场景、细节和规范时很容易迷失方向。
Amazon团队于2007年发布的Dynamo论文[DECANDIA07]对数据库社区产生了相当巨大的影响,在短时间内它便激发出了许多变体和实现。其中最突出的是诞生于Facebook的Apache Cassandra、LinkedIn研发的Voldemort,以及由前Akamai工程师研发的Riak。
如今,该领域再次发生了变化:在键值存储、NoSQL和最终一致性数据库之后,我们开始看到一些可扩展性更强、性能更高的数据库,它们能够在保证具有更强一致性的同时执行复杂的查询。
本书的受众
在技术会议的交流中,我经常听到同样的问题:“如何更多地了解有关数据库内部的原理?我甚至不知道从哪里开始。”关于数据库系统的大多数书籍都没有详细介绍存储引擎的实现,并且只是在较高的层次上介绍了访问方法,例如B树。很少有书籍涵盖较新的概念,例如不同的B树变体和日志结构存储(log-structured storage),因此我通常建议直接阅读论文。
但是每个读过论文的人都知道这并不容易:时常缺乏上下文,措辞可能含糊不清,论文之间甚至几乎根本没有联系,论文本身也不容易找到。本书简要总结了重要的数据库系统概念,并可以为希望深入研究的人们提供指南,也可以为已经熟悉这些概念的人们提供备忘单。
并非每个人都希望成为数据库开发者,但是本书也将为使用数据库系统构建软件的人员提供帮助,如:软件开发者、运维工程师、架构师和工程技术经理。
如果你的公司依赖于任何基础架构组件,无论是数据库、消息队列、容器平台还是任务调度器,你都必须通过阅读项目变更日志(change-log)和邮件列表来与社区保持联系、同步项目的最新进展。理解术语并了解其中的工作原理将使你能够从这些信息来源中获取更多信息,并可以更高效地使用工具来进行故障诊断,识别和避免潜在的风险与瓶颈。如果系统出现了某些问题,那么对数据库系统的工作原理有一个全面和基本的了解将会对你有所帮助。利用这些知识,在面对问题时,你将有能力提出假设、进行验证、找到根本原因,并将其讲解给其他项目成员。
本书也适合那些具备好奇心的人:喜欢学习一些不急用的知识的人,将空闲时间花在捣鼓一些有趣事情上的人。他们有的自己编写编译器,有的编写自用的操作系统、文本编辑器、电脑游戏,有的学习编程语言—他们乐于获取新知识。
本书假设读者具有一些开发后端系统和以用户身份使用数据库系统的经验。同时,具备一些不同种类数据结构的知识将有助于更快地吸收书中的知识。
为什么应该阅读本书
我们经常听到人们用他们实现的概念和算法来描述数据库系统:“该数据库使用Gossip来进行成员资格的传播”(参见第12章)、“他们已经实现了Dynamo”或“这就像他们在Spanner论文中描述的一样”(参见第13章)。抑或,如果你正在讨论算法和数据结构,那么你会听到类似于“ZAB和Raft有很多共同点”(参见第14章)、“Bw树就像是在日志结构化存储上实现的B树一样”(参见第6章)或“它们使用的是类似于Blink树中的同级指针”(参见第5章)的描述。
我们需要使用抽象来讨论复杂的概念,但是我们不能在每次开启一场对话时都讨论抽象术语。以白话的形式来掌握这些抽象概念是一个捷径,这能帮助我们将注意力转移到其他更高层次的问题上。
学习基本概念、证明和算法的一个优点是它们永不过时。当然,总会有新的东西出现,但是新算法往往是在发现经典算法的缺陷或改进空间之后才被创造出来的。了解历史有助于更好地理解这些算法之间的差异和它们的发明动机。
学习这些内容是鼓舞人心的。你将看到各种各样的算法,了解我们的工业界是如何一个接一个地解决问题的,并开始欣赏数据系统。同时,学习这些是有回报的:你几乎可以感觉到多个拼图碎片在脑海中移动到一起,最终形成一幅完整的图画,并且你将总是能够与他人分享这幅图画。
本书的范畴
本书既不是关于关系型数据库的书,也不是关于NoSQL的书,而是关于在各种数据库系统中使用的算法和概念的书,且重点是存储引擎和负责数据分布的组件。
诸如查询计划、查询优化、调度、关系模型等概念,在一些优秀的数据库系统教科书中已均有涉及。这些概念中的一部分通常是从用户的角度进行描述的,而本书则着重于内部结构。你可以在第二部分的总结和每章的小结中找到一些有用文献的推荐。这些文献应该能回答很多与数据库相关的问题。
由于本书中提到的数据库系统之间没有一种通用的查询语言,所以本书将不讨论查询语言。
为了收集本书的材料,我研究了15本书、300多篇论文、无数的博客文章、源代码以及几个开源数据库的文档。对于是否要在书中包含某个特定概念的原则,我常常会问自己这样一个问题:“数据库工业界和学术界的人都在谈论这个概念吗?”如果答案是“是”,我便会将该概念添加到一个长长的讨论清单里。
本书的结构
市面上有一些支持可插拔组件的可扩展数据库的例子(例如[SCHWARZ86]),但它们较为少见。与此同时,数据库使用可插拔存储的例子却颇多。类似地,我们很少听到数据库供应商谈论查询的执行,但他们却非常热衷于讨论其数据库是如何保证一致性的。
数据库系统之间最显著的区别集中在两个方面:如何存储和分布数据(其他子系统有时也很重要,但这里不作介绍)。本书分为两部分,讨论了负责数据存储(第一部分)和数据分布(第二部分)的子系统和组件。
第一部分讨论节点本地的进程,并关注存储引擎,它是数据库系统的核心组件以及最重要的一个特有元素。首先,我们从数据库管理系统的架构开始介绍,并提出几种基于主存介质和布局来对数据库系统进行分类的方法。随后,我们将介绍存储结构,并学习基于磁盘的存储结构与基于内存的存储结构之间的区别。然后介绍B树以及在磁盘上高效维护B树结构的算法,包括序列化、页布局以及磁盘存储形式。再之后,我们会讨论B树的一些变体,以说明上述概念的作用以及受B树所影响和启发的数据结构的多样性。最后,我们将讨论日志结构存储的几种变体(它们通常用于实现文件和存储系统),并介绍日志结构存储的起源以及使用它们的原因。
第二部分介绍如何将多个节点组织到一个数据库集群中。我们从构建具备容错性的分布式系统理论开始,进而讨论分布式系统与单节点应用程序有何不同,以及我们在分布式环境中面临的问题、约束和复杂性。之后,我们将深入研究分布式算法。其中,我们从故障检测算法入手,这些算法通过检测和报告故障并排除故障节点的方式来提高系统整体的性能和稳定性。由于本书稍后讨论的许多算法都依赖于集群领导权这个概念,所以我们将介绍几种领导者选举算法,并讨论它们的使用范围。分布式系统中最困难的事情之一就是要保证数据一致性,因此我们将讨论复制的概念,紧接着讨论一致性模型、副本之间可能存在的差异以及最终一致性。由于最终一致性系统有时会依赖于反熵进行收敛,并依靠Gossip来进行数据分发,所以我们会讨论几种反熵和Gossip方法。最后,我们讨论数据库事务上下文中的逻辑一致性,并以共识算法结尾。
如果没有书中提到的这些研究和出版物,我是不可能完成本书的。在本书中,方括号代表参考文献的索引,例如[DECANDIA07]。你可以使用这些参考资料来更详细地了解有关概念。
在每章最后的小结中都包含与该章内容相关的进一步研究的材料。
本书约定
本书使用了下述约定。
楷体
表示新术语。
斜体(Italic)
表示URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中引用的程序元素,例如变量或函数名、数据库、数据类型、环境变量、语句和关键词。
这个图标表示提示或建议。
这个图标表示一般性说明。
这个图标表示警告或提醒。
示例代码
写作本书的目的是帮助你完成工作,而书中的示例代码则是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O扲eilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O扲eilly的配套CD-ROM则需要获得许可。引用本书的示例代码来回答一个问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中则需要获得许可。
我们希望(但不强制)读者在使用本书代码时注明出处。出处的形式包含标题、作者、出版社和ISBN,例如:
Database Internals,作者Alex Petrov,由O扲eilly出版,书号978-1-492-04034-7
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permission@oreilly.com联系我们。
O'Reilly在线学习平台(O'Reilly Online Learning)
近40年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O扲eilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O扲eilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
联系方式
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
本书配套网站(http://bit.ly/database-internals)列出了勘误表、示例以及其他信息。
要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。
关于书籍、课程、会议和新闻的更多信息,请访问我们的网站:
http://www.oreilly.com
http://www.oreilly.com.cn
我们在Facebook上的地址:http://facebook.com/oreilly
我们在Twitter上的地址:http://twitter.com/oreillymedia
我们在YouTube上的地址:http://www.youtube.com/oreillymedia
致谢
如果没有数以百计的人辛勤撰写相关研究论文和书籍,本书就不可能出版。这些论文和书籍是分布式数据系统思想的源泉,亦是这些思想的参考物,更是本书的参考来源。
我想对所有审阅本书手稿并提供反馈的人表示谢意,是你们确保了书中内容与措辞的正确性:Dmitry Alimov、Peter Alvaro、Carlos Baquero、Jason Brown、Blake Eggleston、Marcus Eriksson、Francisco Fernández Casta、Joel Knighton、Eugene Lazin、Nate McCall、Christopher Meiklejohn、Tyler Neely、Maxim Neverov、Marina Petrova、Stefan Podkowinski、Edward Ribiero、Denis Rytsov、Kir Shatrov、Alex Sorokoumov、Massimiliano Tomassi及Ariel Weisberg。
当然,如果没有家人的支持,本书是不可能完成的,感谢我的妻子Marina和我的女儿Alexandra。这一路走来的每一步,她们都一直在支持我。
h***y 2020-05-30 09:58:43
很好的书,看英文PDF是就觉得不错,解答了我不少疑惑。