東西會壞——這就是現實。組織的長期健康,取決於人們在緊急時刻的回應方式。良好的應變需要準備與週期性的實作演練,而這需要管理層支援,捨得花時間、金錢甚至 uptime 來打磨流程。

系統壞掉時該做什麼#

別恐慌。你是受過訓練的專業人員,沒有人有生命危險——再糟也就是「半個網際網路掛掉」。深呼吸,然後動手。

  • 感到負擔過大時,叫援軍——必要時可以 page 整間公司
  • 公司有事件回應流程(見第 14 章)就照流程走

本章透過三個真實案例展示「應該怎麼做」與「我們學到了什麼」。

案例一:測試誘發的緊急事件#

Google 主動以「破壞測試」找出系統弱點(DiRT),多數時候測試結果符合預期;但偶爾現實與假設天差地遠。

事件#

  • 計畫:阻擋對「大型分散式 MySQL」中的「一個測試 DB」的所有存取
  • 結果:數分鐘內,許多依賴服務報告外部與內部使用者無法存取
  • 應變:立即中止測試,但回滾權限失敗 → 改回滾到 replica 與 failover;同步聯絡開發者修 DB 應用層 lib
  • 一小時內完全恢復

反思#

✅ 做得好:

  • 受影響的服務立刻向公司內升級
  • 假設「實驗失控了」並果斷中止
  • 並行的「繞過測試 DB」策略加快了恢復

❌ 學到了:

  • 對相依系統的互動理解不足
  • 事件回應流程剛上線數週,未充分宣導 → 沒走流程
  • 沒在測試環境驗證回滾程序,導致回滾本身有 bug

案例二:變更誘發的緊急事件#

事件#

  • 一個保護服務免於濫用的基礎建設,週五全球推送設定變更
  • 觸發了 crash-loop bug → 幾乎所有對外服務同時 crash-loop
  • 因內部基建也依賴自家服務 → 內部應用也大量不可用

應變#

  • 數秒內告警爆量;On-Call 工程師因公司網路也掛掉,被迫移到備援「panic room」
  • 5 分鐘內,推送工程師意識到自己的變更可能是元凶 → 推送反向變更
  • 10 分鐘內依事件流程通知全公司
  • 部分服務因衍生問題還是花了一個小時才完全恢復

反思#

✅ 做得好:

  • 監控立刻偵測(雖然反而告警爆量淹沒了通訊頻道)
  • 頻外通訊系統(out-of-band)讓人在主系統不可用時仍能協調——SRE 平時就維持高可靠、低開銷的備援系統
  • 命令列工具與替代存取管道讓 rollback 能成功執行
  • 被影響系統的速率限制意外起作用——限制了客戶取得壞版本的速度,等於替 crash-loop 踩剎車
  • 一個關鍵運氣:推送工程師正在追即時頻道,第一時間發現大量「無法存取」抱怨,立即 rollback

❌ 學到了:

  • 早期 canary 沒觸發此 bug——因該設定關鍵字非常罕見 → 後續一律嚴格 canary,不論「感覺有沒有風險」
  • 內部排障工具本身依賴受影響的系統 → 如果再久一點就無法除錯

案例三:流程(自動化)誘發的緊急事件#

事件#

  • 自動化測試流程連發兩次「退役」請求給同一組即將下線的伺服器集合
  • 第二次因 bug,把全球所有此類安裝送進 Diskerase 佇列——硬碟全部被清

應變#

  • 第一個 site 下線時 On-Call 工程師收 page → 排查發現是 Diskerase → 把流量導離
  • 全球告警接連爆出 → On-Call 工程師停掉所有團隊自動化
  • 一小時內所有流量轉走,使用者僅見延遲增加
  • 接下來是漫長的復原:網路擁塞、TFTP 重灌速度極慢、BIOS 處理失敗不佳
  • 3 天內恢復絕大多數容量;零星機器後續 1–2 個月

反思#

✅ 做得好:

  • 大型機房的反向代理與小型機房不同 → 大型未受影響,可吃下流量
  • 雖然監控也被退役掉了,但 On-Call 工程師快速還原監控
  • 事件回應流程比一年前成熟得多——跨團隊、跨公司溝通順暢

❌ 學到了:

  • 根因:退役自動化伺服器沒做空集合的安全檢查——空回應被當成「全部」傳給機器資料庫
  • 重灌基礎建設無法同時處理數千台機器,QoS 設定錯誤、timeout 沒調好、會強迫已就緒的 kernel 重灌——這些都是平日「不會被測到」的退化

所有問題都有解#

系統會壞,且常以你想不到的方式壞。但永遠有解——即便當下不顯然。

  • 找不到解就把網撒大:找隊友、找外援、用盡所有手段
  • 第一優先是快速止血
  • 觸發事件的人通常持有最多狀態——好好利用

事件緩解後別忘了:留時間清理、寫事件報告、學習。

從過去學,不要重複#

保留故障歷史#

  • 寫完整、誠實、深入靈魂的事後檢討
  • 找出戰略性的預防動作,不只戰術性的修補
  • 公司內公開、易檢索的事後檢討文件庫
  • 對「行動項目」的追蹤要嚴格——確保歷史不再重演

問大膽、看似不可能的問題#

  • 大樓停電怎辦?
  • 網路機架泡在兩呎深的水裡怎辦?
  • 主資料中心突然全黑怎辦?
  • 有人入侵了 web server 怎辦?

你有計畫嗎?你知道系統會怎麼反應嗎?身邊的同事也知道嗎?

鼓勵主動測試#

失敗的理論和現實是兩個不同的領域。系統真的壞之前,你不會知道它與相依系統會怎麼反應。

你寧可故障發生在週六凌晨 2 點(大家還在 Black Forest team-building),還是平日上班時間在你最聰明的同事旁邊?

結語#

三個事件起因不同(主動測試、設定變更、退役自動化),但應變方式有共通點:

  • 不恐慌
  • 必要時叫人
  • 從過去事件學習
  • 把學到的內化成系統設計與流程
  • 詳細記錄、跨團隊分享
  • 持續主動測試以驗證修復而非僅相信文件

這個迭代循環會隨事件累積讓組織愈來愈強壯——本章方法不限 Google 規模,任何組織皆可套用。