分布式系统与一致性
  • 推荐0
  • 收藏1
  • 浏览241

分布式系统与一致性

陈东明 (作者) 

  • 书  号:978-7-121-41041-3
  • 出版日期:2021-05-26
  • 页  数:252
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:张春雨
纸质版 ¥79.00
一致性是非常重要的分布式技术。众所周知,分布式系统有很多特性,如可用性、可靠性等,这些特性多多少少会与一致性产生关系,受到一致性的影响。要全面研究、掌握分布式技术,一致性是绕不开的一个话题,也是最难解决的一个问题。本书主要介绍GFS、HDFS、BigTable、MongoDB、RabbitMQ、ZooKeeper、Spanner、CockroachDB系统与一致性有关的实现细节,以及非常重要的Paxos、Raft、Zab分布式算法;本书还介绍了事务一致性与隔离级别、顺序一致性、线性一致性与强一致性相关内容,以及架构设计中的权衡等。
从分布式技术的角度来说,本书讲解了分布式领域比较高阶的内容,但是从分布式一致性的角度来说,本书仍然是一致性的入门书。

高并发高可用系统实战||||复杂系统核心特性精解
前 言
我对一致性的研究起源于一段负责基础架构的工作经历,当时负责公司的ZooKeeper事宜,所以对ZooKeeper进行了比较深入的研究。我在阅读ZooKeeper的官方文档和与ZooKeeper相关的论文时,看到了顺序一致性和线性一致性。在此之前的工作中,我凭借多年的工作经验,每当遇到陌生的概念时,基本上都可以望文生义,很快就能体会到其中的含义。但顺序一致性和线性一致性却成了我的反例,很长时间都没有搞清楚其含义。在此之后,我在负责公司自研的一个key-value数据库时,参考了Google公司的Spanner系统,在深入研究Spanner系统时,发现该系统中也存在线性一致性的概念。所以我开始系统地研究顺序一致性和线性一致性,从而进入分布式系统一致性的领域。
在研究过程中我发现,行业内还没有一本能够理论联系实际、系统化讲解分布式系统一致性的著作。当前讲系统一致性的文献往往专注于理论的定义,而分布式系统的官方文档和相关著作对一致性又往往都是简单地一笔带过。因此,我萌生了一个想法:写一本既有实际例证又有理论定义的一致性方面的书,也就是《分布式存储与一致性》这本书。本书讲解8个分布式系统,主要关注这些系统与一致性相关的实现,并对其中一些分布式系统中用到的关键的分布式算法做了详细的讲解,力争做到把分布式系统的一致性相关内容讲透。最后再介绍几个关于一致性的理论定义,并且结合前面的实例加以分析。
在实际的工作中,一致性往往没有受到重视,行业从业人员将更多的精力放在了可用性、性能等分布式系统的特性上。的确,从所带来的影响和出现的概率上讲,可用性和性能导致的问题更大一些。而一致性问题更隐蔽,出现的概率也比较小,并且往往能通过一些简单的手段解决掉,导致对一致性的要求不是那么强烈。甚至在某些应用场景下,一致性问题是用户可以接受的。
但是,一致性仍然是非常重要的分布式技术。众所周知,分布式系统有很多特性,如可用性、可靠性、性能等,这些特性多多少少会与一致性产生关系,受到一致性的影响。要全面研究、掌握分布式技术,一致性是绕不开的一个话题,也是最难解决的一个问题。
行业内部对一致性的讨论比较少,导致很多从业者对一致性的理解比较片面,这也是因为一致性其实是非常复杂、难懂的概念,甚至有些从业者对一致性以及一致性相关理论的理解有些偏差。本书力争对一致性给出一个全面的介绍。
本书仅仅讲解分布式系统的一致性的一部分内容,也是在实际的工作中可能遇到的内容,还有很大一部分本书没有涉及——本书仅讲解7种一致性模型,但笔者所知的一致性模型就有50多种。分布式领域专家对一致性进行的非常深入的研究,本书不能完全覆盖。此外,虽然本书讲解了Spanner、CockroachDB这样的分布式系统,但是对分布式系统领域与数据库领域的交汇点,也就是分布式数据库的讲解仍然不够全面,全面的讲解需要额外阐述数据库领域的很多内容,而这些内容并未包含在本书之中,读者需要另行查看其他相关资料。
本书主要面对有志进入分布式领域或者进入分布式领域不长时间的初学者。如果你是分布式领域的老手,已经读过或研究过各种分布式系统的经典著作和典型系统,那么本书讲解的内容可能都是你熟知的。但是本书仍然有一定的阅读要求,特别是对涉及数据库领域的相关内容,铺垫较少,有一定的阅读难度。从分布式技术的角度来说,本书讲解了分布式领域比较高阶的内容,但是从分布式一致性的角度来说,本书仍然是一致性的入门书籍。
本书中对重要的概念或者定义采用黑体书写,并且在可能的情况下,同时在概念后面的圆括号中给出其英文名称,方便读者以后在扩展阅读英文文献时可以准确地建立对应关系。在之后的内容中,如果这个概念在中文材料中已经被广泛接受并且使用,则会使用其中文名称;否则,为了不产生歧义,会使用其英文名称。
本书主要讲解的是计算机技术理论,这需要较长时间的沉淀和准备,而成书比较仓促,加之一致性是分布式系统的核心特性,涉及面又比较广阔,错误之处在所难免,希望各位读者给予指正。

