W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
高可用HA(High Availability)是分布式系統(tǒng)架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統(tǒng)不能提供服務的時間。
假設系統(tǒng)一直能夠提供服務,我們說系統(tǒng)的可用性是100%。
如果系統(tǒng)每運行100個時間單位,會有1個時間單位無法提供服務,我們說系統(tǒng)的可用性是99%。
很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統(tǒng)的年停機時間為8.76個小時。
百度的搜索首頁,是業(yè)內公認高可用保障非常出色的系統(tǒng),甚至人們會通過www.baidu.com 能不能訪問來判斷“網絡的連通性”,百度高可用的服務讓人留下啦“網絡通暢,百度就能訪問”,“百度打不開,應該是網絡連不上”的印象,這其實是對百度HA最高的褒獎。
我們都知道,單點是系統(tǒng)高可用的大敵,單點往往是系統(tǒng)高可用最大的風險和敵人,應該盡量在系統(tǒng)設計的過程中避免單點。方法論上,高可用保證的原則是“集群化”,或者叫“冗余”:只有一個單點,掛了服務會受影響;如果有冗余備份,掛了還有其他backup能夠頂上。
保證系統(tǒng)高可用,架構設計的核心準則是:冗余。
有了冗余之后,還不夠,每次出現故障需要人工介入恢復勢必會增加系統(tǒng)的不可服務實踐。所以,又往往是通過“自動故障轉移”來實現系統(tǒng)的高可用。
接下來我們看下典型互聯(lián)網架構中,如何通過冗余+自動故障轉移來保證系統(tǒng)的高可用特性。
常見互聯(lián)網分布式架構如上,分為:
(1)客戶端層:典型調用方是瀏覽器browser或者手機應用APP
(2)反向代理層:系統(tǒng)入口,反向代理
(3)站點應用層:實現核心應用邏輯,返回html或者json
(4)服務層:如果實現了服務化,就有這一層
(5)數據-緩存層:緩存加速訪問存儲
(6)數據-數據庫層:數據庫固化數據存儲
整個系統(tǒng)的高可用,又是通過每一層的冗余+自動故障轉移來綜合實現的。
【客戶端層->反向代理層】的高可用
【服務層】到【緩存層】的高可用,是通過緩存數據的冗余來實現的。
緩存層的數據冗余又有幾種方式:第一種是利用客戶端的封裝,service對cache進行雙讀或者雙寫。
緩存層也可以通過支持主從同步的緩存集群來解決緩存層的高可用問題。
以redis為例,redis天然支持主從同步,redis官方也有sentinel哨兵機制,來做redis的存活性檢測。
說完緩存的高可用,這里要多說一句,業(yè)務對緩存并不一定有“高可用”要求,更多的對緩存的使用場景,是用來“加速數據訪問”:把一部分數據放到緩存里,如果緩存掛了或者緩存沒有命中,是可以去后端的數據庫中再取數據的。
這類允許“cache miss”的業(yè)務場景,緩存架構的建議是:
【服務層>數據庫層】的高可用
大部分互聯(lián)網技術,數據庫層都用了“主從同步,讀寫分離”架構,所以數據庫層的高可用,又分為“讀庫高可用”與“寫庫高可用”兩類。
【服務層】到【數據庫讀】的高可用,是通過讀庫的冗余來實現的。
既然冗余了讀庫,一般來說就至少有2個從庫,“數據庫連接池”會建立與讀庫多個連接,每次請求會路由到這些讀庫。
【服務層】到【數據庫寫】的高可用,是通過寫庫的冗余來實現的。
以mysql為例,可以設置兩個mysql雙主同步,一臺對線上提供服務,另一臺冗余以保證高可用,常見的實踐是keepalived存活探測,相同virtual IP提供服務。
高可用HA(High Availability)是分布式系統(tǒng)架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統(tǒng)不能提供服務的時間。
方法論上,高可用是通過冗余+自動故障轉移來實現的。
整個互聯(lián)網分層系統(tǒng)架構的高可用,又是通過每一層的冗余+自動故障轉移來綜合實現的,具體的:
(1)【客戶端層】到【反向代理層】的高可用,是通過反向代理層的冗余實現的,常見實踐是keepalived + virtual IP自動故障轉移
(2)【反向代理層】到【站點層】的高可用,是通過站點層的冗余實現的,常見實踐是nginx與web-server之間的存活性探測與自動故障轉移
(3)【站點層】到【服務層】的高可用,是通過服務層的冗余實現的,常見實踐是通過service-connection-pool來保證自動故障轉移
(4)【服務層】到【緩存層】的高可用,是通過緩存數據的冗余實現的,常見實踐是緩存客戶端雙讀雙寫,或者利用緩存集群的主從數據同步與sentinel?;钆c自動故障轉移;更多的業(yè)務場景,對緩存沒有高可用要求,可以使用緩存服務化來對調用方屏蔽底層復雜性
(5)【服務層】到【數據庫“讀”】的高可用,是通過讀庫的冗余實現的,常見實踐是通過db-connection-pool來保證自動故障轉移
(6)【服務層】到【數據庫“寫”】的高可用,是通過寫庫的冗余實現的,常見實踐是keepalived + virtual IP自動故障轉移
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: