你知道三地五中心吗
兩地三中心這個(gè)架構(gòu),如下圖:
?
這種架構(gòu)具備容災(zāi)能力,比如生產(chǎn)數(shù)據(jù)中心停電了,那么可以把所有流量都切到同城災(zāi)備中心或異地災(zāi)備中心,那么現(xiàn)在的問(wèn)題是假如真到了停電的那一天,你敢把所有的流量都切到災(zāi)備中心去嗎?上篇文章說(shuō)了,災(zāi)備中心它主要的功能是作為生產(chǎn)數(shù)據(jù)中心的一個(gè)備份,所以它并沒(méi)有如同生產(chǎn)數(shù)據(jù)中心一樣不停的在對(duì)外提供服務(wù),那么就有問(wèn)題了,災(zāi)備相當(dāng)于一個(gè)新人,一個(gè)一直在模仿大哥的一個(gè)新人,現(xiàn)在大哥受傷了,按道理是應(yīng)該小弟頂上,但是小弟還是個(gè)新人,硬頂上去是不是很有可能會(huì)出錯(cuò)?也就是說(shuō):
-
第一,不能保證災(zāi)備中心有能力接管線上所有的用戶流量,可能剛已接收災(zāi)備中心被壓垮,或者出現(xiàn)其他各種各樣預(yù)估不到的錯(cuò)誤;
-
第二,如果生產(chǎn)數(shù)據(jù)中心接收了用戶的寫請(qǐng)求,還沒(méi)來(lái)得及同步到災(zāi)備中心,這個(gè)時(shí)候停電了,這種情況下,也不能直接把用戶流量切到災(zāi)備中心。
所以基于上面的分析,并不是說(shuō)災(zāi)備中心一定不能頂上,只是在頂上之前可能還要做很多其他的檢查和準(zhǔn)備,這個(gè)時(shí)間是不確定的,至少不會(huì)很快...。
那么問(wèn)題來(lái)了,該怎么辦?
首先對(duì)于上面列出來(lái)的兩點(diǎn)中的第一點(diǎn),如果我們能夠讓災(zāi)備中心不再僅僅只能用來(lái)做災(zāi)備,還能和生產(chǎn)數(shù)據(jù)中心一樣正常的對(duì)外提供服務(wù)呢?如下圖:
可以看到上面的架構(gòu)圖:
-
不再區(qū)分生產(chǎn)數(shù)據(jù)中心和災(zāi)備數(shù)據(jù)中心,只有數(shù)據(jù)中心,而且數(shù)據(jù)中心之間相互備份數(shù)據(jù),保證每個(gè)數(shù)據(jù)中心都是全量數(shù)據(jù)。
-
用戶可以在任意一個(gè)數(shù)據(jù)中心上進(jìn)行讀寫操作。
好,首先我們不管這種架構(gòu)能不能實(shí)現(xiàn),至少它的好處是非常明顯的:
每個(gè)數(shù)據(jù)中心一直在對(duì)外提供服務(wù)(不是一個(gè)新手),所以當(dāng)一個(gè)數(shù)據(jù)中心停電后,直接把用戶流量切到另外一個(gè)數(shù)據(jù)中心也是問(wèn)題不大的。
用戶可以就近訪問(wèn)數(shù)據(jù)中心,這樣用戶的體驗(yàn)更好,并且整個(gè)架構(gòu)的流量也比較平均。
優(yōu)點(diǎn)很明顯,如果能實(shí)現(xiàn)就再好不過(guò)了,那么這種架構(gòu)實(shí)現(xiàn)起來(lái)最重要的一點(diǎn)就是:用戶同時(shí)向不同數(shù)據(jù)中心寫入數(shù)據(jù),數(shù)據(jù)中心雙向同步數(shù)據(jù)時(shí),如果出現(xiàn)沖突該如何解決?那么這個(gè)問(wèn)題,目前阿里和螞蟻金服的解決辦法是:將用戶按某一個(gè)規(guī)則進(jìn)行分組,每組用戶寫入數(shù)據(jù)時(shí)只能寫入到指定的數(shù)據(jù)中心,相當(dāng)于用戶與數(shù)據(jù)中心綁定在一起了,這樣保證了數(shù)據(jù)中心在雙向同步之前數(shù)據(jù)是不會(huì)沖突的,因?yàn)榘从脩舴纸M了,不同用戶的數(shù)據(jù)不會(huì)沖突。當(dāng)然思路非常簡(jiǎn)單,但是實(shí)現(xiàn)起來(lái)肯定是非常麻煩的,但是思路肯定是可以的,阿里也用實(shí)踐證明了,我們先把上面的架構(gòu)稍微完善一下:
?
用戶使用網(wǎng)站時(shí),由運(yùn)營(yíng)商網(wǎng)絡(luò)或CDN選擇最近的機(jī)房,機(jī)房?jī)?nèi)部署一個(gè)負(fù)載均衡,由這個(gè)負(fù)載均衡最終判斷用戶屬于機(jī)房(前文中的數(shù)據(jù)中心),也就是可能出現(xiàn),用戶在注冊(cè)時(shí)在北京,那么他的uid就和北京某個(gè)機(jī)房綁定了,那么當(dāng)這個(gè)用戶在上海使用時(shí),會(huì)由上海的負(fù)載均衡按照用戶分組規(guī)則將請(qǐng)求轉(zhuǎn)發(fā)到北京綁定的那個(gè)機(jī)房去(當(dāng)然并不是所有請(qǐng)求,比如讀請(qǐng)求肯定可以直接在上海機(jī)房進(jìn)行讀取,所以具體的實(shí)現(xiàn)都要看業(yè)務(wù)怎么實(shí)現(xiàn)了,以及負(fù)載均衡具體的配置,這里只是把最簡(jiǎn)單易懂的思路說(shuō)一下)。
所以,我們現(xiàn)在可以
-
假設(shè)北京機(jī)房1應(yīng)用程序或數(shù)據(jù)庫(kù)對(duì)應(yīng)的機(jī)器停電了,那么我們可以調(diào)整負(fù)載均衡是原本屬于這個(gè)機(jī)房的用戶流量轉(zhuǎn)移到機(jī)房2去,注意這里不要有疑問(wèn),將用戶進(jìn)行分組是為了防止用戶同時(shí)寫兩個(gè)數(shù)據(jù)庫(kù)發(fā)生沖突,那么現(xiàn)在機(jī)房1里其實(shí)已經(jīng)不能寫入數(shù)據(jù)了,所以將流量遷移到機(jī)房2是沒(méi)有問(wèn)題的。
-
假設(shè)北京機(jī)房1整個(gè)停電了,那么可以通過(guò)運(yùn)營(yíng)商網(wǎng)絡(luò)或CDN將流量遷移到北京機(jī)房2。
-
假設(shè)北京停電了,那么一樣可以將流量遷移到上海。
這個(gè)架構(gòu)中最重要的其實(shí)就是用戶分組,所以包括我們的應(yīng)用程序、數(shù)據(jù)庫(kù)負(fù)載均衡、數(shù)據(jù)庫(kù)分表等等都需要按用戶進(jìn)行分組,我們要保證針對(duì)同一個(gè)用戶的請(qǐng)求與操作都在同一個(gè)機(jī)房?jī)?nèi),不去跨機(jī)房,這樣才是最快的,這就是單元化。
那么上面這個(gè)架構(gòu)實(shí)際上就是一個(gè)高級(jí)版的“兩地三中心”,只是這種單元化架構(gòu)我們可以任意去擴(kuò)展(只要你足夠有錢,因?yàn)榇钜惶兹渲玫臄?shù)據(jù)中心是需要很高成本的),比如你在上海在增加一個(gè)數(shù)據(jù)中心,在杭州也增加一個(gè),那么就如下圖:
這就叫三地五中心。
總結(jié)
- 上一篇: Spring 事务相关及@Transac
- 下一篇: Problem Collection I