目录

第1部分 开 篇
第1章 分布式系统的核心特性:一致性 2
1.1 拆分是解决大规模应用的本质 2
1.2 分布式技术是大规模应用的最后一个考验 4
1.3 一致性是这个考验的核心 6

第2部分 系统案例
第2章 Google的文件系统 8
2.1 GFS的外部接口和架构 8
2.1.1 GFS的外部接口 8
2.1.2 GFS的架构 9
2.2 GFS的写流程细节 11
2.2.1 名字空间管理和锁保护 11
2.2.2 租约 11
2.2.3 变更及变更次序 11
2.3 GFS的原子性 13
2.3.1 write和record append的区别 13
2.3.2 GFS中原子性的含义 14
2.3.3 GFS中多副本之间不具有原子性 15
2.4 GFS的松弛一致性 15
2.4.1 元数据的一致性 15
2.4.2 文件数据的一致性 15
2.4.3 适应GFS的松弛一致性 16
2.4.4 GFS的设计哲学 17
参考文献 18
第3章 开源的文件系统HDFS 19
3.1 HDFS的外部接口和架构 19
3.1.1 HDFS的外部接口 19
3.1.2 HDFS的架构 20
3.2 HDFS的写流程细节 21
3.2.1 打开文件 22
3.2.2 pipeline写入 22
3.2.3 上报block状态 24
3.2.4 关闭文件 24
3.2.5 DN定期上报信息 24
3.3 HDFS的错误处理 25
3.3.1 DN的错误 25
3.3.2 NN的错误 26
3.3.3 客户端的错误 26
参考文献 29
第4章 Google的BigTable系统 30
4.1 BigTable的外部接口和架构 30
4.1.1 表 30
4.1.2 数据 31
4.1.3 原子性 32
4.1.4 时间戳 32
4.1.5 BigTable的数据模型 33
4.1.6 BigTable的架构 34
4.2 BigTable的实现 35
4.2.1 tablet location 35
4.2.2 tablet的指派 36
4.2.3 加载tablet 36
4.2.4 tablet的读/写操作 37
4.2.5 合并 38
参考文献 38
第5章 文档数据库MongoDB 39
5.1 MongoDB的外部接口和架构 39
5.1.1 MongoDB的基本概念 39
5.1.2 MongoDB的架构 39
5.2 MongoDB的standalone模式 40
5.2.1 MongoDB的写入过程 40
5.2.2 无确认导致的丢失更新异常 40
5.2.3 未持久化导致的丢失更新异常 41
5.3 MongoDB的replica set模式 42
5.3.1 MongoDB的复制过程 43
5.3.2 无副本确认导致的丢失更新异常 44
5.3.3 不正确选主导致的丢失更新异常 45
5.3.4 脑裂导致的丢失更新异常 47
5.3.5 缺失任期信息导致的丢失更新异常 48
5.3.6 脏读异常 51
5.3.7 陈旧读异常 52
第6章 消息系统RabbitMQ 54
6.1 RabbitMQ简述 54
6.1.1 关于broker 54
6.1.2 RabbitMQ的接口 55
6.1.3 镜像队列 55
6.2 RabbitMQ的基本实现 55
6.2.1 镜像复制 55
6.2.2 镜像加入队列 56
6.2.3 镜像同步过程 56
6.3 master切换及RabbitMQ的异常处理 57
6.3.1 意外宕机后的master切换 57
6.3.2 主动运维后的master切换 57
6.3.3 意外宕机与主动运维的默认行为差异 58
6.3.4 网络分区后的master切换 58
6.4 确认机制 59
第7章 协调服务ZooKeeper 60
7.1 协调服务的应用场景 60
7.2 ZooKeeper简述 61
7.2.1 ZooKeeper的数据模型 61
7.2.2 ZooKeeper的外部接口 62
7.2.3 ZooKeeper的架构 63
7.3 ZooKeeper的实现细节 65
7.3.1 客户端异步处理 65
7.3.2 请求处理器 65
7.3.3 原子广播 67
参考文献 68
第8章 Google的Spanner数据库 69
8.1 Spanner的数据模型 69
8.1.1 带模式的半关系型表 69
8.1.2 通用事务 71
8.2 Spanner的架构 72
8.3 Spanner的实现 73
8.3.1 tablet与存储 73
8.3.2 复制 73
8.3.3 TrueTime 74
8.3.4 事务 75
8.3.5 目录 80
8.3.6 Paxos的作用 80
8.4 TrueTime的作用 81
8.4.1 Spanner的外部一致性 81
8.4.2 TrueTime生成事务时间戳 82
8.4.3 TrueTime管理leader租约 83
8.4.4 TrueTime作用的总结 85
参考文献 85
第9章 分布式数据库CockroachDB 86
9.1 CockroachDB的接口和数据模型 86
9.2 CockroachDB的架构 87
9.3 元数据存储的实现 88
9.4 多副本存储的实现 90
9.5 事务的实现 92
9.5.1 单个事务的执行 92
9.5.2 多个事务串行执行 94
9.5.3 事务的并发执行 96
参考文献 106

第3部分 分布式算法
第10章 共识算法Paxos 108
10.1 Paxos的历史 108
10.2 Consensus vs Paxos 110
10.3 Basic Paxos算法 111
10.3.1 共识问题 111
10.3.2 算法简述 113
10.3.3 选择值过程 115
10.4 Multi Paxos 算法 132
10.4.1 多个实例 132
10.4.2 独立实例运行的完整Paxos算法 132
10.4.3 只运行一次prepare消息的完整Paxos算法 137
10.5 复制状态机 144
10.6 Paxos算法与复制状态机 146
10.6.1 Paxos算法实现复制状态机 146
10.6.2 空洞处理 147
10.7 原子广播 148
10.7.1 原子广播协议 148
10.7.2 原子广播的模型 148
10.7.3 原子广播的特性 149
10.8 Paxos算法与原子广播 149
10.8.1 Paxos consensus实例与原子广播 149
10.8.2 Paxos的角色与原子广播 150
参考文献 151
第11章 复制日志算法Raft 152
11.1 Raft是复制日志的算法 152
11.2 Raft算法的组成 153
11.3 复制过程 153
11.4 选举过程 154
11.4.1 选举的基本条件 154
11.4.2 任期 155
11.4.3 完整的选举过程 156
11.5 异常处理 157
11.5.1 不一致异常 157
11.5.2 一致性检查 160
11.5.3 不提交旧的leader的entry 160
参考文献 162
第12章 原子广播算法Zab 163
12.1 Zab算法简述 163
12.1.1 设计的Zab算法与ZooKeeper中实现的Zab算法 163
12.1.2 Zab算法的阶段 164
12.2 各版本Zab算法的共有部分 164
12.2.1 Zab算法的基本概念 164
12.2.2 Zab算法的broadcast阶段 166
12.2.3 Zab算法的消息通道 169
12.2.4 Zab算法的broadcast阶段的特性 170
12.2.5 已提交的提议 170
12.2.6 故障处理 170
12.3 设计的Zab算法 172
12.3.1 Phase0:election阶段 173
12.3.2 Phase1:discovery阶段 174
12.3.3 Phase2:synchronization阶段 174
12.3.4 Phase3:broadcast阶段 175
12.3.5 设计的Zab算法的问题 176
12.3.6 设计的Zab算法处理leader故障 176
12.4 Zab Pre 1.0算法 177
12.4.1 leader election阶段 177
12.4.2 recovery阶段 177
12.4.3 Zab Pre 1.0算法处理leader宕机故障 178
12.4.4 Zab Pre 1.0算法的缺陷 179
12.5 Zab 1.0算法 179
12.5.1 Phase0:leader election阶段 180
12.5.2 Phase1:discovery阶段 180
12.5.3 Phase2:synchronization阶段 181
12.5.4 Zab 1.0算法处理leader宕机故障 181
参考文献 182

第4部分 一 致 性
第13章 事务一致性与隔离级别 184
13.1 ANSI的隔离级别 185
13.1.1 ANSI的隔离级别定义 185
13.1.2 对一致性的破坏 186
13.1.3 脏写 188
13.1.4 锁机制 188
13.2 SI和SSI隔离级别 190
13.2.1 MVCC 190
13.2.2 SI隔离级别 190
13.2.3 SSI隔离级别 192
参考文献 192

