跳至主要內容
PCA 雲端架構師之旅 — 第 11/13 篇

PCA 雲端架構師之旅 11 — 可靠性與擴展性

內文字級

PCA 雲端架構師之旅 11 — 可靠性與擴展性
更新:2026-10-12

拓樸圖畫完後,得用兩種情境檢查它:有一個元件故障時,服務能否繼續?流量突然增加時,容量能否跟上?

前者是可靠性,後者是擴展性。兩者常會用到無狀態服務、多副本和自動化,但驗證方式不同:故障測試要看切換後能否維持服務,壓力測試則要看延遲與錯誤率如何變化。

這是 PCA 雲端架構師之旅 的第十一步。下面會用尖峰流量與故障情境,檢查前面畫的架構是否真的撐得住。

可靠性以跨區多副本承接故障,擴展性隨流量增減執行個體,兩者都建立在無狀態服務與外部狀態儲存上的圖

圖解:可靠性回答「一個副本壞了還能不能服務」,擴展性回答「流量變多時能不能加副本」。兩者共同地基是 stateless:應用副本不把 session 鎖在自己身上,狀態放到外部資料庫或快取,故障切換與 autoscaling 才能真的生效。


可靠性跟擴展性,先把它們分清楚

「有備份」和「故障時服務還能繼續跑」是兩回事,先別把它們算成同一種保護。

備份處理的是資料保護:資料損毀或誤刪後,還能不能救回來。高可用(HA,High Availability)處理的是服務可用:某個節點或 zone 出問題時,服務能不能繼續提供。就算每天都有備份,也不代表故障當下能立刻接手流量。

擴展性(Scalability)則是另一條軸線:平常五台機器夠用,活動尖峰可能要五十台,之後還得縮回去。除了最高容量,也要估擴容速度與活動後的閒置成本。

設計時要同時看可靠性與擴展性,並對照題目給的可用性目標;能自動擴容的架構,不一定具備足夠的故障切換能力。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart TB
  P[系統問題或需求] --> Q{資料被刪除或損毀?}
  Q -- 是 --> B[備份與還原<br/>Data<br/>Protection]
  Q -- 否 --> F{元件故障時<br/>服務要不中斷?}
  F -- 是 --> H[高可用<br/>與 Failover]
  F -- 否 --> L{流量增加時<br/>容量要跟著成長?}
  L -- 是 --> S[Autoscaling<br/>與 Quota]
  L -- 否 --> R[重新確認<br/>使用者影響<br/>與 SLO]
  B --> V[各自驗證 RPO/RTO 或 SLI]
  H --> V
  S --> V
備份、高可用與擴展解的是三種不同問題;先分類,再用對應的 RPO、RTO 或 SLI 驗證,不要把『有備份』誤當服務不中斷。

把可用性百分比換成停機時間

可用性百分比看起來差很小,換成每月可容忍的停機時間就比較容易討論:

  • 99.9%(3 個 9)≈ 每月停機 43 分鐘
  • 99.95% ≈ 每月停機 22 分鐘
  • 99.99%(4 個 9)≈ 每月停機 4 分鐘

從 99.9% 到 99.99%,每月容許的停機時間大約從 43 分鐘縮到 4 分鐘。要達成更高目標,得檢查整條服務鏈如何偵測、切換與復原,而不只是增加某個資料庫的副本。第 13 步會再把這些設計的成本放進比較表。

📝 考場提點

先把目標換成可容忍的停機時間,再問設計能承受哪一層故障。單一區域內的 HA 可以處理某些 Zone 或執行個體故障,卻無法單靠自己應對整個區域失效。是否需要跨區域部署,還要看資料復原要求、流量切換時間和整體成本。


先處理狀態,再談自動擴縮

想讓應用實例能隨流量增加或減少,得先確認請求會不會依賴某一台實例保存的資料。

無狀態(stateless)的意思是,任何健康的實例都能接下一個請求,不必依賴上一個請求落在哪台機器。Session 和購物車可以放在共用的狀態儲存系統,上傳檔案可存到 Cloud Storage;認證方式則要另外評估安全與失效處理,不必把所有狀態硬塞進單一實例。

假設 session 只存在應用程式的本機記憶體。平常只有一台機器時看不出問題;擴容後,請求可能落到沒有該 session 的新實例;縮容時,原實例一停,使用者也可能被迫重新登入。這是狀態存放位置造成的,不是把 autoscaler 的門檻調高就能解決。

因此要連同狀態儲存一起設計擴縮策略。若舊系統短期內無法改造,可以先評估 sticky session,但也要說清楚實例故障或替換時如何處理既有連線與狀態。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

