一文聊聊高可用的“異地多活”架構(gòu)設(shè)計(jì)

前言
高可用
1、高可用的一些解決方案
冷備 雙機(jī)熱備 同城雙活 異地雙活 異地多活
冷備
簡(jiǎn)單
快速備份(相對(duì)于其他備份方式)
快速恢復(fù)。只需要將備份文件拷貝回工作目錄即完成恢復(fù)過(guò)程(亦或者修改數(shù)據(jù)庫(kù)的配置,直接將備份的目錄修改為數(shù)據(jù)庫(kù)工作目錄)。更甚,通過(guò)兩次mv命令就可瞬間完成恢復(fù)。
可以按照時(shí)間點(diǎn)恢復(fù)。比如,幾天前發(fā)生的拼多多優(yōu)惠券漏洞被人刷掉很多錢(qián),可以根據(jù)前一個(gè)時(shí)間點(diǎn)進(jìn)行還原,“挽回?fù)p失”。
服務(wù)需要停機(jī)。n個(gè)9肯定無(wú)法做到了。然后,以前我們的停機(jī)冷備是在凌晨沒(méi)有人使用的時(shí)候進(jìn)行,但是現(xiàn)在很多的互聯(lián)網(wǎng)應(yīng)用已經(jīng)是面向全球了,所以,任何時(shí)候都是有人在使用的。 數(shù)據(jù)丟失。如果不采取措施,那么在完成了數(shù)據(jù)恢復(fù)后,備份時(shí)間點(diǎn)到還原時(shí)間內(nèi)的數(shù)據(jù)會(huì)丟失。傳統(tǒng)的做法,是冷備還原以后,通過(guò)數(shù)據(jù)庫(kù)日志手動(dòng)恢復(fù)數(shù)據(jù)。比如通過(guò) redo日志,更甚者,我還曾經(jīng)通過(guò)業(yè)務(wù)日志去手動(dòng)回放請(qǐng)求恢復(fù)數(shù)據(jù)。恢復(fù)是極大的體力活,錯(cuò)誤率高,恢復(fù)時(shí)間長(zhǎng)。 冷備是全量備份。全量備份會(huì)造成磁盤(pán)空間浪費(fèi),以及容量不足的問(wèn)題,只能通過(guò)將備份拷貝到其他移動(dòng)設(shè)備上解決。所以,整個(gè)備份過(guò)程的時(shí)間其實(shí)更長(zhǎng)了。 想象一下每天拷貝幾個(gè)T的數(shù)據(jù)到移動(dòng)硬盤(pán)上,需要多少移動(dòng)硬盤(pán)和時(shí)間。并且,全量備份是無(wú)法定制化的,比如只備份某一些表,是無(wú)法做到的。
雙機(jī)熱備
熱備,和冷備比起來(lái),主要的差別是不用停機(jī),一邊備份一邊提供服務(wù)。但還原的時(shí)候還是需要停機(jī)的。由于我們討論的是和存儲(chǔ)相關(guān)的,所以不將共享磁盤(pán)的方式看作雙機(jī)熱備。
Active/Standby模式
相當(dāng)于1主1從,主節(jié)點(diǎn)對(duì)外提供服務(wù),從節(jié)點(diǎn)作為backup。通過(guò)一些手段將數(shù)據(jù)從主節(jié)點(diǎn)同步到從節(jié)點(diǎn),當(dāng)故障發(fā)生時(shí),將從節(jié)點(diǎn)設(shè)置為工作節(jié)點(diǎn)。數(shù)據(jù)同步的方式可以是偏軟件層面,也可以是偏硬件層面的。偏軟件層面的,比如mysql的master/slave方式,通過(guò)同步binlog的方式;sqlserver的訂閱復(fù)制方式。偏硬件層面,通過(guò)扇區(qū)和磁盤(pán)的攔截等鏡像技術(shù),將數(shù)據(jù)拷貝到另外的磁盤(pán)。偏硬件的方式,也被叫做數(shù)據(jù)級(jí)災(zāi)備;偏軟件的,被叫做應(yīng)用級(jí)災(zāi)備。后文談得更多的是應(yīng)用級(jí)災(zāi)備。
雙機(jī)互備
本質(zhì)上還是Active/Standby,只是互為主從而已。雙機(jī)互備并不能工作于同一個(gè)業(yè)務(wù),只是在服務(wù)器角度來(lái)看,更好的壓榨了可用的資源。比如,兩個(gè)業(yè)務(wù)分別有庫(kù)A和B,通過(guò)兩個(gè)機(jī)器P和Q進(jìn)行部署。那么對(duì)于A業(yè)務(wù),P主Q從,對(duì)于B業(yè)務(wù),Q主P從。整體上看起來(lái)是兩個(gè)機(jī)器互為主備。這種架構(gòu)下,讀寫(xiě)分離是很好的,單寫(xiě)多讀,減少?zèng)_突又提高了效率。
其他的高可用方案還可以參考各類(lèi)數(shù)據(jù)庫(kù)的多種部署模式,比如mysql的主從、雙主多從、MHA;redis 的主從,哨兵,cluster 等等。
同城雙活
前面講到的幾種方案,基本都是在一個(gè)局域網(wǎng)內(nèi)進(jìn)行的。業(yè)務(wù)發(fā)展到后面,有了同城多活的方案。和前面比起來(lái),不信任的粒度從機(jī)器轉(zhuǎn)為了機(jī)房。這種方案可以解決某個(gè)IDC機(jī)房整體掛掉的情況(停電,斷網(wǎng)等)。
同城雙活其實(shí)和前文提到的雙機(jī)熱備沒(méi)有本質(zhì)的區(qū)別,只是“距離”更遠(yuǎn)了,基本上還是一樣(同城專(zhuān)線(xiàn)網(wǎng)速還是很快的)。雙機(jī)熱備提供了災(zāi)備能力,雙機(jī)互備避免了過(guò)多的資源浪費(fèi)。
在程序代碼的輔助下,有的業(yè)務(wù)還可以做到真正的雙活,即同一個(gè)業(yè)務(wù),雙主,同時(shí)提供讀寫(xiě),只要處理好沖突的問(wèn)題即可。需要注意的是,并不是所有的業(yè)務(wù)都能做到。
業(yè)界更多采用的是兩地三中心的做法。遠(yuǎn)端的備份機(jī)房能更大的提供災(zāi)備能力,能更好的抵抗地震,恐襲等情況。雙活的機(jī)器必須部署到同城,距離更遠(yuǎn)的城市作為災(zāi)備機(jī)房。災(zāi)備機(jī)房是不對(duì)外提供服務(wù)的,只作為備份使用,發(fā)生故障了才切流量到災(zāi)備機(jī)房;或者是只作為數(shù)據(jù)備份。原因主要在于:距離太遠(yuǎn),網(wǎng)絡(luò)延遲太大。

