機(jī)房遷移是一個(gè)很大的動(dòng)作:
15年在58同城實(shí)施過(guò)一次(“逐日”項(xiàng)目),幾千臺(tái)物理機(jī),從IDC遷到了騰訊的天津機(jī)房,項(xiàng)目做了10個(gè)多月,跨所有的部門(mén),與所有的業(yè)務(wù)都相關(guān);
16年在58到家又實(shí)施了一次(“凌云”項(xiàng)目),幾百臺(tái)虛擬機(jī),從IDC遷到阿里云,前后大概一個(gè)季度的時(shí)間,也是所有技術(shù)部門(mén)都需要配合的一個(gè)大項(xiàng)目。
要說(shuō)機(jī)房遷移,先來(lái)看看被遷移的系統(tǒng)是一個(gè)什么樣的架構(gòu)。
上圖是一個(gè)典型的互聯(lián)網(wǎng)單機(jī)房系統(tǒng)架構(gòu):
(1)上游是客戶(hù)端,PC瀏覽器或者APP;
(2)然后是站點(diǎn)接入層,為了面對(duì)高流量,保證架構(gòu)的高可用,站點(diǎn)冗余了多份;
(3)接下來(lái)是服務(wù)層,服務(wù)層又分為與業(yè)務(wù)相關(guān)的業(yè)務(wù)服務(wù),以及業(yè)務(wù)無(wú)關(guān)的基礎(chǔ)服務(wù),為了保證高可用,所有服務(wù)也冗余了多份;
(4)底層是數(shù)據(jù)層,數(shù)據(jù)層又分為緩存數(shù)據(jù)與數(shù)據(jù)庫(kù);
至于為什么要做分層架構(gòu),不是今天的重點(diǎn),不做展開(kāi)討論,這是一個(gè)典型的互聯(lián)網(wǎng)單機(jī)房分層架構(gòu):所有的應(yīng)用、服務(wù)、數(shù)據(jù)是部署在同一個(gè)機(jī)房,這個(gè)架構(gòu)有的一個(gè)關(guān)鍵詞,叫做“全連”:
(1)站點(diǎn)層調(diào)用業(yè)務(wù)服務(wù)層,業(yè)務(wù)服務(wù)復(fù)制了多少份,上層就要連接多少個(gè)服務(wù);
(2)業(yè)務(wù)服務(wù)層調(diào)用基礎(chǔ)服務(wù)層,基礎(chǔ)服務(wù)復(fù)制了多少份,上層就要連多少個(gè)服務(wù);
(3)服務(wù)層調(diào)用數(shù)據(jù)庫(kù),從庫(kù)冗余了多少份,上層就要連多少個(gè)從庫(kù);
單機(jī)房架構(gòu)的特點(diǎn)是“全連”,那么機(jī)房遷移我們是要做一個(gè)什么樣的事情呢?先看這張圖:
之前單機(jī)房架構(gòu)部署在機(jī)房A內(nèi),遷移之后仍然是單機(jī)房架構(gòu),只是換了一個(gè)B機(jī)房,做完這個(gè)遷移,有什么好的方案?最容易想到的一個(gè)方案,把所有服務(wù)在新機(jī)房全部搭一套,然后流量切過(guò)來(lái)了。所以,機(jī)房遷移的難點(diǎn),是“平滑”遷移,整個(gè)過(guò)程不停服務(wù),整體遷移方案的目標(biāo)是:
(1)可以分批遷移;
(2)隨時(shí)可以回滾;
(3)平滑遷移,不停服務(wù);
如果想要平滑的遷移機(jī)房,不停服務(wù),在10個(gè)月的逐步遷移過(guò)程中,肯定存在一個(gè)中間過(guò)渡階段,兩邊機(jī)房都有流量,兩邊機(jī)房都對(duì)外提供服務(wù),這就是一個(gè)多機(jī)房的架構(gòu)了。
多機(jī)房架構(gòu)是什么樣的架構(gòu)呢?剛剛提到了單機(jī)房架構(gòu),上層連中層,中層連下層,它是一個(gè)全連的架構(gòu),能不能直接將單機(jī)房的全連架構(gòu)套用到多機(jī)房呢?在另一個(gè)機(jī)房部署好站點(diǎn)層、服務(wù)層、數(shù)據(jù)層,直接使用“全連”的單機(jī)房架構(gòu),我們會(huì)發(fā)現(xiàn):會(huì)有非常多跨機(jī)房的連接
(1)站點(diǎn)層連接業(yè)務(wù)服務(wù)層,一半的請(qǐng)求跨機(jī)房
(2)業(yè)務(wù)服務(wù)層連接基礎(chǔ)服務(wù)層,一半的請(qǐng)求跨機(jī)房
(3)基礎(chǔ)服務(wù)層連數(shù)據(jù)層(例如從庫(kù)),一半的請(qǐng)求跨機(jī)房
大量的跨機(jī)房連接會(huì)帶來(lái)什么樣的問(wèn)題呢?
我們知道,同機(jī)房連接,內(nèi)網(wǎng)的性能損耗幾乎可以忽略不計(jì),但是一旦涉及到跨機(jī)房的訪問(wèn),即使機(jī)房和機(jī)房之間有專(zhuān)線,訪問(wèn)的時(shí)延可能增加到幾毫秒(跟幾房間光纖距離有關(guān))。
“同連”也很好理解,在非必須的情況下,優(yōu)先連接同機(jī)房的站點(diǎn)與服務(wù):
(1)站點(diǎn)層只連接同機(jī)房的業(yè)務(wù)服務(wù)層;
(2)業(yè)務(wù)服務(wù)層只連接同機(jī)房的基礎(chǔ)服務(wù)層;
(3)服務(wù)層只連接同機(jī)房的“讀”庫(kù);
(4)對(duì)于寫(xiě)庫(kù),沒(méi)辦法,只有跨機(jī)房讀“寫(xiě)”庫(kù)了;
這個(gè)方案當(dāng)然也有它的不足:
(1)跨機(jī)房同步數(shù)據(jù),會(huì)多5毫秒(舉個(gè)栗子,不要叫真這個(gè)數(shù)值)延時(shí)(主從本來(lái)會(huì)有延時(shí),這個(gè)延時(shí)會(huì)增大),這個(gè)影響的是某一個(gè)機(jī)房的數(shù)據(jù)讀取;
(2)跨機(jī)房寫(xiě),會(huì)多5毫秒延時(shí),這個(gè)影響的是某一個(gè)機(jī)房的數(shù)據(jù)寫(xiě)入,當(dāng)然這個(gè)寫(xiě)請(qǐng)求比例是很小的;
多機(jī)房架構(gòu)的本意是容機(jī)房故障,這個(gè)架構(gòu)當(dāng)出現(xiàn)機(jī)房故障時(shí),例如一個(gè)機(jī)房地震了,把入口處流量切到另一個(gè)機(jī)房就能容錯(cuò),不過(guò):
(1)掛掉的是不包含數(shù)據(jù)庫(kù)主庫(kù)的從機(jī)房,遷移流量后直接容錯(cuò);
(2)掛掉的是包含數(shù)據(jù)庫(kù)主庫(kù)的主機(jī)房,只遷移流量,其實(shí)系統(tǒng)整體99%的讀請(qǐng)求可以容錯(cuò),但1%的寫(xiě)請(qǐng)求其實(shí)會(huì)受到影響,此時(shí)需要人工介入,將從庫(kù)變?yōu)橹鲙?kù),才能完全容錯(cuò)。這個(gè)過(guò)程只需要DBA介入,不需要所有業(yè)務(wù)線上游修改(除非,除非,業(yè)務(wù)線直接使用的IP連接,這個(gè),我就不說(shuō)什么了)。
話題收回來(lái),機(jī)房遷移的過(guò)程中,一定存在一個(gè)中間過(guò)渡階段,兩邊機(jī)房都有流量,兩邊機(jī)房都對(duì)外提供服務(wù)的多機(jī)房架構(gòu)。具體到機(jī)房的逐步遷移,又是個(gè)什么步驟呢?通常有兩種方案,一種是自頂向下的遷移,一種是自底向上的遷移,這兩種方案在58到家和58同城分別實(shí)行過(guò),都是可行的,方案有類(lèi)似的地方,也有很多細(xì)節(jié)不一樣,因?yàn)闀r(shí)間關(guān)系展開(kāi)說(shuō)一種,在58到家實(shí)施過(guò)的“自頂向下”的機(jī)房遷移方案,整個(gè)過(guò)程是平滑的,逐步遷移的,可回滾的,對(duì)業(yè)務(wù)無(wú)影響的。
遷移之前當(dāng)然要做一些提前準(zhǔn)備,新機(jī)房要準(zhǔn)備就緒,專(zhuān)線要準(zhǔn)備就緒,這個(gè)是前提。
這里要注意幾個(gè)點(diǎn):
(1)有些公司緩存沒(méi)有使用內(nèi)網(wǎng)域名,而是采用IP直連的話,則需要業(yè)務(wù)層配合,換新機(jī)房IP重啟一下即可(如果是IP直連,說(shuō)明這個(gè)架構(gòu)還有改進(jìn)的空間喲);
(2)這個(gè)操作盡量選在流量低峰期,舊緩存中都是熱數(shù)據(jù),而新緩存是空數(shù)據(jù),如果選在流量高峰期,緩存切換之后,短時(shí)間內(nèi)可能會(huì)有大量請(qǐng)求透?jìng)鞯綌?shù)據(jù)庫(kù)上去,導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大;
(3)這個(gè)通用步驟,適用于允許cache miss的業(yè)務(wù)場(chǎng)景,如果業(yè)務(wù)對(duì)緩存有高可用的要求,不允許cache miss,則需要雙寫(xiě)緩存,或者緩存使用主從同步的架構(gòu)。大部分緩存的業(yè)務(wù)場(chǎng)景都是允許cache miss的,少數(shù)特殊業(yè)務(wù)使用特殊的方案遷移。
“數(shù)據(jù)庫(kù)的遷移”
站點(diǎn)層,服務(wù)層,緩存層都遷移完之后,最后是數(shù)據(jù)庫(kù)的遷移。
數(shù)據(jù)庫(kù)同步完之后,如何進(jìn)行切換和遷移呢?能不能像緩存的遷移一樣,運(yùn)維改一個(gè)數(shù)據(jù)庫(kù)內(nèi)網(wǎng)DNS指向,然后切斷數(shù)據(jù)庫(kù)連接,讓服務(wù)重連新的數(shù)據(jù)庫(kù),這樣業(yè)務(wù)服務(wù)不需要改動(dòng),也不需要重啟,這樣可以么?
這個(gè)方式看上去很不錯(cuò),但數(shù)據(jù)庫(kù)的遷移沒(méi)有那么理想:
第一,得保證數(shù)據(jù)庫(kù)同步完成,才能切流量,但數(shù)據(jù)同步總是有遲延的,舊機(jī)房一直在不停的寫(xiě)如數(shù)據(jù),何時(shí)才算同步完成呢?
第二,只有域名和端口不發(fā)生變化,才能不修改配置完成切換,但如果域名和端口(主要是端口)發(fā)生變化,是做不到不修改配置和重啟的。舉個(gè)例子,假設(shè)原有數(shù)據(jù)庫(kù)實(shí)例端口用了5858,很吉利,而阿里云要求你使用3200,就必須改端口重啟。
四十分鐘很短,focus講了幾個(gè)點(diǎn),希望大家有收獲。
做個(gè)簡(jiǎn)要的總結(jié):
(1)互聯(lián)網(wǎng)單機(jī)房架構(gòu)的特點(diǎn),全連,站點(diǎn)層全連業(yè)務(wù)服務(wù)層,業(yè)務(wù)服務(wù)層全連的基礎(chǔ)服務(wù)層,基礎(chǔ)服務(wù)層全連數(shù)據(jù)庫(kù)和緩存;
(2)多機(jī)房架構(gòu)的特點(diǎn),同連,接入層同連服務(wù)層,服務(wù)層同連緩存和數(shù)據(jù)庫(kù),架構(gòu)設(shè)計(jì)上最大程度的減少跨機(jī)房的調(diào)用;
(3)自頂向下的機(jī)房遷移方案:先進(jìn)行站點(diǎn)接入層、業(yè)務(wù)服務(wù)層和基礎(chǔ)服務(wù)層的遷移,搭建服務(wù),逐步的遷移流量;然后是緩存遷移,搭建緩存,運(yùn)維修改緩存的內(nèi)網(wǎng)DNS指向,斷開(kāi)舊連接,重連新緩存,完成遷移;最后數(shù)據(jù)庫(kù)的遷移,搭建數(shù)據(jù)庫(kù),數(shù)據(jù)進(jìn)行同步,只讀,保證數(shù)據(jù)同步完成之后,修改配置,重啟,完成遷移。整個(gè)過(guò)程分批遷移,一個(gè)業(yè)務(wù)線一個(gè)業(yè)務(wù)線的遷移,一塊緩存一塊緩存的遷移,一個(gè)數(shù)據(jù)庫(kù)一個(gè)數(shù)據(jù)庫(kù)的遷移,任何步驟出現(xiàn)問(wèn)題是可以回滾的,整個(gè)過(guò)程不停服務(wù)。
主持人:講的很細(xì)致,大家有什么問(wèn)題嗎,可以提一些問(wèn)題,可以舉手示意我。
提問(wèn):做數(shù)據(jù)遷移的時(shí)候,因?yàn)槟v的數(shù)據(jù)中心的都是在同一個(gè)老機(jī)房,同時(shí)又在做同步,我就在想這個(gè)數(shù)據(jù)庫(kù)的壓力是不是特別大。
沈劍:非常好的問(wèn)題,這個(gè)地方一方面要考慮壓力,更重要的是考慮跨機(jī)房的專(zhuān)線,風(fēng)險(xiǎn)最大的是在帶寬這一部分,你在第一步遷移完之后,其實(shí)所有的緩存,數(shù)據(jù)庫(kù)用其實(shí)都是跨機(jī)房的,都是通過(guò)專(zhuān)線去走的,這個(gè)專(zhuān)線帶寬是需要重點(diǎn)考慮與評(píng)估的,數(shù)據(jù)庫(kù)的壓力其實(shí)還好。
提問(wèn):我想請(qǐng)教一個(gè)問(wèn)題,你這個(gè)流量切換的過(guò)程中,有測(cè)試性的階段還是直接切過(guò)去的。
沈劍:在切流量之前,肯定是有測(cè)試的,在新機(jī)房將服務(wù)搭建,在切換流量之前,測(cè)試的同學(xué)需要進(jìn)行回歸,回歸的過(guò)程可以提前發(fā)現(xiàn)很多問(wèn)題。逐步的切流量也是為了保證可靠性,我們不是一次性百分之百流量都切過(guò)來(lái),先切1%的流量過(guò)來(lái),觀察服務(wù)沒(méi)有問(wèn)題,再逐步增大流量切換。
主持人:上午先到這里,也歡迎大家關(guān)注沈老師的“架構(gòu)師之路”微信公眾號(hào),下午我們準(zhǔn)時(shí)開(kāi)始,大家注意好休息時(shí)間,謝謝大家。
更多建議: