服務(wù)器端質(zhì)量之高可用架構(gòu)

“1個(gè)小時(shí)內(nèi)打500萬(wàn)到我卡上,否則別怪我們不客氣,嘟嘟嘟........”
“本市富二代王某某被綁架,目前綁匪要求支付500萬(wàn)贖金,x市電視臺(tái)為您現(xiàn)場(chǎng)報(bào)道”
“打打打,快把500萬(wàn)通過(guò)網(wǎng)上銀行打給他,我的寶貝兒子啊.....”
“王總,您在xx銀行的網(wǎng)上賬戶轉(zhuǎn)賬顯示系統(tǒng)異常,請(qǐng)稍后重試”
“本市富二代王某某因未支付贖金,已被綁匪殺害,目前警方已介入調(diào)查,x市電視臺(tái)為您報(bào)道”
...............

從人民的生活來(lái)講,一個(gè)互聯(lián)網(wǎng)產(chǎn)品,保證其實(shí)時(shí)是正確可用的是十分重要的,同時(shí)對(duì)互聯(lián)網(wǎng)產(chǎn)品來(lái)說(shuō),其產(chǎn)品“隨時(shí)”可用是一個(gè)品牌價(jià)值的延續(xù),品牌服務(wù)的“宕機(jī)”可能不僅僅會(huì)造成客戶的流失,以2015年支付寶被“藍(lán)翔技校“挖斷光纖為例,當(dāng)天支付寶部分用戶被迫停止服務(wù)2個(gè)小時(shí),隨著社會(huì)輿論發(fā)酵,有些用戶以為支付寶要”跑路“了,對(duì)大型互聯(lián)網(wǎng)公司來(lái)說(shuō),類比這種宕機(jī)導(dǎo)致的經(jīng)濟(jì)損失,其品牌信任度損失是更加嚴(yán)重的。

那么高可用到底是什么?簡(jiǎn)單的說(shuō)就是服務(wù)每時(shí)每刻都是可用的,當(dāng)然,保證每時(shí)每刻的可用性,是十分困難的,我們?cè)诒疚闹邢忍接懴赂呖捎脼槭裁催@么難,同時(shí)討論當(dāng)前常用保證高可用的幾種方案。另外,本文只講高可用的概述,下面會(huì)有具體的文章詳細(xì)介紹某些高可用方案的詳細(xì)原理。

一、高可用為何這么難-系統(tǒng)是如何宕機(jī)的

(一)性能過(guò)載

我們都記得前幾年在12306購(gòu)買(mǎi)火車(chē)票時(shí),12306主站經(jīng)常因?yàn)榱髁窟^(guò)大而拒絕服務(wù),這就是12306性能過(guò)載導(dǎo)致的。雖然機(jī)器的計(jì)算能力比人腦大很多,但機(jī)器總有處理能力上限,當(dāng)請(qǐng)求的負(fù)載多于其所能承受的值的時(shí)候,響應(yīng)會(huì)過(guò)慢,而繼續(xù)增加其負(fù)載,會(huì)導(dǎo)致拒絕服務(wù),而拒絕服務(wù)后,用戶因?yàn)闊o(wú)法完成某種業(yè)務(wù),會(huì)更加次的請(qǐng)求服務(wù),導(dǎo)致惡性循環(huán)。

(二)應(yīng)用異常

應(yīng)用是人寫(xiě)的,人是無(wú)法保證所有代碼是正確的,雖然應(yīng)用上線前經(jīng)過(guò)了嚴(yán)格的測(cè)試,但測(cè)試僅僅是一直模擬的驗(yàn)證行為,有些缺陷在用戶數(shù)據(jù)量少的時(shí)候無(wú)法被發(fā)現(xiàn),或者在某種特定情況下才發(fā)生,測(cè)試時(shí)難以構(gòu)造此類場(chǎng)景,一旦這類缺陷影響了邏輯路徑的主鏈路,將導(dǎo)致整個(gè)服務(wù)無(wú)法對(duì)外提供服務(wù)。

(三)中間件異常

大型應(yīng)用無(wú)法離開(kāi)中間件,一般企業(yè)應(yīng)用中間件的來(lái)源為成熟的商用中間件,或者基礎(chǔ)架構(gòu)提供的自研中間件。比如較為成熟的商用中間件有:redis(內(nèi)存性數(shù)據(jù)庫(kù)),zookeeper(分布式應(yīng)用程序協(xié)調(diào)服務(wù)),dubbo(阿里的序列化傳輸協(xié)議),kafka(消息隊(duì)列),hadoop(google的大文件存儲(chǔ)系統(tǒng)),這些中間件在應(yīng)用與應(yīng)用間傳輸數(shù)據(jù)等需求提供著連接作用,一旦此類中間件停止服務(wù)一般會(huì)導(dǎo)致整個(gè)服務(wù)宕機(jī)。有些系統(tǒng)用到多類中間件,每個(gè)中間件的穩(wěn)定性和中間件的規(guī)模和配置有關(guān),中間件的穩(wěn)定性普遍要低于普通應(yīng)用,因此中間件如果出現(xiàn)異常,影響范圍是極廣的。

(四)物理因素

支付寶2015年被挖斷機(jī)房光纖,導(dǎo)致網(wǎng)絡(luò)中斷,這種類似情況是時(shí)常發(fā)生的,除去網(wǎng)絡(luò)因素,機(jī)房掉電而備用電源未啟動(dòng)導(dǎo)致整機(jī)房宕機(jī)、機(jī)房失火、物理網(wǎng)絡(luò)設(shè)備過(guò)熱宕機(jī)等都將導(dǎo)致服務(wù)宕機(jī)。

(五)發(fā)布更新

系統(tǒng)總要增加新功能,每次增加新功能都會(huì)對(duì)系統(tǒng)進(jìn)行更新,將新代碼發(fā)布到對(duì)應(yīng)服務(wù)器,在發(fā)布過(guò)程中,絕大多數(shù)系統(tǒng)都是需要重啟應(yīng)用服務(wù)的。這就決定了在發(fā)布更新的過(guò)程中,整個(gè)系統(tǒng)是無(wú)法使用的。

(六)人為操作

我們來(lái)看下2017年發(fā)生因?yàn)閯h庫(kù)導(dǎo)致的宕機(jī)事件:
17年2月,Gitlab數(shù)據(jù)庫(kù)被誤刪,導(dǎo)致部分用戶數(shù)據(jù)暫時(shí)丟失
17年6月Verelox 官網(wǎng)今天掛出了一封公告,稱前系統(tǒng)管理員刪除了所有客戶數(shù)據(jù),清空了大部分的服務(wù)器。
17年7月,花旗銀行的前員工倫農(nóng)·雷·布朗,通過(guò)非法執(zhí)行命令,刪除了花旗銀行的內(nèi)部網(wǎng)絡(luò)上10只核心路由器上的配置文件
17年8月,騰訊公司公關(guān)總監(jiān)稱微信公眾平臺(tái)后臺(tái)保存被清空。
嗯。。。除去刪庫(kù)以外,你還要可能刪整臺(tái)服務(wù)器,不行你執(zhí)行“rm -rf /”試試

(七)黑客攻擊

現(xiàn)在黑客攻入一臺(tái)應(yīng)用服務(wù)器是十分不簡(jiǎn)單的,但是讓服務(wù)拒絕訪問(wèn)是有可能的,在國(guó)際互聯(lián)網(wǎng)上,大家的ip都是可以被知曉的,這樣就無(wú)法避免黑客進(jìn)行一些網(wǎng)絡(luò)攻擊,如著名的DDOS網(wǎng)絡(luò)洪水等,通過(guò)各種“肉雞”發(fā)送大量請(qǐng)求到某一IP地址,導(dǎo)致正常網(wǎng)絡(luò)流量不可達(dá)。

