上篇文章我們總結(jié)了一下同城雙活袜炕、異地多活、兩地三中心等一些部署架構(gòu)初家,那么這篇文章我來發(fā)表一下我對三地五中心的理解偎窘。
我們上篇文章講過兩地三中心這個架構(gòu)乌助,如下圖:

這種架構(gòu)具備容災(zāi)能力,比如生產(chǎn)數(shù)據(jù)中心停電了陌知,那么可以把所有流量都切到同城災(zāi)備中心或異地災(zāi)備中心他托,那么現(xiàn)在的問題是假如真到了停電的那一天,你敢把所有的流量都切到災(zāi)備中心去嗎仆葡?
上篇文章說了赏参,災(zāi)備中心它主要的功能是作為生產(chǎn)數(shù)據(jù)中心的一個備份,所以它并沒有如同生產(chǎn)數(shù)據(jù)中心一樣不停的在對外提供服務(wù)沿盅,那么就有問題了把篓,災(zāi)備相當(dāng)于一個新人镇辉,一個一直在模仿大哥的一個新人魔市,現(xiàn)在大哥受傷了捆毫,按道理是應(yīng)該小弟頂上豆瘫,但是小弟還是個新人评腺,硬頂上去是不是很有可能會出錯溉委?也就是說:
- 第一愉豺,不能保證災(zāi)備中心有能力接管線上所有的用戶流量搔耕,可能剛已接收災(zāi)備中心被壓垮费彼,或者出現(xiàn)其他各種各樣預(yù)估不到的錯誤窒悔;
- 第二,如果生產(chǎn)數(shù)據(jù)中心接收了用戶的寫請求敌买,還沒來得及同步到災(zāi)備中心简珠,這個時候停電了,這種情況下虹钮,也不能直接把用戶流量切到災(zāi)備中心聋庵。
所以基于上面的分析,并不是說災(zāi)備中心一定不能頂上芙粱,只是在頂上之前可能還要做很多其他的檢查和準(zhǔn)備祭玉,這個時間是不確定的,至少不會很快...春畔。
那么問題來了脱货,該怎么辦?
首先對于上面列出來的兩點(diǎn)中的第一點(diǎn)律姨,如果我們能夠讓災(zāi)備中心不再僅僅只能用來做災(zāi)備振峻,還能和生產(chǎn)數(shù)據(jù)中心一樣正常的對外提供服務(wù)呢?如下圖:

可以看到上面的架構(gòu)圖:
- 不再區(qū)分生產(chǎn)數(shù)據(jù)中心和災(zāi)備數(shù)據(jù)中心择份,只有數(shù)據(jù)中心扣孟,而且數(shù)據(jù)中心之間相互備份數(shù)據(jù),保證每個數(shù)據(jù)中心都是全量數(shù)據(jù)荣赶。
- 用戶可以在任意一個數(shù)據(jù)中心上進(jìn)行讀寫操作凤价。
好鸽斟,首先我們不管這種架構(gòu)能不能實(shí)現(xiàn),至少它的好處是非常明顯的:
- 每個數(shù)據(jù)中心一直在對外提供服務(wù)(不是一個新手)利诺,所以當(dāng)一個數(shù)據(jù)中心停電后富蓄,直接把用戶流量切到另外一個數(shù)據(jù)中心也是問題不大的。
- 用戶可以就近訪問數(shù)據(jù)中心慢逾,這樣用戶的體驗(yàn)更好立倍,并且整個架構(gòu)的流量也比較平均。
優(yōu)點(diǎn)很明顯氛改,如果能實(shí)現(xiàn)就再好不過了帐萎,那么這種架構(gòu)實(shí)現(xiàn)起來最重要的一點(diǎn)就是:用戶同時向不同數(shù)據(jù)中心寫入數(shù)據(jù),數(shù)據(jù)中心雙向同步數(shù)據(jù)時胜卤,如果出現(xiàn)沖突該如何解決疆导?
那么這個問題,目前阿里和螞蟻金服的解決辦法是:將用戶按某一個規(guī)則進(jìn)行分組葛躏,每組用戶寫入數(shù)據(jù)時只能寫入到指定的數(shù)據(jù)中心澈段,相當(dāng)于用戶與數(shù)據(jù)中心綁定在一起了,這樣保證了數(shù)據(jù)中心在雙向同步之前數(shù)據(jù)是不會沖突的舰攒,因?yàn)榘从脩舴纸M了败富,不同用戶的數(shù)據(jù)不會沖突。
當(dāng)然思路非常簡單摩窃,但是實(shí)現(xiàn)起來肯定是非常麻煩的兽叮,但是思路肯定是可以的,阿里也用實(shí)踐證明了猾愿,我們先把上面的架構(gòu)稍微完善一下:

