本書對近年來涌現(xiàn)出的各種主流分布式技術(shù)做了簡要介紹和全面梳理。本書將分布式系統(tǒng)中涉及的技術(shù)分為前端構(gòu)造技術(shù)、分布式中間件技術(shù)和分布式存儲技術(shù)三大類,對每類技術(shù)都詳細介紹了其原理、設(shè)計思想和架構(gòu),以及相關(guān)應(yīng)用場景。此外,本書還總結(jié)了分布式系統(tǒng)的構(gòu)建思想,并分別對業(yè)界幾個非常成功的大型分布式系統(tǒng)(谷歌搜索系統(tǒng)、淘寶網(wǎng)電商平臺、阿里云公有云平臺、領(lǐng)英社交平臺)進行了案例研究。
隨著互聯(lián)網(wǎng),尤其是移動互聯(lián)網(wǎng)的快速發(fā)展,大數(shù)據(jù)洶涌而至。傳統(tǒng)單體應(yīng)用的開發(fā)者很快就發(fā)現(xiàn),無論他們?nèi)绾蝺?yōu)化自己的產(chǎn)品,都無法滿足飛速增長的業(yè)務(wù)需要,借助垂直擴展提高性能的路已經(jīng)走到了盡頭,谷歌、百度、阿里巴巴、亞馬遜都先后遇到了這個難題。
谷歌公司關(guān)于GFS、Bigtable、MapReduce的三篇論文發(fā)表后,各種分布式技術(shù)如雨后春筍般蓬勃發(fā)展,困擾了業(yè)界多年的性能難題在水平擴展思路的引領(lǐng)下迎刃而解。從此,分布式文件系統(tǒng)、分布式數(shù)據(jù)庫系統(tǒng)、分布式中間件等各種開源的、閉源的分布式產(chǎn)品層出不窮。分布式技術(shù)的多樣性固然為業(yè)界提供了許多選擇,但也給分布式系統(tǒng)的開發(fā)者,尤其是初學(xué)者帶來了許多挑戰(zhàn)。
本書旨在對分布式技術(shù)做一個整體介紹,對現(xiàn)有的各種分布式技術(shù)進行系統(tǒng)的梳理,以及對各種分布式產(chǎn)品的設(shè)計思想和架構(gòu)進行具體闡述,使讀者在短時間內(nèi)了解分布式系統(tǒng)的全貌并理解其思想和應(yīng)用。
本書適合業(yè)界的架構(gòu)師、工程師、項目經(jīng)理,以及大中專院校的高年級本科生和研究生使用和參考。
李慶旭 1999 年北京工業(yè)大學(xué)計算機系碩士畢業(yè)。曾先后就職于華為、北電網(wǎng)絡(luò)、微軟、CA、Symantec/Veritas等國內(nèi)外知名企業(yè),擔(dān)任過軟件開發(fā)工程師、項目經(jīng)理、團隊技術(shù)負(fù)責(zé)人等職務(wù)。參與研發(fā)過的產(chǎn)品有電信網(wǎng)管軟件、微軟拼音輸入法、微軟SharePoint、微軟Office 365、CA Clarity項目管理軟件等。對軟件技術(shù)有著濃厚的興趣,常于工作之余涉獵軟件的多個領(lǐng)域,如桌面操作系統(tǒng)、移動操作系統(tǒng)、分布式技術(shù)、人工智能、機器學(xué)習(xí)等。
目 錄
第一部分 分布式系統(tǒng)概述
第1章 分布式系統(tǒng)概述 3
1.1 分布式系統(tǒng)的組成 4
1.2 分布式協(xié)調(diào)組件 6
1.3 分布式存儲系統(tǒng) 7
1.4 分布式計算系統(tǒng) 9
1.4.1 批處理分布式計算系統(tǒng) 9
1.4.2 流處理分布式計算系統(tǒng) 10
1.4.3 混合系統(tǒng) 11
1.5 分布式系統(tǒng)中節(jié)點之間的關(guān)系 11
第二部分 分布式系統(tǒng)的前端構(gòu)造技術(shù)
第2章 Web框架的實現(xiàn)原理 15
2.1 Web框架簡介 16
2.2 PHP Web MVC框架的工作原理 17
2.2.1 框架的入口 17
2.2.2 URL到控制器的映射 17
2.2.3 如何將模型傳給視圖 18
2.3 Java Web MVC框架原理 19
2.3.1 Java Servlet API 3.0 19
2.3.2 框架的入口 20
2.3.3 Spring 4.0框架 22
2.3.4 Java EE 29
2.3.5 Spring與Java EE的比較 30
2.4 Go語言Web開發(fā) 30
2.4.1 Go語言簡介 31
2.4.2 Go語言Web開發(fā) 32
第3章 反向代理與負(fù)載均衡 33
3.1 反向代理 33
3.1.1 Nginx 34
3.1.2 Tengine 35
3.1.3 Varnish 35
3.2 負(fù)載均衡 36
3.2.1 DNS負(fù)載均衡 36
3.2.2 硬件負(fù)載均衡 36
3.2.3 軟件負(fù)載均衡 37
第三部分 分布式中間件
第4章 分布式同步服務(wù)中間件 41
4.1 分布式一致性協(xié)議 42
4.2 分布式同步服務(wù)中間件簡介 43
4.3 分布式同步服務(wù)中間件的實現(xiàn)原理 44
4.3.1 架構(gòu) 44
4.3.2 如何消除單點故障 45
4.3.3 Chubby對外提供的API 45
4.3.4 數(shù)據(jù)庫 46
4.3.5 Chubby使用示例:集群的主服務(wù)器選舉 46
4.4 其他分布式同步服務(wù)中間件 46
4.4.1 Linux心跳機制 47
4.4.2 ZooKeeper 47
4.4.3 iNexus 48
4.5 分布式同步服務(wù)的應(yīng)用 48
第5章 關(guān)系型數(shù)據(jù)庫訪問中間件 53
5.1 數(shù)據(jù)庫訪問中間件的形式 54
5.2 數(shù)據(jù)庫訪問中間件的工作原理 55
5.3 著名的數(shù)據(jù)庫訪問中間件 56
5.3.1 MySQL代理 57
5.3.2 Cobar 58
5.3.3 TDDL 59
5.3.4 MyCAT 59
5.3.5 Heisenberg 59
5.4 數(shù)據(jù)庫訪問中間件的應(yīng)用 60
5.4.1 使用MySQL代理實現(xiàn)讀寫數(shù)據(jù)庫分離 60
5.4.2 研發(fā)自己的數(shù)據(jù)庫中間件,實現(xiàn)MySQL的分庫分表 60
第6章 分布式服務(wù)調(diào)用中間件 63
6.1 分布式服務(wù)調(diào)用中間件簡介 63
6.2 分布式服務(wù)調(diào)用中間件的實現(xiàn)原理 64
6.2.1 Dubbo的架構(gòu) 64
6.2.2 Dubbo中各組件的交互 65
6.2.3 Dubbo的實現(xiàn)及特點 66
6.2.4 Dubbox 66
6.3 其他分布式服務(wù)調(diào)用中間件 67
6.3.1 Protocol Buffers 67
6.3.2 gRPC 68
6.3.3 Thrift 69
6.3.4 Motan 72
6.3.5 sofa-pbrpc 73
6.4 分布式服務(wù)調(diào)用中間件的應(yīng)用 73
第7章 分布式消息服務(wù)中間件 75
7.1 分布式消息服務(wù)中間件簡介 75
7.2 分布式消息服務(wù)中間件的實現(xiàn)原理 77
7.2.1 消息模型 77
7.2.2 架構(gòu) 77
7.3 其他分布式消息服務(wù)中間件 79
7.3.1 阿里巴巴RocketMQ 79
7.3.2 Apache Pulsar 80
7.4 分布式消息服務(wù)中間件的應(yīng)用 82
7.4.1 秒殺系統(tǒng)中使用Kafka以削平峰值流量 83
7.4.2 使用Kafka流實現(xiàn)消息推送 83
第8章 分布式跟蹤服務(wù)中間件 85
8.1 分布式跟蹤服務(wù)中間件的實現(xiàn)原理 85
8.2 其他分布式跟蹤服務(wù)中間件 88
8.2.1 Twitter的Zipkin 88
8.2.2 Pinpoint 90
8.2.3 阿里巴巴的EagleEye 92
8.3 分布式跟蹤服務(wù)中間件的應(yīng)用 92
第四部分 分布式存儲技術(shù)
第9章 分布式文件系統(tǒng) 95
9.1 分布式文件系統(tǒng)的實現(xiàn)原理 96
9.2 其他分布式文件系統(tǒng) 102
9.3 分布式文件系統(tǒng)的應(yīng)用 104
第10章 基于鍵值對的NoSQL數(shù)據(jù)庫 107
10.1 NoSQL數(shù)據(jù)庫的CAP權(quán)衡 108
10.2 基于鍵值對的NoSQL數(shù)據(jù)庫的實現(xiàn)原理 108
10.2.1 谷歌的LevelDB 108
10.2.2 阿里巴巴的Tair 111
10.2.3 亞馬遜的Dynamo 111
10.3 其他基于鍵值對的NoSQL數(shù)據(jù)庫 115
10.3.1 Memcached 115
10.3.2 Redis 116
10.3.3 Berkeley DB 117
10.3.4 Facebook RocksDB 117
10.3.5 Riak 118
10.3.6 Voldemort 118
10.4 基于鍵值對的NoSQL數(shù)據(jù)庫的應(yīng)用 118
10.4.1 使用Redis緩存會話數(shù)據(jù) 118
10.4.2 使用Berkeley DB/LevelDB/RocksDB構(gòu)建自己的分布式存儲系統(tǒng) 119
10.4.3 使用Berkeley DB/LevelDB/RocksDB作為本地數(shù)據(jù)庫 119
第11章 基于列的NoSQL數(shù)據(jù)庫 121
11.1 基于列的NoSQL數(shù)據(jù)庫的實現(xiàn)原理 121
11.1.1 數(shù)據(jù)模型 121
11.1.2 架構(gòu) 124
11.2 其他基于列的NoSQL數(shù)據(jù)庫 126
11.2.1 Apache HBase 126
11.2.2 Apache Cassandra 127
11.2.3 Baidu Tera 128
11.3 基于列的NoSQL數(shù)據(jù)庫的應(yīng)用 128
11.3.1 HBase用于數(shù)據(jù)分析系統(tǒng) 128
11.3.2 HBase用于存儲呼叫記錄 129
第12章 基于文檔的NoSQL數(shù)據(jù)庫 131
12.1 基于文檔的NoSQL數(shù)據(jù)庫的實現(xiàn)原理 131
12.1.1 數(shù)據(jù)模型 131
12.1.2 自動分片 132
12.1.3 副本 132
12.1.4 索引 133
12.1.5 查詢路由 133
12.2 其他基于文檔的NoSQL數(shù)據(jù)庫 133
12.2.1 CouchDB 133
12.2.2 RethinkDB 134
12.3 基于文檔的NoSQL數(shù)據(jù)庫的應(yīng)用 135
第13章 其他NoSQL數(shù)據(jù)庫 137
13.1 基于圖的NoSQL數(shù)據(jù)庫Neo4j 138
13.1.1 數(shù)據(jù)模型 138
13.1.2 圖的存儲 138
13.1.3 高可用性 139
13.1.4 水平擴展 139
13.2 多數(shù)據(jù)模型NoSQL數(shù)據(jù)庫OrientDB 139
13.2.1 基本概念 140
13.2.2 圖的表示 140
13.2.3 節(jié)點與集群 140
13.2.4 分片 141
13.2.5 ACID支持 141
13.2.6 CAP的權(quán)衡 142
13.2.7 集群配置信息的管理 142
13.3 時間序列NoSQL數(shù)據(jù)庫 142
第14章 NewSQL數(shù)據(jù)庫 143
14.1 NewSQL和CAP理論 144
14.2 采用新架構(gòu)的NewSQL系統(tǒng) 145
14.2.1 谷歌的Megastore 145
14.2.2 谷歌的Spanner 146
14.2.3 谷歌的F1 147
14.2.4 阿里巴巴的OceanBase 148
14.2.5 其他采用新架構(gòu)的NewSQL數(shù)據(jù)庫 152
第五部分 分布式系統(tǒng)的構(gòu)建思想
第15章 云化 157
15.1 云化的技術(shù)基礎(chǔ) 157
15.1.1 虛擬機技術(shù) 157
15.1.2 容器技術(shù) 159
15.2 公有云能提供什么 159
15.3 云化對軟件架構(gòu)的要求 161
第16章 分布式系統(tǒng)的構(gòu)建思想 163
16.1 一切都可能失敗與冗余的思想 163
16.1.1 如何避免單點故障 164
16.1.2 避免單點故障的具體做法 165
16.2 水平而不是垂直擴展的思想 165
16.2.1 數(shù)據(jù)的水平擴展 166
16.2.2 服務(wù)的水平擴展 167
16.2.3 數(shù)據(jù)中心的水平擴展 167
16.3 盡可能簡單的思想 168
16.4 實用主義的思想 169
16.4.1 搜索引擎作為查詢工具使用 169
16.4.2 阿里巴巴的OceanBase的架構(gòu) 169
16.4.3 根據(jù)需要選擇最適合的開發(fā)工具和開發(fā)語言 170
16.4.4 根據(jù)需要選擇不同的存儲系統(tǒng) 170
16.5 異步化以解耦并削平峰值 170
16.6 最終一致性的思想 171
16.7 微服務(wù)的思想 171
16.8 MapReduce的思想 172
16.9 服務(wù)跟蹤的思想 172
16.10 資源池化的思想 173
第六部分 大型分布式系統(tǒng)案例研究及分析
第17章 大型分布式系統(tǒng)案例研究 177
17.1 案例研究之谷歌搜索系統(tǒng) 177
17.2 案例研究之淘寶網(wǎng) 182
17.3 案例研究之阿里云 185
17.4 案例研究之領(lǐng)英 189
第18章 關(guān)于分布式系統(tǒng)設(shè)計的思考 197
18.1 大型互聯(lián)網(wǎng)公司架構(gòu)的共性 197
18.2 為何大型互聯(lián)網(wǎng)公司的架構(gòu)如此相似 198
18.3 關(guān)于分布式監(jiān)控系統(tǒng) 199
18.4 Linux系統(tǒng)調(diào)用epoll() 200
18.5 關(guān)于插件設(shè)計模式的實現(xiàn) 201
18.5.1 C/C++語言的動態(tài)庫形式的實現(xiàn) 202
18.5.2 Java語言的插件模式實現(xiàn) 203
18.5.3 采用專用語言的插件模式實現(xiàn) 205
18.6 關(guān)于分布式服務(wù)調(diào)用中間件的實現(xiàn) 205
18.7 動態(tài)鏈接還是靜態(tài)鏈接 206
18.8 無所不用其極的壓榨性能手段 206
18.8.1 編譯后代碼的原生態(tài)化 206
18.8.2 定制的Linux內(nèi)核 207
18.8.3 定制的Java虛擬機 208
18.8.4 定制的MySQL 208
參考文獻 209
后記 211