二、保證高可用的常用方案

如何保證高可用,現(xiàn)在用到的主流思想一般都是“備份”和“熱切”,備份是指不止一個(gè)機(jī)器或不止一個(gè)集群在運(yùn)行,當(dāng)其中一臺(tái)服務(wù)器或一個(gè)集群宕機(jī)時(shí)可以使用備份繼續(xù)服務(wù),熱切是指在服務(wù)切換到備份服務(wù)時(shí)服務(wù)不停止,用戶無(wú)感知,接下來(lái)我們就說(shuō)一下常用的高可用方案。

(一)性能與高可用

高可用和性能是不可分割的,一個(gè)原因是性能足夠強(qiáng)才可以承受更多的用戶請(qǐng)求,另一個(gè)原因是高可用要保證每個(gè)服務(wù)節(jié)點(diǎn)都有備份,在備份的同時(shí)保證熱切,一般為了避免資源浪費(fèi),我們?nèi)サ魺崆羞@個(gè)階段,讓備份服務(wù)器也成為主服務(wù)器對(duì)外提供服務(wù),同時(shí)保證各節(jié)點(diǎn)間數(shù)據(jù)一致性,當(dāng)其中一臺(tái)宕機(jī)時(shí),其余的服務(wù)器可以直接提供服務(wù),而不需要熱切。

負(fù)載均衡

負(fù)載均衡就是保證各節(jié)點(diǎn)災(zāi)備的同時(shí)又同時(shí)對(duì)外提供服務(wù)的一種方式。負(fù)載均衡存在大型應(yīng)用的方方面面,一般從網(wǎng)關(guān)開(kāi)始就使用F5或者nginx對(duì)應(yīng)用進(jìn)行分發(fā),到了應(yīng)用層,由使用lvs在網(wǎng)絡(luò)層進(jìn)行隨機(jī)負(fù)載,或者使用類似dubbo這類總線進(jìn)行軟件負(fù)載,在中間件層,一般每個(gè)中間件的命中策略里全部采用負(fù)載均衡,就這樣一層層的負(fù)載均衡,保證性能的同時(shí),也起到了容災(zāi)的作用。


負(fù)載均衡

我們以一張網(wǎng)關(guān)負(fù)載均衡的圖片來(lái)講解負(fù)載均衡,當(dāng)用戶訪問(wèn)服務(wù)時(shí),我們?cè)谥虚g加一臺(tái)負(fù)載分發(fā)機(jī)(F5或者Nginx)將服務(wù)分發(fā)給后面的四臺(tái)機(jī)器進(jìn)行處理,在將每天服務(wù)器負(fù)載降低四倍的同時(shí),保證高可用:其中一臺(tái)宕機(jī)時(shí),通過(guò)可用性探測(cè)斷掉到這臺(tái)的流量,讓其他三臺(tái)負(fù)載所有服務(wù)請(qǐng)求。
現(xiàn)實(shí)應(yīng)用中的負(fù)載均衡要復(fù)雜很多,我們這里僅僅用簡(jiǎn)單的例子來(lái)理解復(fù)雜均衡。

DNS負(fù)載均衡

想一個(gè)問(wèn)題,當(dāng)我們一個(gè)公網(wǎng)ip入口被阻斷時(shí)怎么切換到另一個(gè)可用ip,并且保證這個(gè)過(guò)程服務(wù)是可用的呢?
由此產(chǎn)生了一個(gè)產(chǎn)品叫做智能DNS,或者DNS負(fù)載均衡

DNS負(fù)載解析的步驟示意如下圖:

