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