具体描述
本书旨在指导开发者理解现代数据库和存储引擎背后的内部概念,包含从众多书籍、论文、博客和多个开源数据库源代码中精心选取的相关材料。本书深入介绍了数据存储、数据构建块、分布式系统和数据集群,并且指出了现代数据库之间最重要的区别在于决定存储结构和数据分布的子系统。本书分为两部分:第一部分讨论节点本地的进程,并关注数据库系统的核心组件——存储引擎,以及最重要的一个特有元素;第二部分探讨如何将多个节点组织到一个数据库集群中。本书主要面向数据库开发人员,以及使用数据库系统构建软件的人员,如软件开发人员、运维工程师、架构师和工程技术经理。
适读人群 :
数据库系统工程师、开发工程师、运维工程师、存储工程师及其他相关从业人员
本书从数据库开发者角度,对现代数据库技术进行了全景式解读,完全不拘泥于任何一款数据库系统,也不偏袒任何一种数据库的类型或特性。这本书只会讨论现代数据库必不可少的那些东西,例如存储格式、索引数据结构、数据一致性等,以及相关的许多选项与权衡。第一部分从单机的角度,介绍磁盘存储格式、索引数据结构、事务处理等,第二部分则以分布式系统切入,讲解分布式数据库的多副本、分布式事务、一致性等问题。书中内容的选材紧跟业内前沿进展,不仅有提及各种新兴的数据库产品,还有涉及许多来自学术界前沿的研究成果。不论你是一名有志于从事云计算领域的开发者,深入的研究数据库系统的设计与实现,还是作为一名开发者,即将使用云数据库以及云原生数据库,阅读本书都会大有裨益。
作者简介
作者简介
Alex Petrov是一位数据基础架构工程师,数据库和存储系统的狂热爱好者,Apache Cassandra 提交者和PMC成员,精通存储、分布式系统和算法。
译者简介
黄鹏程 毕业于北京邮电大学,过去八年一直专注于数据库和大数据平台研发与架构工作。毕业后就职于中国民生银行,历任软件工程师及大数据基础架构团队负责人,目前为阿里云高级产品专家,负责阿里云数据库相关产品的设计与规划工作。你可以通过搜索“gnuhpc”在LinkedIn或者微信上找到他。
傅宇 毕业于南京大学计算机系,专注于数据库技术,现任阿里云技术专家,担任 PolarDB-X 分布式关系型数据库内核研发工作,在分布式事务、查询优化器、执行器等方向略有经验,对数据库和大数据领域充满热情。个人博客:https://ericfu.me,知乎账号 Eric Fu,欢迎与我交流!
张晨 毕业于上海交通大学。大数据、数据库、分布式系统和函数式编程爱好者。现于Indeed东京担任软件工程师一职。你可以通过 我的个人主页chasezhang.me了解更多信息。
目录信息
第一部分 存储引擎
第1章 简介与概述 13
1.1 数据库架构 14
1.2 内存数据库与磁盘数据库 16
1.3 面向列与面向行的数据库 17
1.3.1 面向行的数据布局 18
1.3.2 面向列的数据布局 19
1.3.3 区别与优化 20
1.3.4 宽列式存储 20
1.4 数据文件和索引文件 21
1.4.1 数据文件 22
1.4.2 索引文件 23
1.4.3 间接的主索引 24
1.5 缓冲、不可变性和有序性 25
1.6 本章小结 26
第2章 B树基础知识 28
2.1 二分搜索树 28
2.1.1 树的平衡 29
2.1.2 基于磁盘存储的树 31
2.2 基于磁盘的结构 32
2.2.1 机械硬盘 32
2.2.2 固态硬盘 32
2.2.3 磁盘存储结构 34
2.3 无处不在的B树 35
2.3.1 B树的层次结构 36
2.3.2 分隔键 38
2.3.3 B树查找复杂度 39
2.3.4 B树查找算法 39
2.3.5 键的数目 40
2.3.6 B树的节点分裂 40
2.3.7 B树的节点合并 42
2.4 本章小结 43
第3章 文件格式 45
3.1 动机 45
3.2 二进制编码 46
3.2.1 原始类型 46
3.2.2 字符串和变长数据 48
3.2.3 按位打包的数据:布尔值、枚举值和标志 48
3.3 通用原理 49
3.4 页的结构 51
3.5 分槽页 51
3.6 单元格布局 53
3.7 将单元格放进分槽页 54
3.8 管理变长数据 55
3.9 版本 56
3.10 校验和 57
3.11 本章小结 58
第4章 B树的实现 59
4.1 页头 59
4.1.1 魔数 59
4.1.2 同级指针 60
4.1.3 最右指针 60
4.1.4 节点的高键 61
4.1.5 溢出页 62
4.2 二分搜索 64
4.3 传播分裂与合并 65
4.4 再平衡 67
4.5 仅在右侧追加 68
4.6 压缩 69
4.7 清扫与维护 70
4.7.1 更新和删除导致的碎片 70
4.7.2 页的碎片整理 71
4.8 本章小结 72
第5章 事务处理与恢复 74
5.1 缓冲区管理 75
5.1.1 缓存语义 77
5.1.2 缓存回收 77
5.1.3 在缓存中锁定页 78
5.1.4 页置换 79
5.2 恢复 82
5.2.1 日志语义 83
5.2.2 操作日志与数据日志 84
5.2.3 steal和force策略 84
5.2.4 ARIES 85
5.3 并发控制 86
5.3.1 可串行化 86
5.3.2 事务隔离 87
5.3.3 读异常和写异常 88
5.3.4 隔离级别 88
5.3.5 乐观并发控制 90
5.3.6 多版本并发控制 91
5.3.7 悲观并发控制 91
5.3.8 基于锁的并发控制 91
5.4 本章小结 98
第6章 B树的变体 101
6.1 写时复制 101
6.2 抽象节点更新 103
6.3 惰性B树 103
6.3.1 WiredTiger 104
6.3.2 惰性自适应树 105
6.4 FD树 106
6.4.1 分段级联 106
6.4.2 对数级的有序段 108
6.5 Bw树 108
6.5.1 更新链 109
6.5.2 用CAS控制并发 109
6.5.3 结构修改操作 110
6.5.4 合并和垃圾收集 111
6.6 缓存无关B树 112
6.7 本章小结 114
第7章 日志结构存储 116
7.1 LSM树 117
7.1.1 LSM树的结构 118
7.1.2 更新与删除 122
7.1.3 LSM树的查找 123
7.1.4 合并迭代 124
7.1.5 协调 126
7.1.6 LSM树的维护 126
7.2 读写放大与空间放大 129
7.3 实现细节 130
7.3.1 有序字符串表 130
7.3.2 布隆过滤器 132
7.3.3 跳表 133
7.3.4 磁盘访问 135
7.3.5 压缩 136
7.4 无序LSM存储 136
7.4.1 Bitcask 137
7.4.2 WiscKey 138
7.5 LSM树中的并发 139
7.6 日志堆叠 140
7.6.1 闪存转换层 141
7.6.2 文件系统日志记录 142
7.7 LLAMA与精心堆叠 144
7.8 本章小结 145
第一部分总结 147
第二部分 分布式系统
第8章 简介与概述 151
8.1 并发执行 151
8.2 分布式计算的误区 153
8.2.1 处理 154
8.2.2 时钟和时间 155
8.2.3 状态一致性 156
8.2.4 本地和远程执行 157
8.2.5 处理故障的需要 157
8.2.6 网络分区和部分故障 157
8.2.7 级联故障 158
8.3 分布式系统抽象 160
8.4 两将军问题 165
8.5 FLP不可能定理 166
8.6 系统同步性 167
8.7 故障模型 167
8.7.1 崩溃故障 168
8.7.2 遗漏故障 168
8.7.3 任意故障 169
8.7.4 故障处理 169
8.8 本章小结 169
第9章 故障检测 171
9.1 心跳和ping 172
9.1.1 无超时的故障检测器 173
9.1.2 外包心跳 174
9.2 phi增量故障检测器 175
9.3 Gossip和故障检测 175
9.4 反向故障检测 176
9.5 本章小结 177
第10章 领导者选举 179
10.1 霸道选举算法 180
10.2 依次故障转移 181
10.3 候选节点/普通节点优化 182
10.4 邀请算法 183
10.5 环算法 184
10.6 本章小结 185
第11章 复制和一致性 187
11.1 实现可用性 188
11.2 臭名昭著的CAP理论 188
11.2.1 小心使用CAP 189
11.2.2 收成与产量 190
11.3 共享内存 191
11.4 顺序 192
11.5 一致性模型 193
11.5.1 严格一致性 194
11.5.2 可线性化 194
11.5.3 顺序一致性 198
11.5.4 因果一致性 199
11.6 会话模型 202
11.7 最终一致性 204
11.8 可调一致性 204
11.9 见证者副本 206
11.10 强最终一致性和CRDT 207
11.11 本章小结 209
第12章 反熵和传播 212
12.1 读修复 213
12.2 摘要读 214
12.3 提示移交 215
12.4 Merkle树 215
12.5 位图版本向量 216
12.6 Gossip传播 218
12.6.1 Gossip技术细节 219
12.6.2 覆盖网络 219
12.6.3 混合Gossip 220
12.6.4 局部视图 221
12.7 本章小结 222
第13章 分布式事务 224
13.1 多个操作的原子性 225
13.2 两阶段提交 226
13.2.1 2PC中的参与者故障 227
13.2.2 2PC中的协调者故障 228
13.3 三阶段提交 229
13.4 Calvin分布式事务 231
13.5 Spanner分布式事务 233
13.6 数据库分区 235
13.7 Percolator分布式事务 236
13.8 协调避免 238
13.9 本章小结 240
第14章 共识 243
14.1 广播 244
14.2 原子广播 245
14.2.1 虚同步 245
14.2.2 Zookeeper原子广播 246
14.3 Paxos 248
14.3.1 Paxos算法 249
14.3.2 Paxos的Quorum 250
14.3.3 故障场景 251
14.3.4 Multi-Paxos 253
14.3.5 快速Paxos 254
14.3.6 平等Paxos 255
14.3.7 柔性Paxos 257
14.3.8 共识的推广解法 259
14.4 Raft 261
14.4.1 Raft中的领导者角色 263
14.4.2 故障场景 264
14.5 拜占庭共识 266
14.5.1 PBFT算法 266
14.5.2 恢复和检查点 268
14.6 本章小结 269
第二部分总结 272
参考文献 275
· · · · · · (收起)
读后感
用户评价
《数据库系统内幕》这本书,对于理解“数据库的部署和运维”,就像是为我揭示了一幅“大型基建工程”的蓝图。我过去一直以为,数据库就是一个安装好的软件,然后就可以使用了。但这本书则让我看到,一个稳定、高效的数据库系统,背后需要多么精心的“规划”和“维护”。 书中对服务器硬件配置、操作系统优化、网络环境的考量,以及如何进行“高可用性”和“灾难恢复”的部署,都让我大开眼界。我尤其欣赏书中对“性能监控”和“故障排除”的详细介绍,这就像是让我在成为一名“建筑师”的同时,也成为了一名“工程师”,能够识别潜在的问题,并找到解决之道。我明白了,数据库的稳定运行,是一个持续的“健康管理”过程。
这本书就像一把钥匙,为我打开了数据库的宏伟殿堂,让我从一个对数据存储和管理一窍不通的门外汉,蜕变成一个能够理解其背后运行机制的“内行”。最初接触数据库,我只知道它能存东西,能查东西,就像一个巨大的抽屉,把信息一股脑地塞进去,再随手一拉就能找到。但《数据库系统内幕》这本书,彻底颠覆了我的认知。它没有停留在表面,而是像剥洋葱一样,一层一层地揭开了数据库的神秘面纱。 我至今仍清晰地记得,书中对存储引擎的详尽阐述,简直是给我上了一堂生动形象的“数据栖息地”科普课。它不是简单地告诉你“有B-Tree,有Hash”,而是深入剖析了这些结构的设计哲学,以及它们如何在不同的场景下做出最优选择。比如,B-Tree如何通过保持树的高度平衡来确保查询效率,以及它在处理范围查询时的天然优势;而Hash索引则如何在点查询上展现出闪电般的速度。书中甚至还探讨了这些索引结构在磁盘I/O方面的优化,以及如何通过预读、缓存等技术进一步提升性能。对我来说,这就像是在学习建筑学,不再仅仅满足于知道“房子有墙有屋顶”,而是开始理解“承重墙如何受力”,“屋顶如何排水”,甚至是“地基如何打才能最稳固”。
随着阅读的深入,我开始意识到,数据库不仅仅是数据的容器,更是一个精密的“决策者”。这本书的章节,特别是关于查询优化器的部分,让我对“智能”这个词有了全新的理解。我过去习惯性地认为,编写SQL语句越“聪明”,数据库跑得越快,就像我以前觉得写复杂的代码逻辑就能让程序高效一样。但《数据库系统内幕》让我明白了,真正让数据库“聪明”起来的,是它内部的那套复杂的查询优化器。 书中细致地讲解了查询优化器如何分析SQL语句,如何评估不同执行计划的成本,以及如何根据统计信息做出“最佳”选择。这种“最佳”,不是基于我的直觉,而是基于对数据分布、索引情况、硬件性能等多种因素的综合考量。我印象特别深刻的是,书中描述了查询优化器如何进行“代价估算”,就像一个经验丰富的厨师,在准备一道菜之前,会仔细权衡各种食材的用量、烹饪时间和火候,以达到最佳的口感。而我作为读者,就像一个好奇的学徒,在一旁观摩学习,逐渐领悟到 SQL 语句的背后,隐藏着如此庞大的计算和决策过程。
这本书对于理解“数据库的安全性”,简直是将一个“堡垒的建造史”呈现在我眼前。我之前以为,只要设置一个密码,数据库就“安全”了。然而,《数据库系统内幕》则让我看到了,真正的安全,是一个多层次、立体化的防御体系。 书中对权限管理、用户认证、加密传输等方面的深入探讨,让我明白了,保护数据,不仅仅是设置一道门,更是要部署一层层的“哨兵”和“监视器”。我印象深刻的是,书中对于“SQL注入”等攻击方式的分析,让我看到了黑客是如何利用数据库的“漏洞”来作恶,同时也让我明白了,数据库开发者是如何通过代码上的“谨慎”和“验证”,来构筑一道道坚实的防线。这就像是在建造一座城堡,不仅要有坚固的城墙,还要有训练有素的士兵,以及严密的巡逻制度。
这本书对于理解“数据库的未来发展趋势”,简直是一场“思想的盛宴”,让我看到了数据世界的无限可能。我之前可能还停留在关系型数据库的思维定势中,但《数据库系统内幕》则为我打开了新世界的大门。 书中对NoSQL数据库的介绍,以及它们如何在特定的场景下,比传统关系型数据库展现出更强的优势,让我看到了“多样性”的魅力。无论是键值存储、文档数据库,还是图数据库,每一种都有其独特的“语言”和“逻辑”,能够解决不同类型的问题。这就像是,我认识到,世界上不仅仅只有一种“工具”,而是在不同的“场合”,需要使用不同的“利器”。
事务管理,这个词听起来似乎有些枯燥,但《数据库系统内幕》却把它描绘得惊心动魄,充满了“权衡”与“博弈”。我之前一直认为,只要能保证数据的一致性就万事大吉了,但这本书让我见识到了,在并发访问的世界里,保持一致性是多么的“不容易”。 书中对ACID(原子性、一致性、隔离性、持久性)特性的深入剖析,让我明白了为什么每一个字母都如此重要。特别是“隔离性”这一章节,让我对MVCC(多版本并发控制)有了全新的认识。它不再是书本上一个简单的定义,而是通过生动的例子,揭示了MVCC是如何在不阻塞读写操作的情况下,为并发事务提供不同版本的数据视图,从而避免了“脏读”、“不可重复读”、“幻读”等问题的发生。这就像是在一个繁忙的集市上,每个人都在自己的摊位上忙碌,但又不会完全互相干扰,每个人都能看到自己需要的商品,而不是被别人的交易搞得一团糟。
这本书对于理解数据库的“容错”机制,简直是一场视觉盛宴,或者说是“数据守护神”的史诗。在我的认知里,数据库一旦损坏,数据就等于“报废”,只能祈祷备份的及时和完整。但《数据库系统内幕》则让我看到了,数据库系统是如何在一个充满不确定性的世界里,努力地“自救”和“修复”。 书中对日志(WAL - Write-Ahead Logging)的讲解,对我来说,就像是学习“时间旅行”的秘诀。我明白了,每一次对数据的修改,都会被记录在一个“流水账”上,而这个流水账,比数据本身更加“可靠”。当系统出现崩溃时,这个流水账就成了“救命稻草”,可以根据记录的顺序,一步一步地“回溯”到崩溃前的状态,或者“重演”丢失的操作,从而保证数据的最终一致性。这就像是侦探通过现场的蛛丝马迹,还原事件的真相,只不过这里的“证据”是数据库的日志。
让我印象最深刻的,莫过于书中关于“并发控制”的章节,它彻底刷新了我对“和谐共处”的理解。我一直以为,当多个用户同时访问同一个数据库时,要么互相等待,要么出现混乱,直到其中一个完成。然而,《数据库系统内幕》则巧妙地揭示了数据库系统是如何通过一系列精妙的机制,来实现“井然有序”的并发访问。 书中对各种锁机制的讲解,从悲观锁的“先下手为强”到乐观锁的“相信大家都不会捣乱”,再到MVCC的“多版本并行控制”,每一个都让我拍案叫绝。我尤其喜欢书中对MVCC的描绘,它不是简单地介绍技术,而是通过比喻,将复杂的概念具象化。想象一下,一个图书馆,里面的书被很多人同时借阅,但图书馆管理员却能巧妙地为每个人提供不同版本的书籍,或者在需要时,让他们看到不同时间点的书籍状态。这种“不打扰”的艺术,让我对数据库的设计者充满了敬意。
阅读《数据库系统内幕》,对我而言,最深远的改变,在于它培养了我一种“刨根问底”的思维方式。我不再满足于仅仅知道“是什么”,而是渴望理解“为什么”和“怎么样”。 这本书的每一章,都像是对我提出的一个又一个疑问的解答。它让我从一个被动的使用者,变成了一个主动的探索者。我开始学会去思考,为什么某个查询会慢,为什么某个配置会影响性能,以及如何才能让数据库系统跑得更“聪明”。这种思维方式的转变,不仅仅局限于数据库领域,更延伸到了我解决其他技术问题时,都能从中汲取灵感,让我受益匪浅。
谈到数据库的“网络通信”,这本书简直就是将一个“看不见的战场”展现在我面前。我过去只知道,客户端发送SQL语句,服务器返回结果,就像是简单的“你问我答”。但《数据库系统内幕》则让我看到了,在这简单的交互背后,隐藏着多么复杂的“协议”和“策略”。 书中对客户端/服务器架构的剖析,让我明白了,每一次请求,都经历了一场“信息传递的马拉松”。从网络协议的选择,到数据包的序列化和反序列化,再到连接池的管理,每一个环节都充满了“效率”和“可靠性”的考量。我特别欣赏书中对数据传输过程中如何处理错误和重试的讲解,这就像是为远方的朋友寄送包裹,即使中间有风雨,也要确保包裹最终能够安全送达。
何时出电子书?
通用的,非针对MySQL的各项技术、原理的介绍,比较详细的图文讲解,代码抽象成这种形式挺好的,深度也有。书里面有很多其他MySQL书没有介绍过的独到知识,而且整本书也不厚,读起来很有意思
这本书站在现代视角重新审视整个数据库领域,对各个数据库系统的共通点进行了梳理,英文版就好评如潮,中文版终于上市了。
第一部分存储引擎整体组织还是很不错的,对于建立尤其数据库存储引擎实现梗概很有帮助;第二部分分布式系统尤其协议部分,可能受限于中文翻译,理解略有不足,可能DDIA的组织结构和讲解更好。
通用的,非针对MySQL的各项技术、原理的介绍,比较详细的图文讲解,代码抽象成这种形式挺好的,深度也有。书里面有很多其他MySQL书没有介绍过的独到知识,而且整本书也不厚,读起来很有意思