互聯網系統極度重視可用性。構建高可用系統非一日之功,以下五大策略凝聚無數實戰血淚經驗。
1. 監控與報警:儀表盤不可或缺
無監控如盲駕。關鍵指標:故障發現率(監控是否最先發現故障)。監控點涵蓋:業務 QPS/延遲/錯誤率、JVM 指標、資源使用率、下游依賴健康度。報警分級:P0(立即叫醒)、P1 (15min)、P2 (1h),避免報警疲勞。
2. 消除單點故障
- 應用層:無狀態服務叢集部署;有狀態(DB、快取)主備/叢集(如 Redis Sentinel、MySQL MHA)。
- 基礎設施層:跨機架、跨機房、跨城市部署。真正高可用需解決:單機→單機架→單機房→單城市故障。
- 成本權衡:異地多活成本高,依業務 RPO/RTO 決定架構等級。
3. 解耦:核心邏輯與邊緣邏輯分離
- 後端非同步化:關鍵路徑同步執行;非關鍵(通知、日誌、統計)透過訊息佇列異步處理。避免邊緣故障拖垮核心。
- 前端碎片化:頁面非核心區塊(推薦、廣告、評論)用 AJAX/SSI 獨立載入,核心內容優先渲染。
4. 隔離:故障火牆
- 業務隔離:核心/非核心、耗資源/輕量、大客戶/普通用戶 → 拆分應用或七層路由分流。
- 資源隔離:線程池、連接池、CPU、IO、記憶體配額獨立。避免單一慢查詢耗盡資料庫連接拖垮整站。
- 路由實現:客戶端軟負載(如基於 ZK)優於中心七層代理(Nginx/LVS),效能損耗極低。
5. 容災:在災難中存活
- 超時控制:所有阻塞調用必須設超時。線上系統寧可失敗(快速失敗),不可慢響應(拖垮執行緒池)。
- 自動降級:非關鍵依賴超時/錯誤率超閾值 → 自動熔斷、回傳預設值/空結果(如未讀訊息數失效則隱藏)。
- 手動開關:頁面每個功能點配置開關,壓力大時一鍵關閉非核心功能(如降圖片畫質省頻寬)。
- 自動恢復:下游恢復後,上游無需重啟即自動恢復呼叫。
- 自我保護:限流(令牌桶/漏桶)、過載拒絕、負載保護(保留 SSH 登入資源)。真實流量壓測才能校準系統極限,模擬測試不可信。
- 多層級容災:機房級(同城雙活)、城市級(異地多活)、資料備份與演練。
總結
高可用 = 監控先知 + 無單點 + 徹底解耦 + 嚴格隔離 + 多層容災。每一項都需代碼、架構、基建三位一體投入,成本高但不可或缺。大規模系統中,「不可能發生的事」終將發生,準備好才能從容應對。