儲存、匯流排與輸入輸出

可靠性(dependability)

純粹的速度不是一個好的電腦系統的全貌。一台每秒處理一百萬筆交易卻偶爾弄丟一筆的銀行機器是沒用的;一個儲存系統被衡量的,不只是它回答得多快,還有你能不能信任那個答案、能不能指望在你需要時系統還在。可靠性是這份信任的總稱:一個你能依賴它交付正確服務、並持續交付的系統的品質。它把可靠度、可用性、容錯這些概念都包在一起。

首先要弄清楚的是「故障、錯誤、失效」這條鏈。故障(fault)是一個瑕疵或缺陷——一道宇宙射線、一個耗損的快閃區塊、一條鬆脫的纜線、一個臭蟲。故障可能造成錯誤(error)——一個不正確的內部狀態,像記憶體裡翻轉的一個位元。而錯誤若觸及系統的行為,就造成失效(failure)——系統交付了錯誤的服務,像傳回壞資料或當機。關鍵的洞見是:故障不一定會變成失效:若你先抓到並修正錯誤,系統就持續正確運作。那道間隙正是整個可靠性工程安身之處。兩個標準度量把它量化:可靠度,常以平均故障間隔時間(平均多久才故障一次)概括;以及可用性,系統正常運轉並提供服務的時間比例。

那要怎麼把故障變成沒事發生?最主要的工具是冗餘——額外的資源,其唯一任務就是在失效時頂替。ECC 加上冗餘位元,好讓翻轉的位元被更正而非被交付。RAID 加上冗餘磁碟,好讓一顆死掉的磁碟不丟資料。複製的伺服器讓其中一台在另一台死去時接手。誠實的框架是:你無法防止每一個故障,所以可靠的設計假設故障一定會發生,並安排好讓它們優雅地降級而非災難性地崩潰。冗餘並不免費——它要付硬體、功耗與複雜度——這就是為什麼可靠性永遠是一個刻意的取捨,而非你白白就能得到的預設值。

一道宇宙射線翻轉了伺服器 RAM 裡的一個位元(一個故障,造成一個錯誤)。沒有 ECC,那個錯誤位元可能被讀出、傳回一個壞數字——一次失效。有 ECC,碼在資料被使用前就偵測並更正了翻轉:故障與錯誤都發生了,但沒有失效。系統保持可靠,因為冗餘吸收了故障。

故障 → 錯誤 →(被冗餘攔下)→ 無失效。打斷這條鏈就是整場遊戲的核心。

要分清故障、錯誤、失效——它們不是同義詞。一個從未蔓延成錯誤行為的故障,不算失效。好的可靠設計假設故障無可避免,並在它變成失效前攔下它,而非假裝它不會發生。

又称
reliability and availabilitytrustworthiness可信賴度可依賴性