如上圖,用戶(hù)流量通過(guò)負(fù)載均衡,將服務(wù)A的流量發(fā)送到IDC1,服務(wù)器集A;將服務(wù)B的流量發(fā)送到IDC2,服務(wù)器B;同時(shí),服務(wù)器集a和b分別從A和B進(jìn)行同城專(zhuān)線(xiàn)的數(shù)據(jù)同步,并且通過(guò)長(zhǎng)距離的異地專(zhuān)線(xiàn)往IDC3進(jìn)行同步。當(dāng)任何一個(gè)IDC當(dāng)機(jī)時(shí),將所有流量切到同城的另一個(gè)IDC機(jī)房,完成了failover。
當(dāng)城市1發(fā)生大面積故障時(shí),比如發(fā)生地震導(dǎo)致IDC1和2同時(shí)停止工作,則數(shù)據(jù)在IDC3得以保全。同時(shí),如果負(fù)載均衡仍然有效,也可以將流量全部轉(zhuǎn)發(fā)到IDC3中。不過(guò),此時(shí)IDC3機(jī)房的距離非常遠(yuǎn),網(wǎng)絡(luò)延遲變得很?chē)?yán)重,通常用戶(hù)的體驗(yàn)的會(huì)受到嚴(yán)重影響的。

3、異地雙活


對(duì)于個(gè)別一致性要求很高的應(yīng)用,我們提供了一種強(qiáng)一致的方案(Global Zone),Globa Zone是一種跨機(jī)房的讀寫(xiě)分離機(jī)制,所有的寫(xiě)操作被定向到一個(gè) Master 機(jī)房進(jìn)行,以保證一致性,讀操作可以在每個(gè)機(jī)房的 Slave庫(kù)執(zhí)行,也可以 bind 到 Master 機(jī)房進(jìn)行,這一切都基于我們的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)層(DAL)完成,業(yè)務(wù)基本無(wú)感知。 ——《餓了么異地多活技術(shù)實(shí)現(xiàn)(一)總體介紹》
異地多活



