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