摘自 架構(gòu)師之路
一碘橘、什么是高可用
高可用HA****(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一互订,它通常是指,通過(guò)設(shè)計(jì)減少系統(tǒng)不能提供服務(wù)的時(shí)間痘拆。
假設(shè)系統(tǒng)一直能夠提供服務(wù)仰禽,我們說(shuō)系統(tǒng)的可用性是100%。
如果系統(tǒng)每運(yùn)行100個(gè)時(shí)間單位错负,會(huì)有1個(gè)時(shí)間單位無(wú)法提供服務(wù)坟瓢,我們說(shuō)系統(tǒng)的可用性是99%。
很多公司的高可用目標(biāo)是4個(gè)9犹撒,也就是99.99%折联,這就意味著,系統(tǒng)的年停機(jī)時(shí)間為8.76個(gè)小時(shí)识颊。
百度的搜索首頁(yè)诚镰,是業(yè)內(nèi)公認(rèn)高可用保障非常出色的系統(tǒng)奕坟,甚至人們會(huì)通過(guò)www.baidu.com 能不能訪問(wèn)來(lái)判斷“網(wǎng)絡(luò)的連通性”,百度高可用的服務(wù)讓人留下啦“網(wǎng)絡(luò)通暢清笨,百度就能訪問(wèn)”月杉,“百度打不開(kāi),應(yīng)該是網(wǎng)絡(luò)連不上”的印象抠艾,這其實(shí)是對(duì)百度HA最高的褒獎(jiǎng)苛萎。
二、如何保障系統(tǒng)的高可用
我們都知道检号,單點(diǎn)是系統(tǒng)高可用的大敵腌歉,單點(diǎn)往往是系統(tǒng)高可用最大的風(fēng)險(xiǎn)和敵人涵妥,應(yīng)該盡量在系統(tǒng)設(shè)計(jì)的過(guò)程中避免單點(diǎn)顷霹。方法論上,高可用保證的原則是“集群化”瓶摆,或者叫“冗余”:只有一個(gè)單點(diǎn)凹蜂,掛了服務(wù)會(huì)受影響馍驯;如果有冗余備份,掛了還有其他backup能夠頂上玛痊。
保證系統(tǒng)高可用汰瘫,架構(gòu)設(shè)計(jì)的核心準(zhǔn)則是:冗余。
有了冗余之后擂煞,還不夠吟吝,每次出現(xiàn)故障需要人工介入恢復(fù)勢(shì)必會(huì)增加系統(tǒng)的不可服務(wù)實(shí)踐。所以颈娜,又往往是通過(guò)“自動(dòng)故障轉(zhuǎn)移”來(lái)實(shí)現(xiàn)系統(tǒng)的高可用剑逃。
接下來(lái)我們看下典型互聯(lián)網(wǎng)架構(gòu)中,如何通過(guò)冗余+自動(dòng)故障轉(zhuǎn)移來(lái)保證系統(tǒng)的高可用特性官辽。
三蛹磺、常見(jiàn)的互聯(lián)網(wǎng)分層架構(gòu)
(1)客戶端層:典型調(diào)用方是瀏覽器browser或者手機(jī)應(yīng)用APP
(2)反向代理層:系統(tǒng)入口同仆,反向代理
(3)站點(diǎn)應(yīng)用層:實(shí)現(xiàn)核心應(yīng)用邏輯萤捆,返回html或者json
(4)服務(wù)層:如果實(shí)現(xiàn)了服務(wù)化,就有這一層
(5)數(shù)據(jù)****-****緩存層:緩存加速訪問(wèn)存儲(chǔ)
(6)數(shù)據(jù)****-****數(shù)據(jù)庫(kù)層:數(shù)據(jù)庫(kù)固化數(shù)據(jù)存儲(chǔ)
整個(gè)系統(tǒng)的高可用俗批,又是通過(guò)每一層的冗余****+****自動(dòng)故障轉(zhuǎn)移來(lái)綜合實(shí)現(xiàn)的俗或。
四、分層高可用架構(gòu)實(shí)踐
【客戶端層->****反向代理層】的高可用
【反向代理層->****站點(diǎn)層】的高可用
【站點(diǎn)層->****服務(wù)層】的高可用
【服務(wù)層>****緩存層】的高可用
緩存層的數(shù)據(jù)冗余又有幾種方式:第一種是利用客戶端的封裝赵抢,service對(duì)cache進(jìn)行雙讀或者雙寫。
以redis為例烦却,redis天然支持主從同步,redis官方也有sentinel哨兵機(jī)制先巴,來(lái)做redis的存活性檢測(cè)短绸。
說(shuō)完緩存的高可用证逻,這里要多說(shuō)一句乐埠,業(yè)務(wù)對(duì)緩存并不一定有“高可用”要求,更多的對(duì)緩存的使用場(chǎng)景囚企,是用來(lái)“加速數(shù)據(jù)訪問(wèn)”:把一部分?jǐn)?shù)據(jù)放到緩存里丈咐,如果緩存掛了或者緩存沒(méi)有命中,是可以去后端的數(shù)據(jù)庫(kù)中再取數(shù)據(jù)的龙宏。
這類允許“cache miss”的業(yè)務(wù)場(chǎng)景棵逊,緩存架構(gòu)的建議是:
將kv緩存封裝成服務(wù)集群,上游設(shè)置一個(gè)代理(代理可以用集群冗余的方式保證高可用)银酗,代理的后端根據(jù)緩存訪問(wèn)的key水平切分成若干個(gè)實(shí)例辆影,每個(gè)實(shí)例的訪問(wèn)并不做高可用。
【服務(wù)層>****數(shù)據(jù)庫(kù)層】的高可用
大部分互聯(lián)網(wǎng)技術(shù)翔曲,數(shù)據(jù)庫(kù)層都用了“主從同步迫像,讀寫分離”架構(gòu),所以數(shù)據(jù)庫(kù)層的高可用瞳遍,又分為“讀庫(kù)高可用”與“寫庫(kù)高可用”兩類侵蒙。
【服務(wù)層>****數(shù)據(jù)庫(kù)層“讀”】的高可用
既然冗余了讀庫(kù)纷闺,一般來(lái)說(shuō)就至少有2個(gè)從庫(kù),“數(shù)據(jù)庫(kù)連接池”會(huì)建立與讀庫(kù)多個(gè)連接份蝴,每次請(qǐng)求會(huì)路由到這些讀庫(kù)犁功。
【服務(wù)層>****數(shù)據(jù)庫(kù)層“寫”】的高可用
以mysql為例怒医,可以設(shè)置兩個(gè)mysql雙主同步炉抒,一臺(tái)對(duì)線上提供服務(wù),另一臺(tái)冗余以保證高可用稚叹,常見(jiàn)的實(shí)踐是keepalived存活探測(cè)焰薄,相同virtual IP提供服務(wù)。
五飒泻、總結(jié)
高可用HA(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一鞭光,它通常是指,通過(guò)設(shè)計(jì)減少系統(tǒng)不能提供服務(wù)的時(shí)間蠢络。
方法論上,高可用是通過(guò)冗余****+****自動(dòng)故障轉(zhuǎn)移來(lái)實(shí)現(xiàn)的迟蜜。
整個(gè)互聯(lián)網(wǎng)分層系統(tǒng)架構(gòu)的高可用刹孔,又是通過(guò)每一層的冗余****+****自動(dòng)故障轉(zhuǎn)移來(lái)綜合實(shí)現(xiàn)的,具體的:
(1)【客戶端層】到【反向代理層】的高可用娜睛,是通過(guò)反向代理層的冗余實(shí)現(xiàn)的髓霞,常見(jiàn)實(shí)踐是keepalived + virtual IP自動(dòng)故障轉(zhuǎn)移
(2)【反向代理層】到【站點(diǎn)層】的高可用,是通過(guò)站點(diǎn)層的冗余實(shí)現(xiàn)的畦戒,常見(jiàn)實(shí)踐是nginx與web-server之間的存活性探測(cè)與自動(dòng)故障轉(zhuǎn)移
(3)【站點(diǎn)層】到【服務(wù)層】的高可用方库,是通過(guò)服務(wù)層的冗余實(shí)現(xiàn)的,常見(jiàn)實(shí)踐是通過(guò)service-connection-pool來(lái)保證自動(dòng)故障轉(zhuǎn)移
(4)【服務(wù)層】到【緩存層】的高可用障斋,是通過(guò)緩存數(shù)據(jù)的冗余實(shí)現(xiàn)的纵潦,常見(jiàn)實(shí)踐是緩存客戶端雙讀雙寫,或者利用緩存集群的主從數(shù)據(jù)同步與sentinel崩罚活與自動(dòng)故障轉(zhuǎn)移邀层;更多的業(yè)務(wù)場(chǎng)景,對(duì)緩存沒(méi)有高可用要求遂庄,可以使用緩存服務(wù)化來(lái)對(duì)調(diào)用方屏蔽底層復(fù)雜性
(5)【服務(wù)層】到【數(shù)據(jù)庫(kù)“讀”】的高可用寥院,是通過(guò)讀庫(kù)的冗余實(shí)現(xiàn)的,常見(jiàn)實(shí)踐是通過(guò)db-connection-pool來(lái)保證自動(dòng)故障轉(zhuǎn)移
(6)【服務(wù)層】到【數(shù)據(jù)庫(kù)“寫”】的高可用涛目,是通過(guò)寫庫(kù)的冗余實(shí)現(xiàn)的秸谢,常見(jiàn)實(shí)踐是keepalived + virtual IP自動(dòng)故障轉(zhuǎn)移