結(jié)論,可以直接拖到最后,如果看不明白,可以從頭看起。
去年寫(xiě)過(guò)一篇《做容災(zāi),冷備是不是個(gè)好方案?》,當(dāng)時(shí)提出來(lái),冷備或者主備,其實(shí)并不是一個(gè)理想的方案,而且絕大多數(shù)情況下,只能是一個(gè)心理安慰,真正發(fā)生故障的情況下,這樣的容災(zāi)模式根本起不到作用。
原因我就不重復(fù)了,大家如果有興趣可以直接看那篇文章。
最近,公有云又出了些大故障,各大群和朋友圈又開(kāi)始沸沸揚(yáng)揚(yáng),但是整體看下來(lái),聲音無(wú)非兩種:
單站點(diǎn)不靠譜,要有容災(zāi),出現(xiàn)這種情況就得馬上切,所以回去趕緊建設(shè)容災(zāi)站點(diǎn);
雞蛋不能放在一個(gè)籃子里,單云不靠譜,要多云。所以,多云就要選我們家的xx云,或者我們提供xx多云服務(wù)。
我在我的一個(gè)討論群里就提出來(lái),第一種聲音是有意識(shí)的建設(shè),有這個(gè)意識(shí)很好,但是把這個(gè)事情想得太簡(jiǎn)單了。第二種聲音,基本就是不動(dòng)腦子的瞎BB,原因我下面講。
轉(zhuǎn)回正題來(lái),既然上篇提到主備模式不靠譜,那到底怎么選?而且整天見(jiàn)各類(lèi)技術(shù)文章,不是雙活,就是多活,不是同城,就是異地,現(xiàn)在又出來(lái)個(gè)多云,好復(fù)雜。
下面我就談?wù)勎业睦斫猓?/span>
首先,這么多名詞是什么含義,要搞清楚,然后再看適不適合。
先講相對(duì)簡(jiǎn)單的雙活(簡(jiǎn)不簡(jiǎn)單,看后面就明白了),其實(shí)就是兩個(gè)站點(diǎn),同時(shí)承載業(yè)務(wù)流量,可以根據(jù)用戶(hù)ID、地域或者其他業(yè)務(wù)屬性也決定怎么分擔(dān)流量,當(dāng)一個(gè)站點(diǎn)故障時(shí),可以快速(分鐘級(jí))切換到另一個(gè)站點(diǎn),理想情況下,對(duì)業(yè)務(wù)基本是無(wú)損或者非常小的。
這里就跟前面講的主備不同了,主備的另一個(gè)站點(diǎn)完全是不承載任何流量的。
這里再往深里看一眼,同時(shí)承載流量,也要看承載到那一層,也就是流量在統(tǒng)一站點(diǎn)內(nèi)閉環(huán),所有調(diào)用都是本機(jī)房?jī)?nèi)完成,還是只有應(yīng)用層這樣的無(wú)狀態(tài)組件雙活,但是數(shù)據(jù)訪(fǎng)問(wèn)、異步消息這些有狀態(tài)的部件還是回到主站點(diǎn)調(diào)用,這兩種模式又是不一樣的。
其實(shí)第二種,就比前面講的主備模式要好一些,因?yàn)檫@樣至少可以保證應(yīng)用層隨時(shí)可用,不過(guò)真出故障的時(shí)候,還是少不了數(shù)據(jù)層的切換,這個(gè)其實(shí)是非常耗時(shí)的。跟主備模式一樣,基本無(wú)法演練,因?yàn)榇鷥r(jià)太高,數(shù)據(jù)會(huì)有損。(如果數(shù)據(jù)層沒(méi)有這么復(fù)雜,只有幾個(gè)數(shù)據(jù)庫(kù),那是沒(méi)問(wèn)題問(wèn)題的,但是分布式的場(chǎng)景下,上百個(gè),幾百個(gè)實(shí)例切換,這個(gè)代價(jià)和成本還是很大的。)
所以,再往下推導(dǎo),如果想要做到有效果的雙活,就必須保證每個(gè)站點(diǎn),都是獨(dú)立運(yùn)行,所有的調(diào)用都是本機(jī)房調(diào)用且閉環(huán),底層做好數(shù)據(jù)同步即可。
只有做到這個(gè)程度,當(dāng)一個(gè)站點(diǎn)發(fā)生故障不可用時(shí),就可以從接入層把故障站點(diǎn)的流量切換到另一個(gè)站點(diǎn),雙活的效果也就有了。
不過(guò),做到這個(gè)程度,就不是說(shuō)我們想要做就能做到的,如果您做個(gè)類(lèi)似的架構(gòu)設(shè)計(jì),你會(huì)知道這里有三個(gè)關(guān)鍵的技術(shù)點(diǎn):
第一個(gè),本機(jī)房調(diào)用
也就是一個(gè)分布式請(qǐng)求不能跨機(jī)房調(diào)來(lái)調(diào)去,這個(gè)是不行的,必須要保證本機(jī)房調(diào)用閉環(huán)。所以從分布式服務(wù)的路由策略上,以及服務(wù)化框架上,必須得支持這也中調(diào)用模式,同理,數(shù)據(jù)訪(fǎng)問(wèn)層,以及消息組件也要支持這種特性。
第二個(gè),數(shù)據(jù)分片和一致性
為什么要做這個(gè)事情?我們知道一個(gè)系統(tǒng)中數(shù)據(jù)準(zhǔn)確性、完整性和一致性是非常關(guān)鍵的,放到雙活這個(gè)場(chǎng)景下,最關(guān)鍵的就是數(shù)據(jù)一致性,我們不能允許有同一個(gè)記錄兩邊同時(shí)在變更,還要雙向同步,比如用戶(hù)交易和支付類(lèi)的數(shù)據(jù),同時(shí)變更的情況下,我們無(wú)法確認(rèn)哪邊是準(zhǔn)確的。
前面提到,兩個(gè)站點(diǎn)是同時(shí)承載不同的流量的,這就要根據(jù)一些業(yè)務(wù)屬性來(lái)分配,比如用戶(hù)ID、所屬地域等等策略,這里為的就是能夠在數(shù)據(jù)層面也要做好隔離,一個(gè)站點(diǎn)內(nèi)只提供固定部分的用戶(hù)訪(fǎng)問(wèn)。
這樣就保證了單站點(diǎn)內(nèi)同一分片的數(shù)據(jù),不會(huì)在另外一個(gè)站點(diǎn)被變更,后續(xù)的同步也可以做到單向。
所以,這里的關(guān)鍵,就是數(shù)據(jù)要做分片,就要用到分布式的數(shù)據(jù)中間件,要做數(shù)據(jù)訪(fǎng)問(wèn)的路由設(shè)計(jì),數(shù)據(jù)要同機(jī)房讀寫(xiě),還要做數(shù)據(jù)拆分這樣的工作,技術(shù)門(mén)檻和工作量也不低。
這兩點(diǎn)如果能夠做到,其實(shí)就是我們經(jīng)常說(shuō)的“單元化”架構(gòu)達(dá)成了,理論上,我們可以選擇任何一個(gè)機(jī)房和地域,把系統(tǒng)搭建起來(lái),就可以提供業(yè)務(wù)訪(fǎng)問(wèn)了。
但現(xiàn)實(shí)是更為復(fù)雜的,因?yàn)橛脩?hù)業(yè)務(wù)系統(tǒng)產(chǎn)生的數(shù)據(jù),有可能會(huì)被其它系統(tǒng)用到,比如商品庫(kù)存這樣的系統(tǒng),這就要涉及異步消息和數(shù)據(jù)的同步問(wèn)題,而數(shù)據(jù)同步不僅僅是一個(gè)技術(shù)問(wèn)題,而是個(gè)物理問(wèn)題,我們接下來(lái)講。
第三個(gè),數(shù)據(jù)同步。
其實(shí)單從同步角度而言,目前很多的同步工具和開(kāi)源產(chǎn)品已經(jīng)比較完善,所以這里最大的問(wèn)題,其實(shí)不在技術(shù)層面,而是在物理層面。
準(zhǔn)確點(diǎn),就是物理距離上的時(shí)延問(wèn)題,這個(gè)無(wú)論是雙活、多活,還是同城、異地,都繞不開(kāi)的痛苦問(wèn)題。
既然要雙活,必然會(huì)選擇另一個(gè)跟當(dāng)前機(jī)房有一定距離的機(jī)房(同城或異地),而且距離必須得拉開(kāi)才有意義,如果都在一個(gè)園區(qū)里面,就沒(méi)有任何容災(zāi)意義了。
距離一旦拉開(kāi),物理距離就出來(lái)了,即使是專(zhuān)線(xiàn)相連,中間也要經(jīng)過(guò)很多網(wǎng)絡(luò)設(shè)備,如果是云化的網(wǎng)絡(luò)架構(gòu)下,經(jīng)過(guò)的軟硬設(shè)備就更多,還有可能涉及協(xié)議轉(zhuǎn)換,如果中途跨運(yùn)營(yíng)商,就更難保障,這樣一來(lái)時(shí)延肯定是幾倍、十幾倍,甚至是上百倍的上漲,直接從0.x毫秒,上漲到秒級(jí)別。
對(duì)于同城來(lái)說(shuō),這個(gè)問(wèn)題還好,但是一旦跨省就完全不可控,特別是機(jī)房如果不是自己的,根本無(wú)法控制。所以,想大公司自建機(jī)房,一定會(huì)在這個(gè)層面做大量的優(yōu)化,盡最大可能降低時(shí)延。
就以淘寶、天貓為例,按照之前了解的情況,基本也是杭州和上海這兩個(gè)城市為主做雙活,再遠(yuǎn)時(shí)延這個(gè)問(wèn)題就繞不開(kāi)了。
數(shù)據(jù)同步及時(shí)性為什么這么重要,一個(gè)是業(yè)務(wù)體驗(yàn),不能說(shuō)庫(kù)存都沒(méi)了,其他用戶(hù)看到的還是有貨,這個(gè)是不會(huì)被接受的。
再就是故障時(shí),如果同步不及時(shí),極有可能造成幾秒鐘內(nèi)的交易數(shù)據(jù)丟失,或者不一致,像淘寶這樣每秒4位數(shù)訂單量的系統(tǒng),丟幾秒鐘數(shù)據(jù),造成的損失也是巨大的。所以,這里就必須要建設(shè)有一整套的數(shù)據(jù)完整性和一致性保障措施,盡最大程度降低業(yè)務(wù)損失。
所以,數(shù)據(jù)同步所依賴(lài)的時(shí)延問(wèn)題,其實(shí)就已經(jīng)超出了絕大部分公司所能掌控的范疇,也不是單純靠自身技術(shù)能解決的問(wèn)題,要看天時(shí)和地利。
講到這里,我想多活就不用講了,時(shí)延這個(gè)問(wèn)題解決不了,多活就是扯淡,至于同城和異地,我想看明白的讀者,也知道怎么選擇了,其實(shí)一樣,還是取決于時(shí)延。
我們可以得出的幾個(gè)結(jié)論:
不管怎么選擇容災(zāi)方案,我們自己的業(yè)務(wù)系統(tǒng),從自身架構(gòu)上,一定要支持單元化,一定要支持?jǐn)?shù)據(jù)同步才行,如果這都不支持,講雙活和多活,就是特么的扯淡。所以,打算搞雙活,先從這里下手,當(dāng)然牽出來(lái)就要涉及到分布式,還有很多大量細(xì)節(jié)技術(shù)問(wèn)題。
一個(gè)合理的建設(shè)節(jié)奏應(yīng)該是,同城雙活—異地雙活—兩地三中心(同城雙活 異地多活),因?yàn)槟阋鉀Q的問(wèn)題的復(fù)雜度和難度也是在逐步上升的,不可能一蹴而就。
題目里這些個(gè)名詞,不是孤立的,而是從不同維度看到的結(jié)論,但是如果你偏離自己的業(yè)務(wù)場(chǎng)景去看,孤立的去看,就一定會(huì)被帶到溝里去,而且不知道該如何下手,所以,一定別偏離你的業(yè)務(wù)場(chǎng)景,然后把它們聯(lián)系起來(lái)。
一切都是ROI,為了保證高可用,就一定會(huì)有成本,高可用程度越高,成本就一定越高,所以成本投入得到的收益到底劃不劃算,這個(gè)只能自家公司自家評(píng)判。
現(xiàn)實(shí)情況,比我寫(xiě)的要復(fù)雜的多的多,推薦大家看兩個(gè)成功案例,一個(gè)是畢玄的異地多活數(shù)據(jù)中心,一個(gè)是餓了么異地多活,幾個(gè)關(guān)鍵字google一下就有了,里面涉及到的場(chǎng)景化的細(xì)節(jié)對(duì)大家理解這件事情的復(fù)雜度會(huì)有更幫助。
寫(xiě)的有點(diǎn)多了,關(guān)于多云先不寫(xiě)了,就當(dāng)問(wèn)題吧,大家覺(jué)得是不是需要多云建設(shè)?你怎么看?可以在留言區(qū)發(fā)表下意見(jiàn)。
來(lái)源:本文轉(zhuǎn)自公眾號(hào)Forrest隨想錄,作者為蘑菇街技術(shù)總監(jiān)趙成。
聯(lián)系客服