用戶使用網(wǎng)站時鹦聪,由運(yùn)營商網(wǎng)絡(luò)或CDN選擇最近的機(jī)房,機(jī)房內(nèi)部署一個負(fù)載均衡蒂秘,由這個負(fù)載均衡最終判斷用戶屬于機(jī)房(前文中的數(shù)據(jù)中心)泽本,也就是可能出現(xiàn),用戶在注冊時在北京姻僧,那么他的uid就和北京某個機(jī)房綁定了规丽,那么當(dāng)這個用戶在上海使用時,會由上海的負(fù)載均衡按照用戶分組規(guī)則將請求轉(zhuǎn)發(fā)到北京綁定的那個機(jī)房去(當(dāng)然并不是所有請求撇贺,比如讀請求肯定可以直接在上海機(jī)房進(jìn)行讀取赌莺,所以具體的實(shí)現(xiàn)都要看業(yè)務(wù)怎么實(shí)現(xiàn)了,以及負(fù)載均衡具體的配置显熏,這里只是把最簡單易懂的思路說一下)雄嚣。
所以,我們現(xiàn)在可以
- 假設(shè)北京機(jī)房1應(yīng)用程序或數(shù)據(jù)庫對應(yīng)的機(jī)器停電了喘蟆,那么我們可以調(diào)整負(fù)載均衡是原本屬于這個機(jī)房的用戶流量轉(zhuǎn)移到機(jī)房2去缓升,注意這里不要有疑問,將用戶進(jìn)行分組是為了防止用戶同時寫兩個數(shù)據(jù)庫發(fā)生沖突蕴轨,那么現(xiàn)在機(jī)房1里其實(shí)已經(jīng)不能寫入數(shù)據(jù)了港谊,所以將流量遷移到機(jī)房2是沒有問題的。
- 假設(shè)北京機(jī)房1整個停電了橙弱,那么可以通過運(yùn)營商網(wǎng)絡(luò)或CDN將流量遷移到北京機(jī)房2歧寺。
- 假設(shè)北京停電了,那么一樣可以將流量遷移到上海棘脐。
這個架構(gòu)中最重要的其實(shí)就是用戶分組斜筐,所以包括我們的應(yīng)用程序、數(shù)據(jù)庫負(fù)載均衡蛀缝、數(shù)據(jù)庫分表等等都需要按用戶進(jìn)行分組顷链,我們要保證針對同一個用戶的請求與操作都在同一個機(jī)房內(nèi),不去跨機(jī)房屈梁,這樣才是最快的嗤练,這就是單元化。
那么上面這個架構(gòu)實(shí)際上就是一個高級版的“兩地三中心”在讶,只是這種單元化架構(gòu)我們可以任意去擴(kuò)展(只要你足夠有錢煞抬,因?yàn)榇钜惶兹渲玫臄?shù)據(jù)中心是需要很高成本的),比如你在上海在增加一個數(shù)據(jù)中心构哺,在杭州也增加一個革答,那么就如下圖:

這就叫三地五中心。
市面上淺顯的講述三地五中心的文章不多曙强,希望這篇文章能給你幫助残拐,當(dāng)然我也是參考了其他文章有了自己的理解,如果錯誤的地方歡迎大家指正旗扑。
- https://www.infoq.cn/article/interview-alibaba-bixuan
- https://tech.antfin.com/community/articles/327
相信大家不喜歡在小小的手機(jī)屏幕上還看到一大塊的代碼蹦骑,閱讀體驗(yàn)不好,所以我寫作的風(fēng)格會文字偏多一點(diǎn)臀防。如果覺得有所收獲就給個小小的贊吧眠菇。