序
我們生活在一個有趣的時代,可以稱它是一個軟件的寒武紀大爆炸。在這個過程中,構建新系統(tǒng)的成本呈數(shù)量級式下降,同時系統(tǒng)之間的關聯(lián)程度也呈同等數(shù)量級的增長。借助于Amazon的AWS、微軟的Azure和Google的GCP等資源,我們可以將系統(tǒng)在物理上擴展到一個幾年前還只能想象的規(guī)模。
這些資源及其似乎無限的能力,正在以各種前所未見的方式,將新的思想、產(chǎn)品和市場極其快速地傳播出去。但是,只有當我們構建的系統(tǒng)可以保持擴展的同時,所有這些探索才能成為可能。與以前相比,雖然構建小型系統(tǒng)變得容易很多,但是構建一個可以快速、可靠擴展的系統(tǒng),并不像增加更多的硬件和存儲空間那么容易,實際證明,這要難得多。
每個軟件系統(tǒng)都會經(jīng)歷一個可預見的生命周期,從一個人能夠完全理解的、小型的、設計精妙的解決方案,迅速增長為一個積累了大量技術債務的龐大系統(tǒng),隨后又逐漸分裂成由一些不完善的服務隨機組成的組合,并最終演化成在廣度(更多用戶)和深度(更多功能)方面均可穩(wěn)定擴展的、設計良好的分布式系統(tǒng)。對于這樣的系統(tǒng)來說,我們很容易從外部了解要做哪些事情(讓它變得更加可靠!),但又很難了解它內(nèi)部的細節(jié)。幸運的是,本書是一本關于這方面不可或缺的指南,從可用性到服務層,從比賽日到風險模型,Lee一步步介紹了影響大規(guī)模系統(tǒng)的各個關鍵因素和實踐方式。
Lee加入我們的時候,是NewRelic第一次從僅擁有一個產(chǎn)品正在向多個產(chǎn)品轉型的時期,當時我們正沉浸在用戶極速增長和公司成功的喜悅中。Lee的到來,為我們帶來了他在Amazon的豐富經(jīng)驗,不管是零售業(yè)務還是AWS業(yè)務都曾經(jīng)歷過巨大的增長。Lee曾是這些團隊的領頭人,曾經(jīng)積極參與過與可擴展性有關的所有事情,也遇到過很多失敗。對我們來說,幸運的是,他已經(jīng)經(jīng)歷過這些挫折與困苦,其中的教訓可以讓我們避免再犯同樣的錯誤。
在Lee加入NewRelic之前,多年以來,我們一直經(jīng)歷著系統(tǒng)服務不可用的尷尬處境。我們原有的龐大系統(tǒng)也逐漸無法支持業(yè)務的發(fā)展,不管是可用性、可靠性還是性能都不是很好。但是,通過充分運用Lee在本書中所寫的各項技巧,我們逐漸克服了這些困難,并構建了如今穩(wěn)定可靠的企業(yè)級服務。其中我們使用的一個工具,建立了可用性工程的四個級別:青銅、白銀、黃金和白金。要達到青銅級,團隊必須擁有風險模型以及預定義的SLA標準。要達到白銀級,團隊必須能夠監(jiān)控風險模型中標識出來的問題,并使用比賽日的方式來解決。黃金級意味著風險已經(jīng)被緩解掉了。白金級如同CMM5級一樣,不僅系統(tǒng)可以自愈,而且我們關注持續(xù)性的改進。我們首先集中精力對第一級的服務進行改進,然后上升到第二級的服務,逐步推進,最終使得所有團隊都至少達到了白銀級,并且大多數(shù)團隊通過了黃金級,甚至有幾個團隊達到了白金級。
后來我加入了InVisionApp這個更年輕的公司。我又一次經(jīng)歷著從早期成功向高速增長的過程,一直推動大家去使用Lee之前帶給我的技術和工具。在這個新系統(tǒng)、新產(chǎn)品、新公司的爆炸年代,我強烈建議大家跟我做一樣的事:向Lee學習如何構建可伸縮的系統(tǒng)。
——BjornFreeman-Benson博士,InVisionApp首席技術官
前言
當應用程序開始增長時,通常會出現(xiàn)兩件事情:它們明顯變得更加復雜(也更加脆弱),并且需要處理顯著增加的流量(需要更先進、更復雜的管理機制)。這會讓應用程序逐漸陷入一個死亡漩渦,用戶會不斷經(jīng)歷著限流、宕機以及其他服務質(zhì)量和可用性方面的問題。
但是你的用戶不會關心這些。他們只希望使用應用來做他們希望做的事情。如果你的應用程序宕機、響應緩慢或者信息不一致,用戶會馬上拋棄你,轉而投靠能夠幫助他們處理生意的競爭對手。
本書可教會你一些如何構建并管理大規(guī)模應用程序的基本技巧,幫助你避免陷入如上所述的死亡漩渦。一旦你掌握了這些技巧,你的系統(tǒng)就能夠可靠處理海量的流量,從容面對流量中大量的不確定性,同時不會對用戶期望造成任何影響。
本書的讀者對象
本書的目標讀者包括構建和管理大規(guī)模應用程序和系統(tǒng)的軟件工程師、架構師、技術經(jīng)理以及總監(jiān)。如果你管理著軟件開發(fā)人員、系統(tǒng)可靠性工程師、DevOps工程師,或者你經(jīng)營著一個擁有大規(guī)模應用程序和系統(tǒng)的機構,本書中所提供的建議和指導都能夠幫助你,讓你的系統(tǒng)運行得更加平穩(wěn)和可靠。
如果你的應用程序已經(jīng)從很小的規(guī)模變得很大(并且正在經(jīng)歷著增長所帶來的各種問題),你可能正在為系統(tǒng)的低可靠性和低可用性煩惱。如果你正在頭疼如何管理技術債務以及相關的系統(tǒng)故障,本書恰好提供了這些方面的指導,能夠幫助你通過降低技術債務,讓應用程序更輕松地擴展到更大規(guī)模。
編寫本書的原因
在Amazon零售和AWS業(yè)務多年從事構建高可伸縮應用程序之后,我加入了NewRelic這個正在迅速成長的公司。當時,NewRelic已經(jīng)感受到了因為缺少管理高可伸縮應用程序的系統(tǒng)、流程所帶來的痛苦,但是尚未完整形成能夠擴大其應用程序規(guī)模的流程和規(guī)范。
在NewRelic,我親眼目睹了一個公司在擴張規(guī)模過程中所經(jīng)歷的痛苦與掙扎,同時也意識到,還有很多其他公司每天都在經(jīng)歷著這些痛苦。
編寫本書的初衷,是為了幫助那些正在面對其應用程序高速增長的人們,使其了解到一些有用的流程和最佳實踐,避免他們再掉入規(guī)模擴張過程的各種陷阱之中。
無論你的應用程序每年增長十倍還是百分之十,也無論增長的是用戶數(shù)量、交易數(shù)量、數(shù)據(jù)存儲量還是代碼復雜性,本書都可以在構建和維護應用程序方面為你提供幫助,讓它們在保持高可用性的前提下實現(xiàn)增長。
現(xiàn)在我們所說的規(guī)模
基于云的服務正在以極快的速度增長和擴張。這主要歸功于對云服務的大量需求,“軟件即服務(SaaS)”逐漸成為應用程序開發(fā)的標準。由于SaaS應用程序天生多租戶的特點,它們對于規(guī)模上的問題尤其敏感。
隨著世界的改變,以及我們對SaaS服務、云服務、海量應用程序越來越多的關注,規(guī)模性問題也變得越來越重要。似乎我們看不到,云應用程序在體積和復雜性方面會出現(xiàn)增長到頭的情況。
關鍵的機制在于,我們當前用來管理大規(guī)模系統(tǒng)的前沿科技,很可能會成為明天的基礎工具,而明天我們可能遇到的規(guī)模問題,也會讓當前的解決方案相形見絀。我們需要越來越復雜的系統(tǒng)和架構,來處理將來可能無限增長的規(guī)模。
本書的目的,就是為了提供可以禁得起時間考驗的知識。
本書導讀
管理規(guī)模并不只是管理流量,還包括管理風險和可用性。通常來說,所有這些東西都是描述相同問題的不同方式,并且它們息息相關。因此,為了能夠合理地討論規(guī)模問題,我們還必須考慮到可用性、風險管理以及像微服務和云服務這樣的現(xiàn)代架構模型。因此,本書按照如下章節(jié)來劃分內(nèi)容。
第Ⅰ部分:可用性
當某個應用程序開始擴張規(guī)模時,可用性和可用性管理通常是最先受到影響的部分。
第1章,什么是可用性為了更好地讓讀者理解,我們會講解一下高可用性的意義,以及它與可靠性之間的區(qū)別。
第2章,提高應用程序可用性的五個要點
在本章中,我針對如何提高應用程序的可用性提出了五個核心方向。
第3章,測量可用性
本章會介紹一種測量可用性的標準算法,并進一步講解高可用性的作用和價值。
第4章,提高下降的可用性如果你的應用程序正遇到可用性的問題(或者你想知道這是否正在發(fā)生),我們提供了一些管理手段,來幫助你提高應用程序的可用性。
第Ⅱ部分:風險管理
理解系統(tǒng)中的風險,對于提高應用程序的可用性,以及它后續(xù)向更大規(guī)模發(fā)展的能力是至關重要的。
第5章,什么是風險管理
本章會通過介紹風險管理的基本知識,引出如何管理高可伸縮應用程序的話題。
第6章,可能性與嚴重性本章會討論風險發(fā)生時的嚴重性與可能性之間的區(qū)別。它們都非常重要,但是方式不同。
第7章,風險模型
在本章中,我會以一個精心設計的系統(tǒng)為例,來幫助你理解和管理系統(tǒng)中的風險。
第8章,風險緩和
本章會討論如何處理系統(tǒng)中已知的風險,并減少它們對應用程序的影響。
第9章,比賽日本章會介紹如何對風險管理計劃、風險緩和計劃以及容災計劃進行持續(xù)的測試和評估。本章回顧了在生產(chǎn)環(huán)境實現(xiàn)比賽日所需的技術,以及它所帶來的好處。
第10章,構建低風險系統(tǒng)
在本章中,我會給出如何降低應用程序中的風險,以及如何構建低風險系統(tǒng)的建議。
第Ⅲ部分:服務和微服務
服務和微服務都是一種架構方案,用于構建需要更大規(guī)模運行的、更加大型且復雜的應用程序。
第11章,為什么使用服務
本章會介紹為什么服務對于構建高度可擴展的應用程序如此重要。
第12章,使用微服務
在本章中,我會介紹如何創(chuàng)建基于微服務的架構,主要關注于如何對服務大小進行合理分割,確定服務的邊界,以便提高可擴展性和可用性。
第13章,處理服務故障
在本部分的最后一章中,我們會來討論如何構建能夠處理故障的服務。
第Ⅳ部分:如何讓應用程序具有伸縮性
“伸縮”其實不僅僅與流量有關,它關系你的組織,以及你的組織如何來響應更大的應用程序需求。
第14章,兩次失誤的高度
本章會介紹如何在出現(xiàn)故障的情況下,依然能夠通過伸縮系統(tǒng)來保持高可用性。
第15章,服務所有權
本章會講解,關注服務的所有權,能如何幫助你擴展組織和應用程序。
第16章,服務分級
本章會介紹如何區(qū)分各個服務的關鍵程度,從而幫助管理對服務的期望。
第17章,使用服務分級
當制訂服務分級制度之后,我們會介紹如何通過它來管理服務故障的影響、響應性需求以及期望管理。
第18章,服務等級協(xié)議
在本章中,我們會討論如何使用SLA來管理服務所有者之間的相互依賴。
第19章,持續(xù)改進
本章會就如何改進應用程序整體的可擴展性,提供相應的技術和指導。
第Ⅴ部分:云服務
對于構建和管理需要極強可伸縮能力的大型、關鍵性系統(tǒng)來說,基于云的服務正在變得日益重要。
第20章,變化和云服務本章介紹了云服務對構建高度可伸縮的Web應用程序所帶來的改變。
第21章,云上的
目錄
序. .......................... xv
前言. ......................xvii
第 1章 什么是可用性... 2
可用性與可靠性 ............................................... 3
什么導致了低可用性 ....................................... 4
第 2章 提高應用程序可用性的五個要點......................................... 6
要點 1:時刻考慮應對故障 ............................. 7
要點 2:時刻考慮如何伸縮 ............................. 8
要點 3:緩和風險 ............................................ 9
要點 4:監(jiān)控可用性 ...................................... 10
要點 5:以預測和確定的方式來應對可用性問題 ...................................................... 11
做好準備 ........................................................ 12
第 3章 測量可用性... 13
N個 9 14
什么樣的可用性是合理的 ...................... 14
不要上當 ........................................................ 14
通過數(shù)字來體現(xiàn)可用性.................................. 15
測試并跟蹤當前的可用性 .............................. 17
將手動流程自動化 ......................................... 17
自動化部署............................................. 18
配置管理 ................................................ 18
更改實驗和高頻次更改 .......................... 19
自動化的變更完備性測試 ...................... 20
改進你的系統(tǒng) ................................................ 20
不斷變化和發(fā)展中的應用程序 ...................... 20
時刻關注可用性 ............................................. 21
第 5章 什么是風險管理. .......................................................... 24
管理風險 ........................................................ 25
識別風險 ........................................................ 25
消除最嚴重的風險 ......................................... 26
風險緩和 ........................................................ 26
定期檢查 ........................................................ 27
對風險管理的總結 ......................................... 27
第 6章 可能性與嚴重性. .......................................................... 28
10佳列表:低可能性,低嚴重性 .................. 29
訂單數(shù)據(jù)庫:低可能性,高嚴重性 ............... 29
自定義字體:高可能性,低嚴重性 ............... 30
T恤圖片:高可能性,高嚴重性 ................... 31
第 7章 風險模型...... 32
風險模型的作用域 ......................................... 34
創(chuàng)建風險模型 ................................................ 34
通過頭腦風暴建立風險列表 .................. 35
填寫可能性和嚴重性字段 ...................... 36
風險項詳情............................................. 37
觸發(fā)計劃 ................................................ 37
使用風險模型來制訂計劃 .............................. 37
維護風險模型 ................................................ 38
第 8章 風險緩和...... 40
恢復計劃 ........................................................ 41
容災計劃 ........................................................ 42
改進我們的風險狀況 ..................................... 43
第 9章 比賽日......... 44
預發(fā)布環(huán)境和生產(chǎn)環(huán)境.................................. 44
在生產(chǎn)環(huán)境中舉行比賽日的擔心 ................... 46
比賽日測試 .................................................... 47
第 10章 構建低風險系統(tǒng)......................................................... 48
冗余 .. 48
冪等接口示例 ................................................ 49
增加了復雜性的冗余改進 .............................. 49
獨立性 ............................................................ 50
安全 .. 51
簡單性 ............................................................ 51
自修復 ............................................................ 52
運維流程 ........................................................ 53
第 11章 為什么使用服務. ......................................................... 56
單體應用程序 ................................................ 56
基于服務的應用程序 ..................................... 57
所有權收益 .................................................... 58
規(guī)模收益 ........................................................ 60
如何定義服務 ................................................ 63
深入了解服務 ......................................... 63
指導原則 1:特定的業(yè)務需求 ................ 63
指導原則 2:清晰和獨立的團隊所有權 . 64
指導原則 3:天然隔離的數(shù)據(jù) ................ 65
指導原則 4:共享的能力 /數(shù)據(jù) ............. 67
多種原因 ................................................ 67
過猶不及 ........................................................ 68
適當?shù)钠胶?.................................................... 69
第 13章 處理服務故障............................................................ 70
級聯(lián)式的服務故障 ......................................... 70
如何響應服務故障 ......................................... 71
可預測的響應 ......................................... 72
可理解的響應 ......................................... 73
合理的響應............................................. 73
如何確定故障 ................................................ 74
適當?shù)男袨?.................................................... 76
優(yōu)雅降級 ................................................ 76
優(yōu)雅補償 ................................................ 77
盡早失敗 ................................................ 77
用戶導致的問題 ..................................... 78
第Ⅳ部分 如何讓應用程序具有伸縮性
第 14章 兩次失誤的高度......................................................... 82
什么是“兩次失誤的高度” ............................ 83
實踐中的“兩次失誤的高度” ........................ 83
丟失一個節(jié)點 ......................................... 83
升級過程中出現(xiàn)的問題 .......................... 85
數(shù)據(jù)中心恢復 ......................................... 86
隱蔽的共享故障類型 .............................. 88
管理你的應用程序 ......................................... 90
航天飛機 ........................................................ 90
第 15章 服務所有權.. 92
由獨立團隊負責的服務架構 .......................... 92
STOSA應用程序和組織的好處 ..................... 94
成為一個服務所有者意味著什么 ................... 94
第 16章 服務分級. .... 97
應用復雜性 .................................................... 97
什么是服務分級 ............................................. 98
為服務分配服務級別標簽 .............................. 99
1級服務 ................................................. 99
2級服務 ................................................. 99
3級服務 ............................................... 100
4級服務 ............................................... 100
示例:在線商店 ........................................... 100
接下來呢 ...................................................... 103
第 17章 使用服務分級.......................................................... 104
期望 104
響應性 .......................................................... 104
依賴 106
關鍵依賴 .............................................. 106
非關鍵依賴........................................... 107
小結 107
第 18章 服務等級協(xié)議.......................................................... 108
什么是服務等級協(xié)議 ................................... 108
外部 SLA與內(nèi)部 SLA的對比 ..................... 110
為什么內(nèi)部 SLA很重要 .............................. 110
SLA可以作為一種信任的手段 .....................111
SLA可以用于問題診斷 ................................111
限定 SLA .............................................. 113
排名 SLA .............................................. 113
延遲分組 .............................................. 115
究竟應當定義多少內(nèi)部 SLA,以及定義哪些內(nèi)部 SLA ........................................... 116
關于 SLA的其他評價 .................................. 116
第 19章 持續(xù)改進. ... 117
定期檢查你的應用程序................................ 117
微服務 .......................................................... 118
服務所有權 .................................................. 118
無狀態(tài)服務 .................................................. 118
數(shù)據(jù)在哪里 .................................................. 118
數(shù)據(jù)分區(qū) ...................................................... 119
持續(xù)改進的重要性 ....................................... 121
第 20章 變化和云服務. ..........................................................124
云服務有哪些變化 ....................................... 124
對基于微服務架構的認可 .................... 124
更小、更專業(yè)的服務 ............................ 125
更專注于應用程序 ............................... 125
微型初創(chuàng)公司 ....................................... 125
安全和合規(guī)已經(jīng)成熟 ............................ 125
變化還在繼續(xù) .............................................. 125
第 21章 云上的分布.127
AWS的架構 ................................................. 127
AWS區(qū)域 ............................................. 127
AWS可用區(qū) ......................................... 128
數(shù)據(jù)中心 .............................................. 128
總體架構概述 .............................................. 129
第 22章 托管的基礎設施....................................................... 134
基于云的服務架構 ....................................... 134
原生資源 .............................................. 135
托管資源(基于服務器) ....................... 136
托管資源(不基于服務器) ................... 137
使用托管資源的影響 ................................... 138
使用非托管資源的影響................................ 138
監(jiān)控和 CloudWatch ...................................... 138
第 23章 云資源分配. ............................................................ 140
固定額度的資源分配 ................................... 140
調(diào)整分配 .............................................. 141
預留容量 .............................................. 142
基于使用量的資源分配................................ 143
基于使用量分配資源的好處 ................ 144
資源分配技術的利與弊................................ 145
第 24章 可伸縮的計算選項.................................................... 146
云服務器 ...................................................... 147
優(yōu)點 ...................................................... 147
缺點 ...................................................... 147
適用場景 .............................................. 147
計算分片 ...................................................... 147
優(yōu)點 ...................................................... 147
缺點 ...................................................... 148
適用場景 .............................................. 148
動態(tài)容器 ...................................................... 148
優(yōu)點 ...................................................... 148
缺點 ...................................................... 149
適用場景 .............................................. 149
微計算 .......................................................... 149
優(yōu)點 ...................................................... 149
缺點 ...................................................... 150
第 25章 AWS.Lambda....................................................... 151
使用 Lambda ................................................ 151
事件處理 .............................................. 151
手機應用后臺 ....................................... 152
物聯(lián)網(wǎng)數(shù)據(jù)采集 ................................... 153
Lambda的優(yōu)缺點......................................... 154
第Ⅵ部分 總結
第 26章 融會貫通...156
可用性 .......................................................... 156
風險管理 ...................................................... 157
服務 157
擴展 157
云服務 .......................................................... 158
面向可伸縮的架構 ....................................... 158
索引. ..................... 159