高可用之 降級

2021-09-27 06:43:15 字數 1921 閱讀 8056

降級的最終目的是保證核心服務可用,即使是有損的。有些伺服器無法降級(加入購物車、結算等)。降級也需要根據系統的吞吐量、響應時間、可用率等條件進行手工降級或自動降級。

降級按照是否自動化可分為:自動開關降級和人工開關降級。

降級按照功能可分為:讀服務降級和寫服務降級。

降級按照處於的系統層次可分為:多級降級。

降級的功能點主要從服務端鏈路考慮,根據使用者訪問的服務呼叫鏈路梳理**需要降級。

自動降級是根據系統負載、資源使用情況、sla等指標進行降級。

1.超時降級

當訪問的資料庫/http服務/遠端呼叫響應慢或者長時間響應慢,且該服務不是核心服務的話,可以在超時後自動降級。

注意:在實際場景中一定要配置好超時時間和超時重試次數及機制。

2.統計失敗次數降級

有些依賴一些不穩定的api,比如,呼叫外部的第三方服務,當失敗呼叫次數達到一定閾值自動降級(熔斷器)。然後通過非同步執行緒去探測服務是否恢復了,恢復則取消降級。

3.故障降級

比如,要呼叫的服務掛掉了,可以直接降級。降級後的處理方案有:預設值(庫存服務故障,返回預設有貨)、兜底資料(廣告掛了,返回提前準備好的靜態頁面)、快取(之前快取的一些快取資料)。

4.限流降級

秒殺或搶購業務,可能會因為訪問量太大導致系統崩潰,可以使用限流限制訪問量,達到限流閾值時,後續請求被降級。降級後的處理方案有:排隊頁面(將使用者導流到排隊頁面等一會重試)、無貨(直接告知使用者沒貨了)、錯誤頁(活動太火爆,稍後重試)。

如果線上一些服務存在問題,需要暫時將這些服務摘掉。如果呼叫量太大,可能需要改變處理方式(同步轉換為非同步)。可以使用開關來完成降級,開關可以存放到配置檔案、資料庫、redis或者zookeeper。如果不是存放在本地,可以定期開關資料(比如1秒同步一次)。然後,通過判斷某個key的值來決定是否降級。

當新服務有問題時可以通過開關切換回老服務,再有就是多機房服務,如果某個機房掛了,需要將乙個機房的服務切到另乙個機房,此時,也可以通過降級開關完成切換。

如果因為功能問題需要暫時遮蔽掉某些功能,此時需要開關控制降級。

一般策略有:暫時切換讀(降級到讀快取、降級到走靜態化)、暫時遮蔽讀(遮蔽讀入口、遮蔽某個讀服務)。

頁面降級、頁面片段降級、頁面非同步請求降級,都是讀服務降級。

動態頁面降級為靜態化:呼叫量太大時,可以將動態頁面降級為靜態化,通過乙個程式定期推送靜態頁到快取或者生成到磁碟,出問題時直接切過去。

靜態化降級為動態化:靜態化出問題時,可以暫時切換到動態化保證服務的正確性。

寫服務大多數場景不可降級,但是可以將同步寫操作轉換為非同步寫資料,或者限制寫的量/比例。

比如扣將庫存的場景:

方案1:

扣減庫存,扣減成功後,更新redia庫存。

方案2:

扣減redis庫存,同步扣減db存庫,如果扣減失敗,則回滾redis庫存。

這兩種方案非常依賴db,如果db效能跟不上,則扣減庫存就會遇到問題,此時可以使用方案3。

方案3:

扣減redis庫存,正常同步扣減db庫存,效能扛不住時,降級為傳送一條扣減db庫存的訊息,然後非同步進行db庫存扣減實現最終一致性。

方案3中傳送扣減庫存訊息可能成為瓶頸,此時可以使用方案4。

扣減redis庫存,正常同步扣減db庫存,效能扛不住時降級為寫扣減db庫存訊息到本機,然後本機通過非同步進行db庫存扣減實現最終一致性。

秒殺場景可以直接降級為非同步,保護系統,下單操作可以在大促時暫時降級,將下單資料寫入redis,等峰值過去再同步回db。

快取離使用者越近越高效,降級則是離使用者越近越對系統保護的好。

如果涉及的伺服器/系統較少,則初期可以考慮使用配置檔案進行配置。如果涉及的伺服器/系統較多,則應該使用配置中心進行配置,實現時要做到不需要修改**。不需要重啟應用即可動態配置開關。

關於熔斷需要知道如下幾個概念

注意:重點掌握hystrix框架。

——總結自濤哥的《億級流量**架構核心技術》

高可用之降級 限流 拒絕服務

reference 系統的 可 建設,它其實是 個系統 程,需要考慮到系統建設的各個階段,也就是說它其實貫穿了系統建設的整個 命週期,如下圖所 具體來說,系統的 可 建設涉及架構階段 編碼階段 測試階段 發布階段 運 階段,以及故障發 時。1.架構階段 架構階段主要考慮系統的可擴充套件性和容錯性,要...

Oracle高可用之dataguard

dataguard是一種資料庫級別的ha方案,最主要功能是冗災 資料保護 故障恢復等。在生產資料庫的 事務一致性 時,使用生產庫的物理全備份 或物理copy 建立備庫,備庫會通過生產庫傳輸過來的歸檔日誌 或重做條目 自動維護備用資料庫。將重做資料應用到備用庫。本文介紹使用rman備份建立備庫 dat...

keepalived高可用之nginx實戰

以nginx為例 安裝兩台nginx及keepalived配置高可用 兩台安裝nginx,我這邊以原始碼安裝為例 yum安裝nginx 原始碼安裝nginx 安裝完成後啟動,關閉防火牆及selinux 兩台安裝keepalived yum install y keepalived修改配置檔案 刪除所...