dns負(fù)載均衡
  1. 用戶向本級(jí)配置的本地DNS服務(wù)器發(fā)出查詢請(qǐng)求,如果本地DNS服務(wù)器有該域名的緩存記錄,則返回給用戶,否則進(jìn)行第2步;
  2. 本地DNS服務(wù)器進(jìn)行遞歸查詢,最終會(huì)查詢到域名注冊(cè)商處的授權(quán)DNS服務(wù)器,這里可能有多個(gè)步驟,圖中只反映最后一步;
  3. 授權(quán)DNS服務(wù)器返回一條NS記錄給本地DNS服務(wù)器。根據(jù)授權(quán)DNS服務(wù)器上的不同設(shè)置,這條NS記錄可能是指向隨機(jī)一個(gè)其中一個(gè)備份的ip地址或者是所有備份的ip地址;
  4. 本地DNS服務(wù)器向其中一個(gè)GSLB地址發(fā)出域名查詢請(qǐng)求,如果請(qǐng)求超時(shí)會(huì)向其它地址發(fā)出查詢;
  5. 智能DNS設(shè)備選出最優(yōu)解析結(jié)果,如果其中一個(gè)ip地址是無(wú)法提供服務(wù)的,那么這里的智能DNS設(shè)備將把這臺(tái)ip地址的解析去掉,最后返回一條A記錄給本地DNS服務(wù)器。根據(jù)全局負(fù)載均衡策略設(shè)定的不同可能返回一個(gè)或多個(gè)VIP地址;
  6. 本地服務(wù)器將查詢結(jié)果通過(guò)一條A記錄返回給用戶,并將緩存這條記錄。

因?yàn)镈NS的緩存特性,我們?cè)贗P地址切換時(shí)會(huì)存在一定的延時(shí),一般DNS緩存最低允許設(shè)置的更新時(shí)間是10分鐘,因此此方法會(huì)導(dǎo)致最多十分鐘的延時(shí)。但對(duì)比整個(gè)服務(wù)宕機(jī),這個(gè)延時(shí)是可以接受的。

彈性伸縮

彈性伸縮(Auto Scaling),用戶根據(jù)自己的業(yè)務(wù)需求和業(yè)務(wù)策略,自動(dòng)調(diào)整彈性計(jì)算管理服務(wù)。高峰增長(zhǎng)時(shí)增加,業(yè)務(wù)收縮時(shí)減少。彈性伸縮主要用在請(qǐng)求量在時(shí)間分布上長(zhǎng)期不對(duì)等的應(yīng)用架構(gòu)上,當(dāng)應(yīng)用請(qǐng)求多時(shí),應(yīng)用服務(wù)器自動(dòng)增加和自動(dòng)部署,并且自動(dòng)將自己加入應(yīng)用路由,請(qǐng)求減少時(shí),會(huì)釋放部分服務(wù)器以節(jié)省資源。

(二)災(zāi)備與高可用

集群多層容災(zāi)

多層負(fù)載均衡

如圖,在一個(gè)大型應(yīng)用中,其負(fù)載均衡和災(zāi)備是多層的,一般都如圖中所示,網(wǎng)關(guān)層采用負(fù)載均衡后,往下的每一層,包含每一層的中間件也采用負(fù)載均衡和容災(zāi)模式。這種層層負(fù)載和容災(zāi)保證了高可用,當(dāng)某一個(gè)機(jī)器發(fā)生宕機(jī)后,并不會(huì)對(duì)整個(gè)集群和服務(wù)造成任何影響。

同城雙活與異地災(zāi)備

為了防止機(jī)房大火大規(guī)模停電等因素造成服務(wù)中斷,一般一個(gè)應(yīng)用在一個(gè)城市中搭建兩個(gè)機(jī)房,機(jī)房間建立專線,網(wǎng)絡(luò)延時(shí)不是很高,兩個(gè)機(jī)房互為主備,這就是同城雙活。
為了防止地震等大規(guī)模的自然災(zāi)害造成數(shù)據(jù)永久性損失或長(zhǎng)時(shí)間宕機(jī),一般會(huì)在異地設(shè)立另一個(gè)備份機(jī)房,同時(shí)進(jìn)行數(shù)據(jù)實(shí)時(shí)備份,當(dāng)有災(zāi)備需求時(shí),可以保證短時(shí)間內(nèi)切換到異地機(jī)房,這叫做異地災(zāi)備,當(dāng)然,業(yè)務(wù)切分較好的企業(yè),數(shù)據(jù)庫(kù)實(shí)時(shí)性依賴不是很強(qiáng)的情況下,可以做到異地雙活。
同城雙活和異地災(zāi)備是一個(gè)復(fù)雜的技術(shù),我們將開(kāi)一篇新文章重點(diǎn)闡述。

