分布式系統(tǒng)是一門理論模型與工程技法并重的學(xué)科,現(xiàn)在的互聯(lián)網(wǎng)從業(yè)的開發(fā)人員,很難繞過分布式系統(tǒng),或多或少會(huì)在面試、工作中接觸到分布式系統(tǒng)的知識。本書主要通過理論和實(shí)踐結(jié)合的方式介紹分布式系統(tǒng)。主要內(nèi)容有分布式系統(tǒng)基礎(chǔ)知識:分布式系統(tǒng)模型、分區(qū)、一致性哈希、主從復(fù)制、一致性級別、分布式共識、分布式事務(wù)、分布式系統(tǒng)中的時(shí)間等,幫助讀者夯實(shí)分布式基礎(chǔ)知識;本書也面向?qū)嵺`者:實(shí)現(xiàn)簡單的 Paxos 共識算法、HDFS、ZooKeeper、etcd、Kubernetes 等分布式系統(tǒng)案例研究等。
唐偉志,曾任網(wǎng)易游戲、騰訊基礎(chǔ)架構(gòu)工程師。畢業(yè)后一直從事分布式系統(tǒng)相關(guān)工作,在知乎和公眾號“多顆糖”上分享對分布式系統(tǒng)論文的解讀和算法的講解。開源愛好者、TiDB Reviewer和Kubernetes Contributor。
第1章 認(rèn)識分布式系統(tǒng)
1.1 什么是分布式系統(tǒng)
1.2 為什么需要分布式系統(tǒng)
1.3 分布式系統(tǒng)的示例
1.3.1 搜索引擎
1.3.2 加密貨幣
1.4 分布式系統(tǒng)的挑戰(zhàn)
1.4.1 網(wǎng)絡(luò)延遲問題
1.4.2 部分失效問題
1.4.3 時(shí)鐘問題
1.5 每個(gè)程序員都應(yīng)該知道的數(shù)字
1.6 本章小結(jié)
第2章 分布式系統(tǒng)模型
2.1 兩將軍問題
2.2 拜占庭將軍問題
2.3 系統(tǒng)模型
2.3.1 網(wǎng)絡(luò)鏈路模型
2.3.2 節(jié)點(diǎn)故障類型
2.3.3 按時(shí)間劃分系統(tǒng)模型
2.4 消息傳遞語義
2.5 本章小結(jié)
第3章 分布式數(shù)據(jù)基礎(chǔ)
3.1 分區(qū)
3.1.1 水平分區(qū)算法
3.1.2 分區(qū)的挑戰(zhàn)
3.2 復(fù)制
3.2.1 單主復(fù)制
3.2.2 多主復(fù)制
3.2.3 無主復(fù)制
3.3 CAP定理
3.3.1 PACELC定理
3.3.2 BASE
3.4 一致性模型
3.4.1 線性一致性
3.4.2 實(shí)現(xiàn)線性一致性
3.4.3 線性一致性的代價(jià)
3.4.4 順序一致性
3.4.5 因果一致性
3.4.6 最終一致性
3.4.7 以客戶端為中心的一致性模型
3.5 隔離級別
3.6 一致性和隔離級別的對比
3.7 本章小結(jié)
第4章 分布式共識
4.1 分布式共識簡介
4.1.1 什么是分布式共識
4.1.2 為什么要達(dá)成共識
4.2 異步系統(tǒng)中的共識
4.2.1 FLP不可能定理
4.2.2 故障屏蔽
4.2.3 使用故障檢測器
4.2.4 使用隨機(jī)性算法
4.3 同步系統(tǒng)中的共識
4.4 Paxos
4.4.1 基本概念
4.4.2 問題描述
4.4.3 Paxos算法實(shí)現(xiàn)流程
4.4.4 案例
4.4.5 活鎖
4.5 實(shí)驗(yàn):使用Go語言實(shí)現(xiàn)Paxos共識算法
4.5.1 定義相關(guān)結(jié)構(gòu)體
4.5.2 定義消息結(jié)構(gòu)體
4.5.3 算法實(shí)現(xiàn)流程
4.5.4 學(xué)習(xí)提案
4.5.5 實(shí)現(xiàn)單元測試
4.6 Multi-Paxos
4.6.1 確定日志索引
4.6.2 領(lǐng)導(dǎo)者選舉
4.6.3 減少請求
4.6.4 副本的完整性
4.6.5 客戶端請求
4.6.6 配置變更
4.6.7 完整實(shí)現(xiàn)
4.6.8 Paxos練習(xí)題
4.7 其他Paxos變體
4.7.1 Disk Paxos
4.7.2 Cheap Paxos
4.7.3 Fast Paxos
4.7.4 Mencius
4.7.5 EPaxos
4.7.6 Flexible Paxos
4.7.7 WPaxos
4.7.8 CASPaxos
4.7.9 其他
4.8 Raft算法
4.8.1 系統(tǒng)模型
4.8.2 基本概念
4.8.3 領(lǐng)導(dǎo)者選舉
4.8.4 日志復(fù)制
4.8.5 領(lǐng)導(dǎo)者更替
4.8.6 選舉限制舉例
4.8.7 延遲提交之前任期的日志條目
4.8.8 清理不一致的日志
4.8.9 處理舊領(lǐng)導(dǎo)者
4.8.10 客戶端協(xié)議
4.8.11 實(shí)現(xiàn)線性一致性
4.8.12 配置變更
4.8.13 配置變更存在的Bug
4.8.14 極端情況下的活性問題
4.8.15 日志壓縮
4.8.16 基于內(nèi)存的狀態(tài)機(jī)的快照
4.8.17 基于磁盤的狀態(tài)機(jī)的快照
4.8.18 性能優(yōu)化
4.8.19 Raft練習(xí)題
4.9 Paxos vs Raft
4.10 拜占庭容錯(cuò)和PBFT算法
4.11 本章小結(jié)
第5章 分布式事務(wù)
5.1 什么是分布式事務(wù)
5.2 原子提交
5.2.1 兩階段提交
5.2.2 三階段提交
5.2.3 Paxos提交算法
5.2.4 基于Quorum的提交協(xié)議
5.2.5 Saga事務(wù)
5.3 并發(fā)控制
5.3.1 兩階段鎖
5.3.2 樂觀并發(fā)控制
5.3.3 多版本并發(fā)控制
5.4 Percolator
5.5 本章小結(jié)
第6章 時(shí)間和事件順序
6.1 物理時(shí)鐘
6.2 時(shí)鐘同步
6.3 邏輯時(shí)鐘
6.4 向量時(shí)鐘
6.5 分布式快照
6.6 本章小結(jié)
第7章 案例研究
7.1 分布式文件系統(tǒng)
7.1.1 GFS的目標(biāo)
7.1.2 架構(gòu)
7.1.3 讀取文件
7.1.4 寫入文件
7.1.5 一致性模型
7.1.6 其他
7.2 分布式協(xié)調(diào)服務(wù)
7.2.1 ZooKeeper架構(gòu)
7.2.2 數(shù)據(jù)模型
7.2.3 ZooKeeper實(shí)現(xiàn)
7.2.4 客戶端API
7.2.5 其他
7.3 分布式表格存儲(chǔ)Bigtable
7.3.1 數(shù)據(jù)模型
7.3.2 架構(gòu)
7.3.3 SSTable和LSM Tree
7.3.4 其他優(yōu)化
7.4 分布式鍵值存儲(chǔ)Dynamo
7.4.1 架構(gòu)
7.4.2 請求協(xié)調(diào)
7.4.3 成員管理和故障檢測
7.5 分布式NoSQL數(shù)據(jù)庫Cassandra
7.5.1 數(shù)據(jù)模型
7.5.2 架構(gòu)
7.5.3 協(xié)調(diào)請求
7.5.4 一致性級別
7.5.5 輕量級事務(wù)
7.5.6 二級索引
7.5.7 批處理
7.6 分布式數(shù)據(jù)庫Spanner
7.6.1 數(shù)據(jù)模型
7.6.2 架構(gòu)
7.6.3 TrueTime
7.6.4 讀寫事務(wù)
7.6.5 只讀事務(wù)
7.6.6 快照讀和模式變更事務(wù)
7.7 分布式批處理
7.7.1 MapReduce
7.7.2 Spark
7.8 分布式流處理框架Flink
7.8.1 計(jì)算模型
7.8.2 系統(tǒng)架構(gòu)
7.8.3 時(shí)間處理
7.8.4 分布式快照
7.8.5 端到端的精確一次語義
7.9 本章小結(jié)