究竟啥才是互聯(lián)網(wǎng)架構(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)

常見(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í)踐

【客戶端層->反向代理層】的高可用

【客戶端層】到【反向代理層】的高可用盏道,是通過(guò)反向代理層的冗余來(lái)實(shí)現(xiàn)的稍浆。以nginx為例:有兩臺(tái)nginx,一臺(tái)對(duì)線上提供服務(wù)猜嘱,另一臺(tái)冗余以保證高可用衅枫,常見(jiàn)的實(shí)踐是keepalived存活探測(cè),相同virtual IP提供服務(wù)朗伶。

自動(dòng)故障轉(zhuǎn)移:當(dāng)nginx掛了的時(shí)候弦撩,keepalived能夠探測(cè)到,會(huì)自動(dòng)的進(jìn)行故障轉(zhuǎn)移论皆,將流量自動(dòng)遷移到shadow-nginx益楼,由于使用的是相同的virtual IP,這個(gè)切換過(guò)程對(duì)調(diào)用方是透明的点晴。

注解:

Keepalived是一個(gè)基于VRRP協(xié)議來(lái)實(shí)現(xiàn)的WEB服務(wù)高可用方案感凤,可以利用其來(lái)避免單點(diǎn)故障。一個(gè)WEB服務(wù)至少會(huì)有2臺(tái)服務(wù)器運(yùn)行Keepalived觉鼻,一臺(tái)為主服務(wù)器(MASTER)俊扭,一臺(tái)為備份服務(wù)器(BACKUP),但是對(duì)外表現(xiàn)為一個(gè)虛擬IP坠陈,主服務(wù)器會(huì)發(fā)送特定的消息給備份服務(wù)器萨惑,當(dāng)備份服務(wù)器收不到這個(gè)消息的時(shí)候捐康,即主服務(wù)器宕機(jī)的時(shí)候,備份服務(wù)器就會(huì)接管虛擬IP庸蔼,繼續(xù)提供服務(wù)解总,從而保證了高可用性。

也可訪問(wèn)此文章了解Keepalived的配置與使用

【反向代理層->站點(diǎn)層】的高可用

【反向代理層】到【站點(diǎn)層】的高可用姐仅,是通過(guò)站點(diǎn)層的冗余來(lái)實(shí)現(xiàn)的花枫。假設(shè)反向代理層是nginx,nginx.conf里能夠配置多個(gè)web后端掏膏,并且nginx能夠探測(cè)到多個(gè)后端的存活性劳翰。

自動(dòng)故障轉(zhuǎn)移

當(dāng)web-server掛了的時(shí)候,nginx能夠探測(cè)到馒疹,會(huì)自動(dòng)的進(jìn)行故障轉(zhuǎn)移佳簸,將流量自動(dòng)遷移到其他的web-server,整個(gè)過(guò)程由nginx自動(dòng)完成颖变,對(duì)調(diào)用方是透明的生均。

【站點(diǎn)層->服務(wù)層】的高可用

【站點(diǎn)層】到【服務(wù)層】的高可用,是通過(guò)服務(wù)層的冗余來(lái)實(shí)現(xiàn)的腥刹÷黼剩“服務(wù)連接池”會(huì)建立與下游服務(wù)多個(gè)連接,每次請(qǐng)求會(huì)“隨機(jī)”選取連接來(lái)訪問(wèn)下游服務(wù)衔峰。

自動(dòng)故障轉(zhuǎn)移

當(dāng)service掛了的時(shí)候佩脊,service-connection-pool能夠探測(cè)到,會(huì)自動(dòng)的進(jìn)行故障轉(zhuǎn)移朽色,將流量自動(dòng)遷移到其他的service邻吞,整個(gè)過(guò)程由連接池自動(dòng)完成,對(duì)調(diào)用方是透明的(所以說(shuō)RPC-client中的服務(wù)連接池是很重要的基礎(chǔ)組件)葫男。

【服務(wù)層>緩存層】的高可用

【服務(wù)層】到【緩存層】的高可用,是通過(guò)緩存數(shù)據(jù)的冗余來(lái)實(shí)現(xiàn)的崔列。

緩存層的數(shù)據(jù)冗余又有幾種方式:第一種是利用客戶端的封裝梢褐,service對(duì)cache進(jìn)行雙讀或者雙寫(xiě)。

緩存層也可以通過(guò)支持主從同步的緩存集群來(lái)解決緩存層的高可用問(wèn)題赵讯。

以redis為例盈咳,redis天然支持主從同步,redis官方也有sentinel哨兵機(jī)制边翼,來(lái)做redis的存活性檢測(cè)鱼响。

自動(dòng)故障轉(zhuǎn)移

當(dāng)redis主掛了的時(shí)候,sentinel能夠探測(cè)到组底,會(huì)通知調(diào)用方訪問(wèn)新的redis丈积,整個(gè)過(guò)程由sentinel和redis集群配合完成筐骇,對(duì)調(diào)用方是透明的。

說(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)并不做高可用。

緩存實(shí)例掛了屏蔽

當(dāng)有水平切分的實(shí)例掛掉時(shí)连锯,代理層直接返回cache miss归苍,此時(shí)緩存掛掉對(duì)調(diào)用方也是透明的。key水平切分實(shí)例減少运怖,不建議做re-hash拼弃,這樣容易引發(fā)緩存數(shù)據(jù)的不一致

