架構師訓練營第 1 期 - 第 11 周作業
导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
系統不可用原因
硬體故障
儲存裝置
記憶體
網路卡
伺服器故障
軟體有 bug
系統發布時,環境不匹配
測試環境與生產環境設置不同
並發壓力超過系統負荷
頻寬超出負荷
請求超出系統處理能力
網路攻擊
惡意攻擊
外部災害
天然災害
人為災害
高可用方案
解耦
高內聚、低耦合的組件設計原則
面向對象基本設計原則
面向對象設計模式
領域驅動設計建模
隔離
業務與子系統隔離
前提是業務解耦合
微服務與中台架構
將系統的服務拆分,部署在不同的服務器上
服務的故障,不會影響到整體系統
生產者消費者隔離
利用消息對列隔離
虛擬機與容器隔離
不同服務部署在不同虛擬機或容器內
異步
多線程編程
反應式編程
異步通信網路編程
事件驅動異步架構
備份
集群設計
將服務部署在多台服務器上
再利用負載均衡分配用戶請求
多台服務器互為備份
數據庫複製
數據庫冗餘並保持一致
失效轉移 (Failover)
備份後,遇到失效,轉移至其他服務器
數據庫主主失效轉移
負載均衡失效轉移
設計無狀態的服務
冪等
與失效轉移相關,調用服務失敗後,重新發送請求給其他服務器
服務重複調用有時候無法避免
比如服務處理成功,但應用沒有收到響應,導致應用重新提交請求
必須保證服務重複調用和調用一次產生的結果相同
通過交易編號信息進行服務調用有效性校驗
有效的操作才繼續執行
事務補償
分布式的環境中比較難保證事務的一致姓
可能是不同程序對數據庫發出同一事務中的請求
也可能對不同數據庫發出同一事務中的請求
通過執行業務邏輯逆操作,使事務回滾到事務前狀態
重試
通過重試的方式修復單次調用故障
注意上游調用者超時時間要大於下游調用者超時時間總和
熔斷
當某個服務出現故障、響應延遲或失敗率增加,繼續調用這個服務會出現服務級聯失效
因為請求阻塞、資源消耗增加
級聯失效:因服務失效造成系統失效的連鎖反應
緩存失效--> 資料庫調用失效 --> 系統崩潰
使用斷路器阻斷對故障服務的調用
監控服務的響應失敗率或延遲率
動態決定斷路器的關閉、打開、半開的狀態
限流
對進入系統的用戶請求進行流量限制
超過系統最大處理能力,則丟棄一部分的用戶請求,保證整個系統可用
限流算法
計數器算法 (固定窗口、滑動窗口)
令牌統算法
漏桶算法
自適應限流
降級
系統高並發的時候,將非核心的功能關閉,提高核心功能的處理能力
某些非核心功能會給系統產生非常大的壓力
如確認收貨,對數據庫產生很大的壓力
更改訂單狀態
完成支付確認
進行評價
非核心功能通常不需要即時處理
異地多活
將數據中心分布在多個不同地點的機房
每個機房都可以對外提供完整的系統服務
用戶可以連接任何一個機房進行訪問
是高可用的最高顯示,投入成本也最多,部署難度最大
異地多活的難點在保持數據的一致性及同步
版权声明: 本文为 InfoQ 作者【Panda】的原创文章。
原文链接:【http://xie.infoq.cn/article/c7b4e09110768afdec792c355】。未经作者许可,禁止转载。
评论