sequenceDiagram
  participant U as User
  participant L as Load Balancer
  participant A as App Replica A
  participant B as App Replica B
  participant S as External State Store
  U->>L: Request 1+token
  L->>A: 任選健康副本
  A->>S: 讀寫 session/cart
  S-->>A: 狀態
  A-->>U: Response
  Note over A: Replica A 可隨時被縮掉
  U->>L: Request 2+token
  L->>B: 改送 Replica B
  B->>S: 讀到相同狀態
  B-->>U: 使用者無感續接
狀態放在外部儲存後,任一副本都能處理下一個請求;新增、故障或縮掉副本都不會讓 session 跟著消失。

把韌性拆成四個可以逐一檢查的面向

檢查韌性時,可以把需求拆成四個面向;同一個工具可能處理其中一項,卻不能取代其他三項:

維度你要解決的問題GCP 常用工具
高可用 (HA)單點掛掉不影響服務Regional MIG、Cloud SQL HA、GKE regional cluster
自動擴展 (Autoscaling)流量變動自動加減MIG autoscaler、GKE HPA / VPA / Cluster Autoscaler、Cloud Run
無狀態設計 (Stateless)任何實例都能接任何請求外部 session store(Memorystore)、JWT、外部檔案存 GCS
故障轉移 (Failover)主故障自動切備Cloud SQL failover、multi-region LB、DNS failover

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

套到某個服務時,先找單點故障與狀態存放位置,再確認擴展訊號、啟動時間和故障切換方式。手動或自動切換都要依服務與演練結果估時間,不能只看功能名稱。最後檢查 instance、IP 等 quota 是否足以支撐尖峰與故障期間的額外容量。

GCP 建立代管執行個體群組的自動調度資源設定,模式為「開啟:在群組中新增和移除執行個體」,執行個體數量下限 1、上限 10,自動調度資源信號選 CPU 使用率、目標 60%,下方 Predictive autoscaling 預測式調度可選 Off 或 Optimize for availability

這張把水平自動擴縮的三個旋鈕一次擺齊:下限/上限(1 到 10)圈出 MIG 能伸縮的範圍,CPU 使用率目標 60% 決定它何時動手。這裡藏一個很多人讀錯的點——60% 不是「CPU 一過 60% 就加一台」的門檻,而是「目標追蹤」:MIG 會持續增減 VM,設法讓整群的平均 CPU 貼著 60% 跑。最下面那個 Predictive autoscaling 也別略過,切到 Optimize for availability 就是 Google 內建的預熱——它會依歷史負載預測尖峰、提前把 VM 開好,但它最適合每日/每週有規律、啟動時間長的負載(只支援 CPU 使用率,且要先累積 3 天歷史才會開始預測);像雙 11 這種一年一次的活動,或短於 10 分鐘的波動,它預測不到,已知時間的活動要改用依時間表調度資源(schedule-based autoscaling)預先擴容。

尖峰流量先經限流進入無狀態服務,擴容期間依下游容量將可延後工作排隊、非核心功能降級,或用 Circuit Breaker 快速失敗

Autoscaling 需要時間,不能把所有尖峰都直接灌向下游。限流先守住入口;可延後工作進佇列、非核心功能回快取或暫停,下游故障則用 Circuit Breaker 快速失敗。這些背壓手段能避免無限重試把局部過載放大成整體雪崩。

最後別漏了 quota。Autoscaler 想增加資源時,仍會受配額限制。活動前先估尖峰容量、檢查目前配額,必要時預留申請與測試時間;不要等到流量進來才發現擴不上去。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart TB
  C[檢查一個元件] --> H[HA<br/>單點與 zone 故障]
  H --> S[Stateless<br/>狀態是否外移]
  S --> A[Autoscaling<br/>指標、上下限、預熱]
  A --> F[Failover<br/>切換目標與時間]
  F --> Q[Quota<br/>尖峰容量是否已核准]
  Q --> T{故障注入與壓測達標?}
  T -- 否 --> C
  T -- 是 --> D[韌性設計完成]
每個元件都要逐項檢查 HA、狀態、擴縮、故障切換與 quota,並用壓測和故障演練把紙上設計變成可驗證結果。

走一遍範例 — 登雲書店

回到我們的老朋友。登雲書店的訂單與金流要 99.99% 可用性,雙 11 流量會衝到平日 10 倍。把上面那四個面向套到它身上,設計大概長這樣:

前端(GKE regional cluster)

  • Regional cluster 橫跨 3 個 zone,控制平面 HA 由 GCP 代管
  • Pod 以 HPA 擴展,觸發條件:CPU > 60% OR 自訂 metric requests_per_second > 80
  • Cluster Autoscaler 自動加 node(上限 100 個 node,預先申請 quota)
  • Pod 設 topologySpreadConstraints,分散到三個 zone,不讓單 zone 失效造成大範圍中斷