(三)產(chǎn)品發(fā)布與高可用

產(chǎn)品發(fā)布更新時(shí),為了保證不停機(jī),一般進(jìn)行熱發(fā)布,或者叫做不停機(jī)發(fā)布。用到較多的兩個(gè)場(chǎng)景多為灰度發(fā)布和藍(lán)綠發(fā)布,其中灰度發(fā)布多傾向于生產(chǎn)驗(yàn)證,是一種新老版本同時(shí)存在的方式,雖然看起來(lái)和不停機(jī)發(fā)布沒(méi)有太多關(guān)系,但是因?yàn)榛叶鹊囊髑袚Q是即時(shí)的,這種方式更像藍(lán)綠發(fā)布,我們就來(lái)看下什么是藍(lán)綠發(fā)布。

藍(lán)綠發(fā)布

藍(lán)綠部署的模型中包含兩個(gè)集群,就好比海豚的左腦和右腦。

image
image

在沒(méi)有上線的正常情況下,集群A和集群B的代碼版本是一致的,并且同時(shí)對(duì)外提供服務(wù)。

image
image

在系統(tǒng)升級(jí)的時(shí)候下,我們首先把一個(gè)集群(比如集群A)從負(fù)載列表中摘除,進(jìn)行新版本的部署。集群B仍然繼續(xù)提供服務(wù)。

image
image

當(dāng)集群A升級(jí)完畢,我們把負(fù)載均衡重新指向集群A,再把集群B從負(fù)載列表中摘除,進(jìn)行新版本的部署。集群A重新提供服務(wù)。

image
image

最后,當(dāng)集群B也升級(jí)完成,我們把集群B也恢復(fù)到負(fù)載列表當(dāng)中。這個(gè)時(shí)候,兩個(gè)集群的版本都已經(jīng)升級(jí),并且對(duì)外的服務(wù)幾乎沒(méi)有間斷過(guò)。

image
image

(四)架構(gòu)與高可用

沒(méi)有最好的架構(gòu),只有最合適的架構(gòu),最適合自己企業(yè)的高可用架構(gòu)才是最合適的架構(gòu)。一般在高可用架構(gòu)中,業(yè)務(wù)切分十分重要,整個(gè)系統(tǒng)應(yīng)用的架構(gòu)要跟著業(yè)務(wù)切分的思路走,這是因?yàn)樵谕请p活和異地災(zāi)備時(shí),數(shù)據(jù)庫(kù)跨機(jī)房或跨地域讀取的延時(shí)是不能被接受的,這就要求同一個(gè)用戶的數(shù)據(jù)要落到同一個(gè)機(jī)房,不同用戶的數(shù)據(jù)可能落到另一個(gè)機(jī)房,中間存在數(shù)據(jù)穿插的部分使用接口調(diào)用的方式進(jìn)行業(yè)務(wù)請(qǐng)求。用戶數(shù)據(jù)的同機(jī)房化,帶來(lái)的是所有關(guān)聯(lián)表字段的同機(jī)房化。解決這個(gè)問(wèn)題不僅僅是數(shù)據(jù)庫(kù)橫向切分的問(wèn)題,更涉及到更多層次的架構(gòu)切分。
詳細(xì)內(nèi)容,請(qǐng)期待我的下一篇文章:服務(wù)端高可用架構(gòu)之兩地三中心與架構(gòu)切分

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容