第14章 顺序一致性 193
14.1 顺序一致性的正式定义 193
14.1.1 顺序一致性应用的范围 193
14.1.2 顺序一致性的定义 194
14.1.3 核心概念的解释 195
14.1.4 定义解析 198
14.1.5 在分布式系统中的定义 200
14.1.6 举例说明 200
14.2 理解顺序一致性 202
14.2.1 顺序排序 202
14.2.2 程序顺序 202
14.2.3 顺序一致性是严苛的 203
14.3 顺序一致性的其他描述 204
14.3.1 第一种描述:全局视角一致 204
14.3.2 第二种描述:允许重排序 205
14.4 顺序一致性的作用 206
14.4.1 并发条件 206
14.4.2 原子性 207
参考文献 209
第15章 线性一致性与强一致性 210
15.1 什么是线性一致性 210
15.1.1 预备概念 211
15.1.2 定义 213
15.2 判断系统是否满足线性一致性 213
15.3 对线性一致性的理解与强一致性 216
15.3.1 线性一致性的其他描述 216
15.3.2 线性一致性与顺序一致性的比较 217
15.3.3 强一致性 218
15.4 ZooKeeper的一致性分析 219
15.4.1 ZooKeeper是顺序一致性的 219
15.4.2 ZooKeeper的一致性的作用 221
15.4.3 ZooKeeper的一致性的描述 222
参考文献 223
第16章 架构设计中的权衡 225
16.1 什么是CAP定理 225
16.1.1 CAP历史:从原则到定理 225
16.1.2 CAP的定义 226
16.1.3 CAP定理下的三种系统 226
16.1.4 深入理解CAP定理中的P和A 227
16.2 关于CAP定理的错误理解 228
16.2.1 不是三选二,不能不选P 228
16.2.2 不是三分法 229
16.2.3 不该轻易放弃任何一个属性 230
16.3 CAP中的权衡 230
16.3.1 弱CAP原则 230
16.3.2 CAP推动NoSQL 231
16.3.3 分布式系统中的可用性和一致性 231
16.4 进一步权衡:HAT和PACELC 231
16.4.1 HAT 232
16.4.2 权衡 234
16.4.3 PACELC 234
参考文献 235

读者评论

  • 位置:第20页,3.1.2 HDFS的架构,图3.1
    勘误内容:图中Nameonde拼写错误,应为Namenode

    2014bduck发表于 2021/6/12 14:05:15

相关图书

软件交付通识

董越 (作者)

软件交付过程是指在编程序改代码之后,直到将软件发布给用户使用之前的一系列活动,如提交、集成、构建、部署、测试等。本书作为通识类图书,对软件交付过程的各个方面进行...

¥89.00

人人都是产品经理(案例版):淘宝十年产品事

陶英琪 (作者)

做产品经理需要不断成长。然而回顾漫长的产品发展史,我们总会发现:有太多犯过的错误在反复出现,每一次都会有人掉入同样的“坑”。大量看似充满新意的点子、“前无古人”...

¥69.00

Go语言极简一本通:零基础入门到项目实战

刘宗鑫 (作者)

本书是一本Go 语言入门书,全书共分为三部分。第一部分讲解Go 语言基础知识,包括变量与简单类型、数组、切片、流程控制、字典、函数、结构体与方法、接口等,可以帮...

¥99.00

人人都是产品经理(思维版):泛产品经理的精进之路

陶英琪 (作者)

如今,互联网圈内的一些不在产品经理岗位的人,因为工作需要或者个人兴趣,也需要了解一些产品方法论;同时,非互联网圈的从业者们,也感受到互联网大潮的势不可挡,不管是...

¥89.00

人人都是产品经理(入行版):互联网产品经理的第一本书

陶英琪 (作者)

本书对于大量成长起来的优秀互联网产品经理,为数不少想投身产品工作的其他岗位从业者,以及更多有志从事这一职业的学生而言,这本书曾是他们记忆深刻的启蒙读物、思想基石...

¥79.00

Scala编程(第4版)

(德)Martin Odersky( 马丁·奥德斯基), Lex Spoon(莱斯·彭), Bill Venners (比尔·文纳斯) (作者) 高宇翔 (译者)

该选题系统地详细的阐述了如何使用Scala这一新的编程语言。它既具有一定的理论深度,又具有很好地实际指导意义,潜在的读者群数量非常大。此外,作为一个新生一代语言...

¥209.00