後端服務(Cloud Run)

  • 無狀態設計,session 存 Memorystore for Redis
  • Cloud Run min instances = 5(避免冷啟動)、max = 500
  • 請求並發(concurrency)先設為 80,再用壓測確認單一執行個體能否承受

資料庫(Cloud SQL for PostgreSQL)

  • 啟用 HA(primary + standby,不同 zone),自動 failover;Enterprise edition 的 HA SLA 是 99.95%,訂單與金流要對上 99.99%,得改用 Enterprise Plus edition,或照下一篇的做法把那一層換成 Spanner
  • 加 2 個 read replica 分散讀取
  • 備份每日 + Point-in-Time Recovery(PITR)開啟 7 天

瀏覽紀錄(Bigtable)

  • 單叢集 3 節點,CPU > 70% 自動加節點
  • 關鍵時刻(雙 11 前三天)手動 pre-scale 到 6 節點,活動後縮回

流量進入層

  • Global External Application LB,內建跨 region failover
  • Cloud Armor 設 rate limit:單 IP 每分鐘 300 req,防爬蟲攻擊
  • Cloud DNS A record TTL 設 60 秒(讓 DR 切換快)

這套設計裡有個容易混淆的地方:Cloud SQL HA standby 是故障切換用的,不承接一般讀取。若要分散讀流量,需另外評估 read replica;範例裡的兩台 replica 才是為了這個目的配置的。

簡單說,HA 和 read scaling 要分開估:前者處理主實例故障,後者處理讀取負載。把 standby 算進可用的讀取容量,會讓容量規劃過度樂觀。

📝 考場提點

Cloud SQL 的 HA standby 是為了故障切換,不能拿來承接一般讀取流量。若題目同時要求高可用與分散讀取負載,還要另外評估 read replica。看 case study 時,可把各元件分別對到 HA、autoscaling、stateless 和 failover,檢查哪一層尚未處理。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart LR
  W[寫入流量] --> P[Primary]
  P --> H[HA Standby<br/>同步待命,不服務讀取]
  P --> R1[Read Replica 1]
  P --> R2[Read Replica 2]
  Q[讀取流量] --> R1
  Q --> R2
  P -. Primary 故障 .-> H
  H --> N[Standby 提升為新 Primary]
  R1 -. 不能取代 HA .-> X[只負責分散讀取]
  R2 -. 不能取代 HA .-> X
Standby 專門承接 primary 故障,read replica 專門分散查詢;同時需要 HA 與讀取擴展時,兩種角色都要配置。

上線前再檢查這幾件事

這些設定在架構圖上不顯眼,卻會直接影響擴容與故障時的使用體驗。

Session 只放在 Pod 記憶體裡。 Pod 縮容或重建時,使用者狀態可能跟著消失。可以把 Session 放在共用儲存(例如 Memorystore),或依安全需求採用無狀態 Token;重點是別讓使用者登入狀態綁死在單一 Pod 上。

資料庫連線池也要跟著擴容規劃。 Cloud SQL 的連線數有上限;如果 Pod 數增加,每個 Pod 又各自維持一組連線池,總連線數可能超過資料庫能承受的範圍。先估算「最大 Pod 數 × 每個 Pod 的連線數」,再調整池大小,必要時評估 PgBouncer 等連線池工具。壓測也要涵蓋擴容後的連線總量。

擴容需要時間。 HPA 即使偵測到指標升高,新 Pod 仍要排程、啟動並通過 readiness,才能接住流量。先用壓測量出這段時間,再決定最低副本數;已知的尖峰可以事先預熱,也要確認下游資料庫能否跟著承受。若評估改用 Cloud Run,同樣要測試冷啟動、並行設定與後端容量,而不是假設換平台就能消除尖峰風險。


延伸閱讀


系列導航

下一步:可靠性顧的是「平常別掛」,但萬一整個 region 真的出事呢?下一篇我們進到災難復原(DR),談 RTO / RPO 跟備援策略,把最壞的情況也想清楚。

🎯 換你練習

理論讀完,換自己來。到 架構師設計工作坊 · 步驟 11 填入你的 case study,邊寫邊內化。

PCA 雲端架構師之旅 — 第 11 篇/共 13 篇 查看系列全覽 →

讀完後,留一個學習紀錄

試著用自己的話說出一個重點,以及你會如何運用。實作文章請先核對結果與清理資源,再標記為讀完。

文章進度以你確認讀完的標記為準,可隨時取消。舊版造訪紀錄保留,但不計入讀完;這份自評不代表已掌握內容。

留言討論

文章目錄與系列

徽章解鎖!