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