【服務(wù)層>數(shù)據(jù)庫(kù)層】的高可用

大部分互聯(lián)網(wǎng)技術(shù)摇展,數(shù)據(jù)庫(kù)層都用了“主從同步吻氧,讀寫(xiě)分離”架構(gòu),所以數(shù)據(jù)庫(kù)層的高可用咏连,又分為“讀庫(kù)高可用”與“寫(xiě)庫(kù)高可用”兩類盯孙。

【服務(wù)層>數(shù)據(jù)庫(kù)層“讀”】的高可用

【服務(wù)層】到【數(shù)據(jù)庫(kù)讀】的高可用,是通過(guò)讀庫(kù)的冗余來(lái)實(shí)現(xiàn)的祟滴。

既然冗余了讀庫(kù)振惰,一般來(lái)說(shuō)就至少有2個(gè)從庫(kù),“數(shù)據(jù)庫(kù)連接池”會(huì)建立與讀庫(kù)多個(gè)連接垄懂,每次請(qǐng)求會(huì)路由到這些讀庫(kù)骑晶。

640.png

自動(dòng)故障轉(zhuǎn)移

當(dāng)讀庫(kù)掛了的時(shí)候,db-connection-pool能夠探測(cè)到草慧,會(huì)自動(dòng)的進(jìn)行故障轉(zhuǎn)移桶蛔,將流量自動(dòng)遷移到其他的讀庫(kù),整個(gè)過(guò)程由連接池自動(dòng)完成漫谷,對(duì)調(diào)用方是透明的(所以說(shuō)DAO中的數(shù)據(jù)庫(kù)連接池是很重要的基礎(chǔ)組件)仔雷。

【服務(wù)層>數(shù)據(jù)庫(kù)層“寫(xiě)”】的高可用

【服務(wù)層】到【數(shù)據(jù)庫(kù)寫(xiě)】的高可用,是通過(guò)寫(xiě)庫(kù)的冗余來(lái)實(shí)現(xiàn)的。

以mysql為例碟婆,可以設(shè)置兩個(gè)mysql雙主同步电抚,一臺(tái)對(duì)線上提供服務(wù),另一臺(tái)冗余以保證高可用脑融,常見(jiàn)的實(shí)踐是keepalived存活探測(cè)喻频,相同virtual IP提供服務(wù)。

自動(dòng)故障轉(zhuǎn)移

當(dāng)寫(xiě)庫(kù)掛了的時(shí)候肘迎,keepalived能夠探測(cè)到甥温,會(huì)自動(dòng)的進(jìn)行故障轉(zhuǎn)移,將流量自動(dòng)遷移到shadow-db-master妓布,由于使用的是相同的virtual IP姻蚓,這個(gè)切換過(guò)程對(duì)調(diào)用方是透明的。

五匣沼、總結(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í)踐是緩存客戶端雙讀雙寫(xiě)础嫡,或者利用緩存集群的主從數(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ù)“寫(xiě)”】的高可用姑廉,是通過(guò)寫(xiě)庫(kù)的冗余實(shí)現(xiàn)的缺亮,常見(jiàn)實(shí)踐是keepalived + virtual IP自動(dòng)故障轉(zhuǎn)移

==【完】==

轉(zhuǎn)載架構(gòu)師之路中的作者:沈劍

如果覺(jué)得我的文章對(duì)您有用,請(qǐng)隨意打賞。您的支持將鼓勵(lì)我繼續(xù)創(chuàng)作萌踱!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葵礼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子并鸵,更是在濱河造成了極大的恐慌鸳粉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件园担,死亡現(xiàn)場(chǎng)離奇詭異届谈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弯汰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)艰山,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咏闪,“玉大人,你說(shuō)我怎么就攤上這事鸽嫂。” “怎么了据某?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵橡娄,是天一觀的道長(zhǎng)哗脖。 經(jīng)常有香客問(wèn)我瀑踢,道長(zhǎng)才避,這世上最難降的妖魔是什么橱夭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮桑逝,結(jié)果婚禮上棘劣,老公的妹妹穿的比我還像新娘楞遏。我一直安慰自己,他們只是感情好糙俗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布巧骚。 她就那樣靜靜地躺著劈彪,像睡著了一般沧奴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滔吠,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天屠凶,我揣著相機(jī)與錄音矗愧,去河邊找鬼。 笑死夜涕,一個(gè)胖子當(dāng)著我的面吹牛属愤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播住诸,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贱呐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奄薇!你這毒婦竟也來(lái)了馁蒂?” 一聲冷哼從身側(cè)響起沫屡,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沮脖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绷柒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涮因,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗜湃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刚陡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筐乳。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖路召,靈堂內(nèi)的尸體忽然破棺而出股淡,到底是詐尸還是另有隱情揣非,我是刑警寧澤早敬,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布搞监,位于F島的核電站,受9級(jí)特大地震影響秤标,放射性物質(zhì)發(fā)生泄漏苍姜。R本人自食惡果不足惜衙猪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一垫释、第九天 我趴在偏房一處隱蔽的房頂上張望棵譬。 院中可真熱鬧订咸,春花似錦算谈、人聲如沸然眼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)带欢。三九已至乔煞,卻和暖如春渡贾,著一層夾襖步出監(jiān)牢的瞬間雄右,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留则涯,地道東北人冲簿。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像角钩,于是被迫代替她去往敵國(guó)和親递礼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361