可靠性工程 (Reliability Engineering)
在整理 如何量測系統的容量? 給自己挖了一個坑,整理這篇,先起個頭。可靠性工程 (Reliability Engineering)
1 是系統工程的子項目之一,概念上非常類似於 可用性 (Available)
,但不全然。依據 Practical Reliability Engineering 的定義,可靠性如下:
The probability that an item will perform a required function without failure under stated conditions for a statd period of time.
可靠性是指某套系統在指定的環境下,在要求的時間內成功持續執行某個功能的機率。
這段定義在 SRE 序中也有引用。
這篇整理個人的理解與簡單總結,不見得與一般的書本一樣,主要專注在 What (可靠性的定義)、How (工程實踐)。
可靠性的定義
對象
談可靠性之前,先問這個問題:
什麼
東西
的可靠性?
這邊泛指資訊系統,通常指的是 Web Servces,所以這些『東西』可能有以下這些角度:
- 分層 (Layer):架構裡的分層可靠性
- 可以想像是常見的 應用層、資料層、基礎層 的『層』,常見的有 AP Layer、Cache Layer、DB Layer、Networking …
- AP 指的是 Application 的統稱,通常會是 Web、REST API 的形式,也會有 Batch Job 的形式。
- Database Reliability Engineering 這本書就是專門談 Database 的可靠性。
- 治理層 (Governance) 與基礎層 (Infra) 的可靠性:像是 Service Mesh、K8s、Config Management、Secret Vault … etc.
- 服務依賴 (Depends):依賴對象,不是本體。
- 內部依賴:
服務自己
與內部服務
之間的可靠性,例如訂單服務
與目錄服務
之間的的可靠性 - 外部依賴:
服務自己
與外部服務
之間的可靠性,例如 AWS S3 、第三方簡訊的依賴
- 內部依賴:
- 資料可靠性:重點就是 AP 產生的資料,指的是應用程式執行過程中,最後必須具備
資料完整性 (Data Integrity)
。
特性
可靠性的系統具備哪一些特性 (Feature) ?特徵 (Characteristic)?底下三個詞是經常見的名詞:
- Elasticity:
- 中文可翻成:
可容錯
、彈性
,主要用在雲端運算 (Cloud Computing) - 強調面對外在改變時,系統的處理能力
- 系統處理外在變化的能力
- AWS 的產品很多都是 Elastic 開頭,強調彈性、擴展等特性,像是 EC2、ELB、EBS …
- 中文可翻成:
- Resilience:
- 翻成:
韌性
、彈性
、可容錯
,這個詞源自 材料科學,指材料吸收外在能量之後,除去應力可以釋放等量的能量。 - 系統發生錯誤的回復能力、面對極端條件的恢復力,例如 Stress Test
- 強調系統內在自我修復的能力 (Recoverability)、反脆弱 (Antifragile)
- 翻成:
- Scalability:
- 翻成:
可擴展
- 系統容量具備線性擴展的能力,像是垂直擴展 (Scale Up / Vertical Scaling)、水平擴展 (Scale Out / Horizontal Scaling)
- 系統有運算資源有基本的單位(像是一台 VM 或者 Pod),這個單位可以自我的複製能力
- 翻成:
這三個名詞是可靠性系統所具備的特性。
工程實踐
整理實踐可靠性的時候,必須面對的核心議題、實踐方法、常見問題。
挑戰
- 核心問題:資料一致性,背後面對的工程問題是
分散式鎖 (Distributed Locks)
,衍伸的就是 分散式一致性與共識演算法、分散式交易,這些問題則基於分散式通訊。 - 架構層次可靠性:針對各個層次的可靠性實踐方法與解決方案,常見如下一段整理。
- 依賴管理:內外部依賴管理,通常需要透過分散式治理達到對應的可靠性。
- 例如透過
大使模式 (Ambassador)
做到外部依賴的現流機制。
- 例如透過
實踐
架構解偶 (Loosely Coupled)
,所以不會太過於依賴其他服務而影響到服務- 把
強依賴 (Strong Dependency)
變成弱依賴
;把同步 (Sync)
改成非同步 (Async)
、把 Blocking 變成 Non-Blocking - 實踐的方法分散式通訊方式,常見的模式有 RPC、Message Queue、Pub/Sub 等方法。
- 把
冗余機制 (Redundant)
,目的是達到:- 高可用 (Highly Available)
- 沒有單點 (Single Point of Failure, SPOF)
- 容錯機制 (Fault Tolerance)
降級 (Downgrade)
或者熔斷機制 (Broker)
,降低系統附載。- 限流 (Rate Limit) 保護,系統不會被流量沖垮,更多參閱:API Gateway - Rate Limit and Throttling
- 資料可靠性:分片 (Sharding)、複本(Replication)、分區(Partition),提升系統可靠性、容量、效能。
分片 (Sharding)
:指的是同一份資料,被拆分成數個區塊,分佈在不同的實體機器上。最常見的例子就是 Elastic Search 的 Data Node 分片。複本 (Replication)
:同樣的資料區塊,在不同的實體機器,有一模一樣的複製。最常見的就是 RDB 的複本節點。分區 (Partition)
:- 資料分區,通常指的是跨資料中心的分區。
- 當副本的機器,屬於跨多個網路節點,就是一種分區。
- 資料在磁碟上的分區。
- 快取 (Cache):快取策略
方法論
- Site Reliablity Engineering
- Chaos Engineering (混沌工程)
- Database Reliability Engineering
- Building Secure and Reliable Systems
延伸閱讀
站內延伸
組織的可靠性
參考資料
- Reliability Pillar whitepaper - version: April 2019
- How AWS Minimizes the Blast Radius of Failures (ARC338) - AWS re:Invent 2018
- Shuffle Sharding: Massive and Magical Fault Isolation
- Building Secure and Reliable Systems (PDF)
- Practical Reliability Engineering
- Reliability Engineering Principles for the Plant Engineer
相關書籍
- Site Reliablity Engineering
- Chaos Engineering (混沌工程)
- Database Reliability Engineering
- Building Secure and Reliable Systems