本書(shū)從開(kāi)發(fā)高可用系統(tǒng)需要具備的理論知識(shí)出發(fā),逐步講解應(yīng)用的高可用、數(shù)據(jù)庫(kù)高可用、緩存高可用、Nginx/LVS高可用、異地多活、全鏈路監(jiān)控/告警、高可用與安全、高可用在秒殺系統(tǒng)中的應(yīng)用等內(nèi)容,書(shū)中同時(shí)提供了大量有價(jià)值的解決方案,可直接用于開(kāi)發(fā)實(shí)踐。 本書(shū)理論與實(shí)踐并重,適合具有一定Java開(kāi)發(fā)經(jīng)驗(yàn)的人員,或者想從程序員進(jìn)階為架構(gòu)師的開(kāi)發(fā)人員閱讀。
高可用是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,也是成為一名優(yōu)秀的架構(gòu)師必須具備的知識(shí),系統(tǒng)的可用性在過(guò)去、現(xiàn)在和未來(lái)都是架構(gòu)領(lǐng)域最重要的一個(gè)環(huán)節(jié),在大型分布式系統(tǒng)中,一個(gè)小模塊設(shè)計(jì)不合理,可用性差,都可能影響用戶體驗(yàn),給企業(yè)帶來(lái)?yè)p失。
那么,影響高可用的因素有哪些?如何設(shè)計(jì)持續(xù)穩(wěn)定的高可用架構(gòu)?本書(shū)將從基礎(chǔ)理論、解決方案、應(yīng)用案例、代碼實(shí)現(xiàn)等方面解答高可用架構(gòu)設(shè)計(jì)的這些困惑。
高可用(High Availability,HA)是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,也是成為一名優(yōu)秀的架構(gòu)師必須具備的知識(shí),系統(tǒng)的可用性在過(guò)去、現(xiàn)在和未來(lái)都是架構(gòu)領(lǐng)域最重要的一個(gè)環(huán)節(jié),在大型分布式系統(tǒng)中,一個(gè)小模塊設(shè)計(jì)不好、可用性差都可能影響用戶體驗(yàn),給企業(yè)帶來(lái)?yè)p失。因此,掌握高可用相關(guān)技能和理論知識(shí)對(duì)于個(gè)人和企業(yè)都有莫大的好處。
本書(shū)從開(kāi)發(fā)高可用系統(tǒng)需要具備的理論知識(shí)出發(fā),逐步講解應(yīng)用的高可用、數(shù)據(jù)庫(kù)高可用、緩存高可用、Nginx/LVS高可用、異地多活、全鏈路監(jiān)控/告警、高可用與安全以及高可用在秒殺系統(tǒng)中的應(yīng)用等內(nèi)容。
本書(shū)理論與實(shí)踐相結(jié)合,融入筆者近十年開(kāi)發(fā)經(jīng)驗(yàn),其中提供了大量解決方案和代碼實(shí)現(xiàn),尤其對(duì)于有一定Java開(kāi)發(fā)經(jīng)驗(yàn),想進(jìn)一步提升開(kāi)發(fā)技能,甚至進(jìn)階到架構(gòu)師的程序員有較大幫助。
本書(shū)結(jié)構(gòu)
本書(shū)共9章,以下是各章的內(nèi)容概要:
第1章主要介紹SLA與可用性、FMEA理論、集群與分布式以及學(xué)習(xí)高可用需要具備的理論知識(shí),例如CAP理論、選舉算法、共識(shí)算法及一致性算法等。
第2章主要介紹影響軟件質(zhì)量的因素、應(yīng)用的優(yōu)雅關(guān)閉與啟動(dòng)、無(wú)狀態(tài)服務(wù)、重試、冪等、健康檢查、流量削峰、負(fù)載均衡、限流、熔斷、降級(jí)、故障檢測(cè)、故障隔離、集群容錯(cuò)以及集群部署等內(nèi)容。
第3章主要介紹數(shù)據(jù)庫(kù)高可用,包括數(shù)據(jù)庫(kù)高可用概述、雙節(jié)點(diǎn)MySQL高可用架構(gòu)(MMM、基于MHA實(shí)現(xiàn)MySQL自動(dòng)故障轉(zhuǎn)移、MySQL Cluster架構(gòu)、MySQL DRDB Heartbeat架構(gòu)、云數(shù)據(jù)庫(kù)高可用架構(gòu))、MySQL一主多從數(shù)據(jù)同步案例等內(nèi)容。
第4章主要介紹緩存高可用,包括客戶端分區(qū)方案、中間代理層方案、服務(wù)端方案(主從模式、哨兵模式、Redis集群模式、Codis和Redis集群的區(qū)別以及云數(shù)據(jù)庫(kù)Redis等內(nèi)容)。
第5章主要介紹Nginx/LVS高可用,包括Nginx概述、Nginx Keepalived保障高可用、LVS概述、Nginx Keepalived LVS保障高可用/高性能、DNS概述、DNS解析過(guò)程、DNS負(fù)載均衡、DNS LVS Nginx Keepalived等內(nèi)容。
第6章主要介紹異地多活概述、異地多活類(lèi)型(同城異地多活、跨城異地多活、跨國(guó)異地多活3種類(lèi)型)。
第7章主要介紹監(jiān)控,告警概述、日志監(jiān)控/告警方案、資源監(jiān)控/告警方案、鏈路追蹤監(jiān)控等內(nèi)容。
第8章主要介紹高可用與安全、DoS攻擊類(lèi)型與防護(hù)以及相關(guān)安全產(chǎn)品/工具。
第9章主要講解什么是秒殺、最簡(jiǎn)單的秒殺系統(tǒng)、秒殺系統(tǒng)業(yè)務(wù)層面控制、CDN靜態(tài)資源緩存、LVS/Nginx高可用設(shè)計(jì)、服務(wù)拆分/隔離設(shè)計(jì)、流量削峰/限流/降級(jí)、熱點(diǎn)數(shù)據(jù)處理、減庫(kù)存、容災(zāi)以及秒殺系統(tǒng)安全架構(gòu)。
本書(shū)使用的軟件版本
本書(shū)項(xiàng)目實(shí)戰(zhàn)開(kāi)發(fā)環(huán)境如下:
? 操作系統(tǒng)macOS。
? 開(kāi)發(fā)工具IntelliJ IDEA 2021.1。
? JDK使用1.8版本。
? 其他主流技術(shù)使用新版本。
讀者對(duì)象
? 有一定Java開(kāi)發(fā)基礎(chǔ)的大學(xué)生、程序員。
? 想從程序員進(jìn)階為架構(gòu)師的開(kāi)發(fā)人員。
? 對(duì)高可用感興趣的開(kāi)發(fā)人員。
致 謝
感謝筆者的家人,感謝他們對(duì)筆者工作的理解和支持、對(duì)筆者生活無(wú)微不至的照顧,使筆者沒(méi)有后顧之憂,可以全身心投入本書(shū)的寫(xiě)作中。
感謝筆者的工作單位廈門(mén)海西醫(yī)藥交易中心,公司為筆者提供了寶貴的工作、學(xué)習(xí)和實(shí)踐的環(huán)境,書(shū)中很多的知識(shí)點(diǎn)和實(shí)戰(zhàn)經(jīng)驗(yàn)都來(lái)源于所在工作單位,也感謝與我一起工作的同事,非常榮幸能與他們一起在這個(gè)富有激情的團(tuán)隊(duì)中共同奮斗。
最后,感謝清華大學(xué)出版社以及本書(shū)的編輯老師,本書(shū)能夠順利出版離不開(kāi)他們及背后的團(tuán)隊(duì)對(duì)本書(shū)的辛勤付出。
由于水平所限,書(shū)中難免存在疏漏之處,歡迎讀者批評(píng)指正。若有意見(jiàn)和建議,可以發(fā)送電子郵件至booksaga@126.com。
黃文毅
2022年02月05日
黃文毅,架構(gòu)師,從業(yè)8年,先后就職于上海美團(tuán)、廈門(mén)美圖和海西醫(yī)藥等公司,負(fù)責(zé)后端開(kāi)發(fā)工作。出版包括《分布式微服務(wù)架構(gòu):原理與實(shí)踐》、《Spring 5企業(yè)級(jí)開(kāi)發(fā)實(shí)戰(zhàn)》(與人合著)、《Spring MVC MyBatis快速開(kāi)發(fā)與項(xiàng)目實(shí)戰(zhàn)》等圖書(shū)。
趙定益,曾職于多家上市公司及互聯(lián)網(wǎng)獨(dú)角獸企業(yè)并負(fù)責(zé)核心研發(fā)團(tuán)隊(duì)管理及平臺(tái)總體架構(gòu)設(shè)計(jì),擅長(zhǎng)互聯(lián)網(wǎng)系統(tǒng)架構(gòu)設(shè)計(jì)和分布式研發(fā)團(tuán)隊(duì)管理,多次從0到1到N主導(dǎo)完成醫(yī)藥交易、跨境電商、內(nèi)容與知識(shí)付費(fèi)、物聯(lián)網(wǎng)相關(guān)領(lǐng)域產(chǎn)品應(yīng)用架構(gòu)設(shè)計(jì)、系統(tǒng)開(kāi)發(fā)及線上運(yùn)營(yíng)。
第1章 理解高可用 1
1.1 什么是可用性 1
1.1.1 SLA與可用性 1
1.1.2 影響高可用的因素 3
1.1.3 高可用策略 4
1.1.4 高可用和高可靠 7
1.2 FMEA理論 7
1.3 集群與分布式 9
1.3.1 什么是集群與分布式 9
1.3.2 分布式架構(gòu) 11
1.4 高可用之CAP理論 13
1.4.1 CAP理論 13
1.4.2 ACID理論 15
1.4.3 兩階段提交 16
1.4.4 補(bǔ)償事務(wù)TCC 17
1.4.5 BASE理論 19
1.5 高可用之選舉算法 21
1.5.1 霸道選舉算法 21
1.5.2 Raft選舉算法 24
1.5.3 ZAB選舉算法 26
1.6 高可用之共識(shí)算法 29
1.6.1 Paxos算法 29
1.6.2 Multi-Paxos算法 32
1.6.3 Raft算法 33
1.7 高可用之一致性算法 34
1.7.1 一致性分類(lèi) 34
1.7.2 Gossip協(xié)議(最終一致性) 34
1.7.3 Quorum NWR算法 37
1.7.4 Quorum NWR的應(yīng)用 38
1.7.5 Raft日志一致性 40
第2章 應(yīng)用的高可用 43
2.1 軟件質(zhì)量對(duì)高可用的影響 43
2.1.1 影響寫(xiě)出高質(zhì)量代碼的原因 43
2.1.2 代碼重構(gòu) 46
2.1.3 代碼審查概述 47
2.1.4 人工代碼審查 48
2.1.5 代碼自動(dòng)檢查 52
2.2 優(yōu)雅關(guān)閉 53
2.2.1 Java優(yōu)雅關(guān)閉 55
2.2.2 Spring Boot微服務(wù)優(yōu)雅關(guān)閉 58
2.3 優(yōu)雅啟動(dòng) 60
2.3.1 預(yù)熱啟動(dòng) 60
2.3.2 延時(shí)注冊(cè) 61
2.4 服務(wù)狀態(tài) 62
2.4.1 無(wú)狀態(tài)服務(wù) 62
2.4.2 有狀態(tài)服務(wù) 63
2.4.3 實(shí)現(xiàn)無(wú)狀態(tài) 63
2.5 重試 64
2.5.1 重試概述 64
2.5.2 重試風(fēng)險(xiǎn) 64
2.5.3 退避策略 65
2.5.4 重試熔斷策略 65
2.5.5 鏈路重試熔斷 66
2.5.6 重試超時(shí) 67
2.6 冪等 68
2.6.1 非冪等原因 68
2.6.2 冪等定義 68
2.6.3 冪等場(chǎng)景 69
2.6.4 冪等解決方案 70
2.7 健康檢查 74
2.7.1 Spring Boot Actuator健康檢查 75
2.7.2 Nacos健康檢查 84
2.8 流量削峰 96
2.8.1 為何要削峰 96
2.8.2 答題/驗(yàn)證碼 97
2.8.3 分時(shí)分段 97
2.8.4 禁用秒殺按鈕 98
2.8.5 分層過(guò)濾 98
2.8.6 消息隊(duì)列 99
2.9 負(fù)載均衡 100
2.9.1 負(fù)載均衡算法 100
2.9.2 負(fù)載均衡的實(shí)現(xiàn) 105
2.10 限流 108
2.10.1 限流概述 108
2.10.2 限流算法 109
2.10.3 Sentinel中的勻速排隊(duì)限流策略 113
2.11 降級(jí) 121
2.11.1 服務(wù)降級(jí)概述 121
2.11.2 服務(wù)降級(jí)開(kāi)關(guān) 121
2.11.3 自動(dòng)降級(jí) 122
2.11.4 讀服務(wù)降級(jí) 123
2.11.5 寫(xiě)服務(wù)降級(jí) 123
2.12 熔斷 124
2.12.1 熔斷概述 124
2.12.2 熔斷實(shí)現(xiàn) 125
2.12.3 案例:Hystrix的工作流程 126
2.13 故障檢測(cè) 130
2.13.1 固定心跳 130
2.13.2 心跳設(shè)計(jì) 131
2.13.3 TCP Keepalive 132
2.13.4 MQTT Keepalive 133
2.14 故障隔離 133
2.14.1 故障隔離概述 133
2.14.2 故障隔離策略 134
2.15 集群容錯(cuò) 136
2.15.1 失敗轉(zhuǎn)移 136
2.15.2 失敗自動(dòng)恢復(fù) 137
2.15.3 失敗安全策略 137
2.15.4 快速失敗 138
2.16 集群部署 139
2.16.1 停機(jī)部署 139
2.16.2 藍(lán)綠部署 139
2.16.3 滾動(dòng)發(fā)布 141
2.16.4 灰度發(fā)布/金絲雀部署 143
2.16.5 無(wú)損發(fā)布 146
第3章 數(shù)據(jù)庫(kù)高可用 148
3.1 數(shù)據(jù)庫(kù)高可用概述 148
3.1.1 數(shù)據(jù)庫(kù)高可用的重要性 148
3.1.2 MySQL XA協(xié)議 149
3.2 雙節(jié)點(diǎn) 154
3.2.1 主從模式實(shí)現(xiàn)讀寫(xiě)分離 154
3.2.2 讀寫(xiě)分離實(shí)現(xiàn)方案 156
3.2.3 SQL語(yǔ)句執(zhí)行過(guò)程 158
3.2.4 MySQL日志模塊 160
3.2.5 主從數(shù)據(jù)同步 162
3.3 MySQL高可用架構(gòu) 165
3.3.1 MySQL高可用架構(gòu)MMM 165
3.3.2 基于MHA實(shí)現(xiàn)MySQL自動(dòng)故障轉(zhuǎn)移 166
3.3.3 MySQL Cluster架構(gòu) 167
3.3.4 MySQL DRDB Heartbeat架構(gòu) 169
3.3.5 云數(shù)據(jù)庫(kù)高可用架構(gòu) 170
3.4 案例:MySQL一主多從數(shù)據(jù)同步 172
第4章 緩存高可用 177
4.1 緩存概述 177
4.2 緩存高可用概述 178
4.3 客戶端分區(qū)方案 178
4.4 中間代理層方案 179
4.4.1 中間代理層概述 179
4.4.2 Codis架構(gòu) 179
4.5 服務(wù)端方案 181
4.5.1 主從模式 181
4.5.2 哨兵模式 183
4.5.3 Redis集群模式 188
4.5.4 Codis 和 Redis集群的區(qū)別 193
4.5.5 云數(shù)據(jù)庫(kù)Redis 194
第5章 Nginx/LVS高可用 197
5.1 Nginx 197
5.1.1 Nginx概述 197
5.1.2 Nginx Keepalived保障高可用 197
5.2 LVS 198
5.2.1 LVS概述 198
5.2.2 Nginx Keepalived LVS保障高可用、高性能 199
5.3 DNS 200
5.3.1 DNS概述 200
5.3.2 DNS解析過(guò)程 201
5.3.3 DNS負(fù)載均衡 202
5.3.4 DNS LVS Nginx Keepalived 202
第6章 異地多活 204
6.1 異地多活概述 204
6.2 異地多活的類(lèi)型 205
第7章 高可用之全鏈路監(jiān)控、告警 208
7.1 監(jiān)控/告警概述 208
7.1.1 監(jiān)控/告警的意義 208
7.1.2 全鏈路監(jiān)控 209
7.1.3 告警規(guī)則 210
7.1.4 發(fā)送告警 210
7.1.5 監(jiān)控系統(tǒng)通用設(shè)計(jì) 210
7.1.6 監(jiān)控體系案例 211
7.2 日志監(jiān)控/告警方案 212
7.2.1 ELK日志系統(tǒng) 212
7.2.2 日志告警 215
7.3 資源監(jiān)控/告警方案 216
7.3.1 監(jiān)控概述 216
7.3.2 Promethous Grafana InfluxDB 217
7.3.3 其他開(kāi)源監(jiān)控 221
7.3.4 AlertManager告警 223
7.4 鏈路追蹤監(jiān)控 223
第8章 高可用與安全 226
8.1 高可用與安全概述 226
8.2 DoS/DDos攻擊 227
8.2.1 DoS攻擊概述 227
8.2.2 DDoS攻擊的類(lèi)型 227
8.2.3 DoS/DDoS攻擊防護(hù) 229
8.3 安全產(chǎn)品/工具 230
8.3.1 WAF概述 230
8.3.2 WAF的工作模式 231
8.3.3 Nginx ModSecurity 233
8.3.4 云廠商安全產(chǎn)品 235
第9章 秒殺系統(tǒng)案例 236
9.1 什么是秒殺 236
9.2 最簡(jiǎn)單的秒殺系統(tǒng) 237
9.3 業(yè)務(wù)層面控制 238
9.4 CDN靜態(tài)資源緩存 239
9.5 LVS/Nginx高可用設(shè)計(jì) 240
9.6 服務(wù)拆分與隔離設(shè)計(jì) 241
9.7 流量削峰、限流和降級(jí) 243
9.8 熱點(diǎn)數(shù)據(jù)處理 246
9.9 核心的減庫(kù)存 248
9.10 容災(zāi) 254
9.11 秒殺系統(tǒng)安全架構(gòu) 255
參考文獻(xiàn) 258