可靠性工程 (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,所以這些『東西』可能有以下這些角度:

  1. 分層 (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.
  2. 服務依賴 (Depends):依賴對象,不是本體。
    • 內部依賴:服務自己內部服務 之間的可靠性,例如 訂單服務目錄服務 之間的的可靠性
    • 外部依賴:服務自己外部服務 之間的可靠性,例如 AWS S3 、第三方簡訊的依賴
  3. 資料可靠性:重點就是 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),目的是達到:
    1. 高可用 (Highly Available)
    2. 沒有單點 (Single Point of Failure, SPOF)
    3. 容錯機制 (Fault Tolerance)
  • 降級 (Downgrade) 或者 熔斷機制 (Broker),降低系統附載。
  • 限流 (Rate Limit) 保護,系統不會被流量沖垮,更多參閱:API Gateway - Rate Limit and Throttling
  • 資料可靠性:分片 (Sharding)、複本(Replication)、分區(Partition),提升系統可靠性、容量、效能。
    • 分片 (Sharding):指的是同一份資料,被拆分成數個區塊,分佈在不同的實體機器上。最常見的例子就是 Elastic Search 的 Data Node 分片。
    • 複本 (Replication):同樣的資料區塊,在不同的實體機器,有一模一樣的複製。最常見的就是 RDB 的複本節點。
    • 分區 (Partition)
      1. 資料分區,通常指的是跨資料中心的分區。
      2. 當副本的機器,屬於跨多個網路節點,就是一種分區。
      3. 資料在磁碟上的分區。
  • 快取 (Cache):快取策略

方法論


延伸閱讀

站內延伸

組織的可靠性

參考資料

相關書籍




Comments