本書從實踐出發(fā),包括了作者參與并主導的3家電商互聯(lián)網(wǎng)公司架構從0到1的構建經歷,從多個角度講解穩(wěn)定、性能、效率、成本四大職責落地經驗,并結合Mikey金字塔進行了部分創(chuàng)新,很多內容都可以直接復用于實際工作。本書分為7篇,分別是開端篇、監(jiān)控篇、故障篇、容量篇、全局視角篇、性能篇和擴展篇。 本書適合互聯(lián)網(wǎng)行業(yè)內的運維人員、SRE和DevOps工程師、架構師、技術團隊負責人及關注用戶體驗的相關開發(fā)者閱讀,也適合掌握了一定的SRE方法論但在實踐中無從下手的讀者閱讀。
王力,資深技術老兵,《Nginx實戰(zhàn):基于Lua語言的配置、開發(fā)與架構詳解》和《高性能之道:SRE視角下的運維架構實踐》作者。15年互聯(lián)網(wǎng)從業(yè)經驗,其中有9年電商互聯(lián)網(wǎng)開發(fā)和運維經驗,這期間擔任過微拍堂運維專家、阿里技術專家、折800運維架構師等,并有5年主導電商大促活動保障的落地經驗,推進過折800、微拍堂兩家電商平臺運維架構從0到1的建設,精通服務的穩(wěn)定性建設,精通高并發(fā)場景下的性能優(yōu)化和中間件開發(fā),擅長通過架構設計來優(yōu)化系統(tǒng)復雜度、降本增效。本書提供了一些補充內容(比如對軟件安裝、配置的講解等),大家可以搜微信公眾號“SRE基礎架構”進行查閱。
目 錄
開端篇 弱化邊界感
第1章 引言 3
1.1 運維架構和SRE 3
1.2 理解業(yè)務,技術為業(yè)務服務 5
1.3 不設邊界 6
1.4 SRE金字塔 6
1.5 總結 7
第2章 重視測試環(huán)境和預發(fā)布環(huán)境 8
2.1 提效和維穩(wěn)的第一道門檻——測試環(huán)境 9
2.1.1 低級錯誤 9
2.1.2 提效分析 10
2.2 “守門員”——預發(fā)布環(huán)境 11
2.2.1 低級錯誤 11
2.2.2 提效分析 12
2.3 兩大環(huán)境問題根本原因溯源 12
2.4 微拍堂測試環(huán)境治理思路介紹 13
2.5 總結 17
監(jiān)控篇 底層邏輯的藝術
第3章 淺談監(jiān)控系統(tǒng)設計 21
3.1 梳理監(jiān)控體系 21
3.2 梳理監(jiān)控指標 22
3.3 變更監(jiān)控 25
3.4 準實時系統(tǒng)監(jiān)控 25
3.5 短時進程追蹤工具 27
3.6 全鏈路監(jiān)控 27
3.7 商業(yè)監(jiān)控平臺的選用建議 28
3.8 監(jiān)控方式:白盒監(jiān)控與黑盒監(jiān)控 29
3.9 從監(jiān)控數(shù)據(jù)中總結規(guī)律 30
3.10 黃金指標 30
3.11 總結 31
第4章 云原生可觀測性開源工具——Kindling 32
4.1 行業(yè)現(xiàn)狀 32
4.2 Kindling解決方案——關聯(lián)內核可觀測性數(shù)據(jù)的Trace 34
4.3 Kindling探針的架構設計理念 37
4.4 Kindling探針架構 38
4.4.1 內核態(tài)程序:drivers 38
4.4.2 用戶態(tài)C/C++程序:kindling-probe 38
4.4.3 用戶態(tài)Go程序:kindling-collector 39
4.4.4 程序間通信方式 40
4.5 在線Demo介紹 41
4.6 案例分享 42
4.6.1 安裝 43
4.6.2 功能介紹 44
4.6.3 穩(wěn)定性價值 47
4.7 總結 48
第5章 高階實戰(zhàn)——打造可持續(xù)維護的閉環(huán)流程 49
5.1 案例:動態(tài)觀測SQL質量流程設計 50
5.1.1 分析規(guī)范難以落地的原因 50
5.1.2 監(jiān)督與管控流程設計 51
5.1.3 通知和統(tǒng)計 57
5.2 案例:WebP格式圖片的規(guī)范和落地實踐 57
5.2.1 規(guī)范無法持續(xù)推廣 57
5.2.2 成本和用戶體驗上的雙贏 58
5.2.3 計劃實施 60
5.2.4 管控機制 60
5.2.5 采集數(shù)據(jù)信息和數(shù)據(jù)加工處理 60
5.2.6 巡檢平臺之規(guī)范化監(jiān)督 61
5.3 案例:管道通信規(guī)范化實踐 62
5.3.1 我們每天都在使用管道 62
5.3.2 管道示例場景及性能說明 64
5.3.3 如何規(guī)范管道使用場景 66
5.4 標準和規(guī)范治理平臺 67
5.4.1 現(xiàn)狀 68
5.4.2 設計思路 68
5.5 總結 72
第6章 挖掘Nginx的監(jiān)控價值 73
6.1 URI指紋服務設計 73
6.2 Nginx日志分析指南 76
6.2.1 參數(shù)白名單 76
6.2.2 URI的響應時間和HTTP狀態(tài)監(jiān)控 77
6.2.3 URI響應字節(jié)數(shù)波動分析 77
6.2.4 查詢URL請求的項目 79
6.2.5 注意HTTPS的透傳 80
6.2.6 利用Nginx完成動態(tài)全鏈路比例調整 81
6.3 總結 82
故障篇 故障的生命周期
第7章 事前治理的方法論 85
7.1 從故障中總結經驗 85
7.2 從系統(tǒng)資源層面和日志中巡檢異常 86
7.3 從標準和規(guī)范中尋找閉環(huán)之路 86
7.4 從業(yè)務中挖掘基礎服務的使用問題 87
7.5 技術風險防控運營成本 87
7.6 總結 88
第8章 變更管控設計思路 89
8.1 變更管控 89
8.1.1 變更對象 89
8.1.2 變更發(fā)布 90
8.1.3 變更可灰度 91
8.1.4 變更可回滾 92
8.1.5 變更可監(jiān)控 92
8.1.6 配置項變更 92
8.1.7 變更管控思路 92
8.2 JumpServer使用的藝術及工單交互 96
8.3 變更三板斧:運維團隊的可監(jiān)控、可灰度、可回滾實踐 98
8.3.1 案例:云服務器資源伸縮穩(wěn)定性 98
8.3.2 案例:CDN OpenResty的變更策略 102
8.4 總結 106
第9章 輪值的設計思路 107
9.1 值班模式探究 108
9.1.1 讓開發(fā)人員參與其中 108
9.1.2 制定KPI 109
9.1.3 值班人員的邊界探討 110
9.2 值班機器人 111
9.3 提升值班價值——SRE需求池設計 112
9.3.1 結合日常巡檢與非值班時間 112
9.3.2 在煩瑣的工作中收集需求 112
9.4 總結 113
第10章 故障演練與應急預案 114
10.1 故障演練緣由 114
10.1.1 更好地面對系統(tǒng)規(guī)模增長帶來的復雜性 115
10.1.2 提升故障的排查速度 115
10.1.3 驗證應急預案的正確性 115
10.1.4 驗證基礎設施的穩(wěn)定性 116
10.1.5 驗證監(jiān)控感知能力 116
10.1.6 驗證應急流程的順暢度 116
10.2 故障演練流程 116
10.2.1 故障演練場景關鍵要素 116
10.2.2 故障演練預期 117
10.3 應急預案 119
10.3.1 應急場景標準化 120
10.3.2 梳理應急預案清單 120
10.4 總結 121
第11章 應急響應流程實踐 122
11.1 收攏故障上報來源 122
11.1.1 從技術體系內部發(fā)現(xiàn) 122
11.1.2 從技術體系外部發(fā)現(xiàn) 123
11.2 建立應急小組 123
11.2.1 人多力量弱 123
11.2.2 穩(wěn)定性接口人和崗位權限 123
11.2.3 完善客訴標準化術語 124
11.3 故障噪點治理 124
11.3.1 報警治理 124
11.3.2 設計外部反饋閾值 125
11.3.3 收集第三方抖動事件 125
11.4 控制應急節(jié)奏 126
11.4.1 舍小保大 126
11.4.2 “優(yōu)先止血”,后續(xù)定位根本原因 127
11.4.3 及時同步信息,減少信息差 127
11.5 應急“止血”的常見操作 127
11.5.1 代碼回滾 127
11.5.2 重啟 128
11.5.3 時序監(jiān)控下的限流、熔斷、擴容 129
11.5.4 業(yè)務降級 130
11.5.5 阻斷慢查詢 131
11.5.6 網(wǎng)絡與運營商 131
11.5.7 重識監(jiān)控 132
11.6 總結 132
第12章 靜態(tài)容災降級系統(tǒng) 133
12.1 荊棘之路 134
12.2 設計之路 136
12.3 架構流程圖 138
12.3.1 反向代理系統(tǒng) 138
12.3.2 日志分析系統(tǒng) 138
12.3.3 后臺系統(tǒng)——利用URI指紋服務 138
12.3.4 爬蟲系統(tǒng) 139
12.3.5 容災的緩存系統(tǒng) 140
12.3.6 基于時間的版本用途 140
12.3.7 異地容災 141
12.4 核心代碼解說 142
12.4.1 Ngx_Lua應用 142
12.4.2 爬蟲和日志分析系統(tǒng)的關系 143
12.4.3 完全容災和部分容災功能 144
12.5 靜態(tài)容災的智能關閉方案 145
12.5.1 從日志分析系統(tǒng)復制請求 145
12.5.2 利用GoReplay復制流量 145
12.5.3 利用Nginx的mirror鏡像功能 146
12.5.4 灰度驗證容災系統(tǒng)緩存——閉環(huán)設計 147
12.6 替換爬蟲的新思路 148
12.7 總結 148
第13章 基于OpenResty的動態(tài)限流設計思路 150
13.1 常見反向代理限流方案缺點分析 150
13.2 動態(tài)限流設計思路 151
13.3 多維度限流 154
13.4 智能感知響應能力動態(tài)控速設計方案 157
13.5 屏蔽慢請求帶來的服務阻塞 159
13.6 總結 160
第14章 故障復盤 161
14.1 復盤前 161
14.2 復盤中 161
14.3 復盤后 164
14.4 自省 164
14.5 跨部門分享 165
14.6 故障庫 165
14.7 總結 165
容量篇 性能與成本間的平衡
第15章 成本優(yōu)化 169
15.1 成本優(yōu)化事前準備 169
15.1.1 目標的制定和價值體現(xiàn) 170
15.1.2 IT成本與人力成本的權衡 170
15.1.3 提升對系統(tǒng)的理解 171
15.1.4 評估優(yōu)化前后的數(shù)據(jù)統(tǒng)計及業(yè)務影響 171
15.1.5 從用戶體驗看待成本優(yōu)化 173
15.1.6 梳理業(yè)務和資源的關系 173
15.2 公有云基礎資源優(yōu)化實踐 174
15.2.1 成本管理白皮書 174
15.2.2 合理化資源使用率 177
15.2.3 自建產品和云產品的使用場景優(yōu)化 178
15.2.4 基于業(yè)務場景的成本控制 179
15.3 總結 180
第16章 智能伸縮平臺 181
16.1 彈性伸縮平臺關鍵路徑盤點 181
16.2 基礎設施建設 182
16.2.1 基于Pod的HPA傳統(tǒng)模式 182
16.2.2 基于Cluster-Autoscaler的Node伸縮 184
16.3 基于業(yè)務場景的實戰(zhàn) 189
16.3.1 定時伸縮 189
16.3.2 基于預測的彈性伸縮 191
16.4 風險控制體系 199
16.4.1 動態(tài)限流觸發(fā)規(guī)則 199
16.4.2 擴容節(jié)點失敗和業(yè)務降級 200
16.5 總結 200
第17章 容量規(guī)劃 201
17.1 容量規(guī)劃現(xiàn)狀 201
17.2 容量規(guī)劃建設思路 202
17.2.1 建設核心 202
17.2.2 建設思路 203
17.3 應用系統(tǒng)容量規(guī)劃說明 204
17.4 基于巡檢模式的容量評估流程 205
17.4.1 對流量來源的梳理 205
17.4.2 對容量對象的梳理 206
17.4.3 收集日常關鍵性數(shù)據(jù) 207
17.5 對容量規(guī)劃關注點的梳理 210
17.5.1 壓力測試 210
17.5.2 業(yè)務放量 212
17.5.3 大促活動 213
17.5.4 秒殺業(yè)務 214
17.5.5 關注運營活動計劃 214
17.5.6 尖刺限流 215
17.6 總結 215
第18章 編程能力 216
18.1 養(yǎng)成寫偽代碼的習慣 216
18.2 養(yǎng)成管理代碼的習慣 217
18.3 編程能力分級 218
18.4 編程能力更深層的價值探討 219
18.4.1 如何看待PHP短連接問題 219
18.4.2 理解Redis和Memcached在業(yè)務場景上的區(qū)別 220
18.4.3 進程、線程、協(xié)程在Linux系統(tǒng)中的表現(xiàn) 221
18.4.4 探究阻塞和非阻塞、異步和同步在系統(tǒng)中的表現(xiàn) 223
18.4.5 共享內存 224
18.4.6 嘗試一些導致進程崩潰的操作 224
18.4.7 學習秒殺系統(tǒng)的業(yè)務架構 225
18.4.8 給自己的代碼做閉環(huán)實踐 226
18.4.9 參與業(yè)務開發(fā)日常 226
18.5 熟悉編程語言特性 226
18.6 通過系統(tǒng)分析倒推應用配置問題 227
18.6.1 通過access函數(shù)發(fā)現(xiàn)PHP性能問題 227
18.6.2 Java連接池失效 228
18.7 總結 229
全局視角篇 運維破圈
第19章 開啟測試視角 233
19.1 測試人員的職責邊界 233
19.2 壓力測試 234
19.2.1 壓測黑名單思維 235
19.2.2 壓測利器Wrk 235
19.2.3 流量鏡像工具GoReplay 235
19.3 自動化測試監(jiān)控平臺設計 237
19.3.1 “牽一發(fā)而動全身”的迭代 238
19.3.2 OpenDiffy介紹 238
19.3.3 變更管控的支撐系統(tǒng)OpenDiffy+GoReplay 239
19.4 破壞性測試探究 239
19.5 從前端的體驗“找碴兒” 240
19.5.1 基于瀏覽器特性的服務優(yōu)化 240
19.5.2 從圖片加載中尋找優(yōu)化方法 241
19.5.3 數(shù)據(jù)埋點的發(fā)送頻率 242
19.5.4 域名的使用限制 243
19.5.5 請求重復性 243
19.5.6 PageSpeed Insights分析頁面的加載 243
19.5.7 定期的內耗分析 245
19.6 總結 245
第20章 開啟用戶視角 246
20.1 內外兼顧 246
20.1.1 內部用戶 247
20.1.2 外部用戶 248
20.2 建立反饋機制 249
20.2.1 優(yōu)化客服反饋機制 249
20.2.2 與客服合作的案例分享 249
20.2.3 獎勵機制 250
20.2.4 關注輿情 250
20.3 產品體驗——谷歌SRE的高階思維 251
20.3.1 不僅僅是體驗 251
20.3.2 交互煩瑣 252
20.3.3 無人問津 252
20.3.4 ROI 252
20.4 防御體系的“誤傷”指南 253
20.4.1 WAF“誤傷” 253
20.4.2 內部風控“誤傷” 254
20.5 關注客戶端環(huán)境 254
20.5.1 客戶端機型配置 254
20.5.2 網(wǎng)絡 255
20.6 總結 255
第21章 開啟前端和App開發(fā)人員視角 256
21.1 概述 256
21.2 為什么要解決性能問題 257
21.3 緩存 257
21.3.1 強緩存 257
21.3.2 協(xié)商緩存 259
21.4 網(wǎng)絡請求 261
21.4.1 HTTP/2.0 261
21.4.2 DNS預解析 262
21.4.3 預先建立連接 262
21.4.4 服務器應該避免過多重定向 263
21.5 客戶端計算 263
21.6 預加載 265
21.7 梳理技術風險 265
21.7.1 請求阻塞式串行加載 266
21.7.2 埋點發(fā)送過于頻繁 266
21.7.3 弱網(wǎng)下的資源加載降級 266
21.7.4 撥測 266
21.8 總結 267
第22章 DNS應用場景實踐 268
22.1 利用DNS完成故障轉移 268
22.2 使用HTTPDNS提升訪問穩(wěn)定性 271
22.3 提升測試、A/B測試等環(huán)境的切換效率 273
22.4 域名反向解析用途實踐 273
22.5 內部DNS系統(tǒng)高可用實踐 274
22.5.1 兩次DNS故障 275
22.5.2 問題和思考 276
22.5.3 改進措施 278
22.5.4 配置及驗證 279
22.5.5 監(jiān)控 283
22.6 總結 284
性能篇 SRE進階之路
第23章 高并發(fā)網(wǎng)關價值探究 287
23.1 通用功能介紹 287
23.2 網(wǎng)關中的聚合模式 288
23.2.1 Lura啟示錄 289
23.2.2 APISIX中的batch-requests插件 289
23.2.3 從GraphQL發(fā)現(xiàn)的技術實踐思路 291
23.3 兼顧緩存的網(wǎng)關設計思路 293
23.3.1 APISIX的proxy-cache插件 293
23.3.2 利用聚合拼接緩存資源 293
23.3.3 鑒權和緩存剝離 294
23.4 總結 295
第24章 高性能Varnish緩存系統(tǒng) 296
24.1 HTTP緩存對后端服務的價值分析 296
24.2 CDN緩存和Varnish緩存的共存模式 298
24.3 安裝Varnish和所需模塊 299
24.4 配置文件概覽 300
24.5 穩(wěn)定性建設所依賴的功能 300
24.5.1 神圣模式 300
24.5.2 寬限模式——異步緩存更新 302
24.5.3 更安穩(wěn)的軟清除 303
24.6 最佳實踐 304
24.6.1 動態(tài)緩存時間配置 304
24.6.2 熱Key及秒殺系統(tǒng)的緩存實踐 305
24.6.3 后端服務故障轉移 306
24.6.4 高并發(fā)下Varnish啟動參數(shù)優(yōu)化 307
24.6.5 Varnish配置模板優(yōu)化實踐 307
24.6.6 測試環(huán)境緩存系統(tǒng)的干擾事件 309
24.7 總結 309
第25章 SRE漏斗優(yōu)化法則 310
25.1 SRE性能優(yōu)化之漏斗優(yōu)化法則 311
25.2 漏斗優(yōu)化法則的技術棧梳理 312
25.2.1 減少訪問量 312
25.2.2 減少返回的數(shù)據(jù) 313
25.2.3 減少交互次數(shù) 313
25.2.4 降低CPU、內存使用率 314
25.2.5 提升資源利用率 314
25.3 總結 315
第26章 awesome性能分析工具 316
26.1 站在巨人的肩膀上工作 316
26.1.1 系統(tǒng)性能分析常見清單 317
26.1.2 bcc-tools工具清單 319
26.1.3 火焰圖 320
26.2 Netdata 320
26.3 總結 321
第27章 性能優(yōu)化實踐錦集 322
27.1 TIME_WAIT優(yōu)化方案擴展 322
27.2 利用Ngx_Lua縮短請求鏈路 323
27.3 eBPF在Kubernetes上的應用 325
27.3.1 kubectl-trace 325
27.3.2 使用前提 325
27.3.3 使用優(yōu)點 325
27.3.4 使用場景 326
27.3.5 安裝 326
27.4 善用CDN 327
27.4.1 靜態(tài)加速 327
27.4.2 動態(tài)加速 328
27.4.3 緩存過期保護策略 328
27.5 記一次中臺服務優(yōu)化實戰(zhàn) 329
27.5.1 尋找優(yōu)化目標 330
27.5.2 抽絲剝繭——嘗試優(yōu)化方案 331
27.5.3 使用go pprof火焰圖發(fā)現(xiàn)端倪 333
27.5.4 回顧復盤 337
27.6 總結 337
擴展篇 在團隊間搭建橋梁
第28章 業(yè)務開發(fā)人員視角下的技術風險 341
28.1 了解業(yè)務開發(fā)人員 342
28.1.1 工作內容 342
28.1.2 廢棄十年如一日 343
28.1.3 重構并非易事 343
28.1.4 發(fā)布前的檢查清單 344
28.1.5 站在巨人的肩膀上編程 344
28.1.6 拒絕偽需求 345
28.2 大淘客之旅 346
28.2.1 對話高層,達成共識 346
28.2.2 對話業(yè)務線負責人 347
28.2.3 重識目標,各個擊破 347
28.2.4 技術氛圍和激勵政策 348
28.2.5 “曲線救國”的技術路線 348
28.3 總結 351
第29章 SRE視角全篇總結 352
29.1 齊心協(xié)力 353
29.1.1 關鍵要素 353
29.1.2 華山論劍 353
29.2 競品分析——最后1公里 355
29.3 故障降級系統(tǒng)——來自監(jiān)控的溝通藝術 355
29.3.1 抽象業(yè)務形態(tài) 355
29.3.2 抽象監(jiān)控觸發(fā)條件 357
29.3.3 收攏零散性的自愈任務 357
29.4 重識CMDB價值 357
29.5 總結 358