混沌工程:通過可控故障實驗提升軟件系統可靠性 Chaos Engineering: Site Reliability Through Controlled Disruption

Mikolaj Pawlikowski

買這商品的人也買了...

商品描述

混沌工程是一種有意的實驗實踐,旨在發現系統性問題。
在本書中,我們將探討為什麼、何時以及如何應用混沌工程來改善你的計算機系統。
你將學習通過一系列模擬真實故障的測試來運行應用程序和基礎設施。
通過學習像混沌工程師一樣思考,以及學習設計適當的實驗來確保軟件的可靠性,
你將掌握混沌工程的理論與技術,並將其應用於實際的系統中

目錄大綱

推薦序一
推薦序二
譯者序
序言一
序言二
前言
致謝
作者簡介
第1章進入混沌工程的世界 1
1.1 什麼是混沌工程 2
1.2 混沌工程的動機 3
1.2.1 評估風險和成本,並設定SLI、SLO和SLA 3
1.2.2 在整體上測試系統 4
1.2.3 找到“湧現性”特性 5
1.3 混沌工程的四個步驟 5
1.3.1 確保可觀測性 7
1.3.2 定義穩態 8
1.3.3 形成假設 9
1.3.4 運行實驗並證明(或反駁)
你的假設 9
1.4 什麼不是混沌工程10
1.5 初識混沌工程11
1.5.1 FizzBuzz即服務11
1.5.2 漫漫長夜11
1.5.3 後續12
1.5.4 混沌工程簡述13
總結13
第一部分混沌工程基礎
第2章來碗混沌與爆炸半徑17
2.1 設置使用本書中的代碼17
2.2 場景18
2.3 Linux取證101 20
2.3.1 退出碼20
2.3.2 終止進程21
2.3.3 內存溢出殺手23
2.4 第一個混沌實驗25
2.4.1 確保可觀測性29
2.4.2 定義穩態29
2.4.3 形成假設30
2.4.4 運行實驗30
2.5 爆炸半徑31
2.6 深入挖掘33
2.6.1 拯救世界35
總結36
第3章可觀測性38
3.1 應用程序運行緩慢39
3.2 USE方法39
3.3 資源41
3.3.1 系統概述43
3.3.2 block I/O 44
3.3.3 網絡48
3.3.4 RAM 52
3.3.5 CPU 59
3.3.6 操作系統65
3.4 應用程序67
3.4.1 cProfile 68
3.4.2 BCC和Python 69
3.5 自動化:使用時序數據庫71
3.5.1 Prometheus和Grafana 71
3.6 延伸閱讀74
總結75
第4章數據庫故障和生產環境中的
測試76
4.1 我們在做WordPress 76
4.2 弱點78
4.2.1 實驗1:磁盤慢了79
4.2.2 實驗2:網絡慢了83
4.3 在生產環境中測試88
總結90
第二部分混沌工程實戰
第5章剖析Docker 93
5.1 我的(Docker化的)應用程序
運行緩慢94
5.1.1 架構94
5.2 Docker簡史95
5.2.1 仿真、模擬和虛擬化95
5.2.2 VM和容器97
5.3 Linux容器和Docker 99
5.4 Docker原理102
5.4.1 使用chroot變更進程的
路徑102
5.4.2 實現一個簡單的容器(-ish)
第1部分:使用chroot 105
5.4.3 實驗1:一個容器可以阻止
另一個容器寫磁盤嗎107
5.4.4 使用Linux命名空間隔離
進程111
5.4.5 Docker和命名空間114
5.5 實驗2:終止其他PID命名空間
中的進程116
5.5.1 實現一個簡單的容器(-ish)
第2部分:命名空間118
5.5.2 使用cgroups限制進程的資源
使用120
5.6 實驗3:使用你能找到的所有
CPU 126
5.7 實驗4:使用過多內存128
5.7.1 實現一個簡單的容器(-ish)
第3 部分:cgroups 130
5.8 Docker和網絡133
5.8.1 capabilities和seccomp 137
5.9 Docker揭秘140
5.10 修復我的(Docker化的)應用
程序運行緩慢的問題141
5.10.1 啟動Meower 141
5.10.2 為什麼應用程序運行緩慢143
5.11 實驗5:使用Pumba讓容器的
網絡變慢143
5.11.1 Pumba:Docker混沌工程
工具143
5.11.2 運行混沌實驗144
5.12 其他主題147
5.12.1 Docker daemon重啟148
5.12.2 鏡像layer的存儲148
5.12.3 高級網絡148
5.12.4 安全149
總結149
第6章你要調用誰?系統調用
破壞者150
6.1 場景:恭喜你升職了150
6.1.1 System X:如果大家都在
用,但沒人維護,是不是
廢棄軟件151
6.2 簡單回顧系統調用153
6.2.1 了解系統調用154
6.2.2 使用標準C庫和glibc 156
6.3 如何觀測進程的系統調用158
6.3.1 strace和sleep 158
6.3.2 strace和System X 161
6.3.3 strace的問題:開銷162
6.3.4 BPF 163
6.3.5 其他選擇166
6.4 為樂趣和收益阻塞系統調用
第1部分:strace 167
6.4.1 實驗1:破壞close系統
調用167
6.4.2 實驗2:破壞write系統
調用171
6.5 為樂趣和收益阻塞系統調用
第2部分:seccomp 173
6.5.1 seccomp 的簡單方法:使用Docker 173
6.5.2 seccomp 的困難方法:使用libseccomp 175
總結177
第7章JVM故障注入178
7.1 場景178
7.1.1 FizzBuzzEnterpriseEdition 
介紹179
7.1.2 環顧FizzBuzzEnterprise-
Edition 179
7.2 混沌工程和Java 180
7.2.1 實驗的思路181
7.2.2 實驗的計劃182
7.2.3 JVM字節碼簡介183
7.2.4 實驗的實現190
7.3 已有的工具196
7.3.1 Byteman 196
7.3.2 Byte-Monkey 198
7.3.3 Spring Boot的Chaos 
Monkey 200
7.4 延伸閱讀200
總結201
第8章應用級故障注入202
8.1 場景202
8.1.1 實現細節:混沌之前204
8.2 實驗1:Redis延遲208
8.2.1 實驗1的計劃209
8.2.2 實驗1的穩態209
8.2.3 實驗1的實現210
8.2.4 實驗1的執行212
8.2.5 實驗1的討論213
8.3 實驗2:失敗的請求213
8.3.1 實驗2的計劃214
8.3.2 實驗2的實現214
8.3.3 實驗2的執行215
8.4 應用程序與基礎設施216
總結217
第9章我的瀏覽器中有一隻“猴子” 218
9.1 場景218
9.1.1 Pgweb 219
9.1.2 Pgweb實現細節220
9.2 實驗1:增加延遲222
9.2.1 實驗1的計劃223
9.2.2 實驗1的穩態223
9.2.3 實驗1的實現224
9.2.4 實驗1的執行226
9.3 實驗2:添加故障227
9.3.1 實驗2的實現227
9.3.2 實驗2的執行229
9.4 其他好知道的話題229
9.4.1 Fetch API 229
9.4.2 Throttling 230
9.4.3 工具:Greasemonkey和Tampermonkey 232
總結232
第三部分Kubernetes中的混沌工程
第10章Kubernetes中的混沌235
10.1 將東西移植到Kubernetes 236
10.1.1 High-Profile 項目文檔237
10.1.2 Goldpinger是什麼237
10.2 Kubernetes是什麼238
10.2.1 Kubernetes簡史238
10.2.2 Kubernetes能為你做
什麼239
10.3 搭建Kubernetes集群241
10.3.1 使用Minikube 241
10.3.2 啟動一個集群241
10.4 測試運行在Kubernetes上的
軟件243
10.4.1 運行ICANT項目243
10.4.2 實驗1:終止50%的
Pod 251
10.4.3 派對技巧:時尚地終止
Pod 256
10.4.4 實驗2:引入網絡緩慢257
總結267
第11章自動化Kubernetes實驗268
11.1 使用PowerfulSeal自動化
混沌268
11.1.1 PowerfulSeal是什麼269
11.1.2 安裝PowerfulSeal 270
11.1.3 實驗1b:終止50%的
Pod 271
11.1.4 實驗2b:引入網絡緩慢273
11.2 持續測試和服務水準目標276
11.2.1 實驗3:驗證Pod在創建後
幾秒內是否準備就緒277
11.3 雲層282
11.3.1 雲提供商API、可用區282
11.3.2 實驗4:關閉VM 284
總結286
第12章Kubernetes底層工作原理287
12.1 Kubernetes集群剖析以及如何
破壞它287
12.1.1 控制平面288
12.1.2 Kubelet和pause容器295
12.1.3 Kubernetes、Docker以及
容器運行時297
12.1.4 Kubernetes網絡300
12.2 關鍵組件總結304
總結304
第13章混沌工程與人305
13.1 混沌工程思維305
13.1.1 故障不是一種可能:它會
發生306
13.1.2 早失敗與晚失敗307
13.2 獲得支持308
13.2.1 經理308
13.2.2 團隊成員309
13.2.3 遊戲日309
13.3 將團隊當成分佈式系統310
13.3.1 查找知識單點故障:
宅度假312
13.3.2 團隊內部的錯誤信息和
信任313
13.3.3 團隊中的瓶頸:慢車道上的
生活313
13.3.4 測試你的流程:內部
工作314
總結315
附錄
附錄A 安裝混沌工程工具318
附錄B 突擊測驗答案325
附錄C 導演剪輯333
附錄D 混沌工程食譜337
後記343