昨天扛稽,我們聊了存儲(chǔ)集群的分工和協(xié)作。今天滑负,我們繼續(xù)這個(gè)話(huà)題在张。
節(jié)點(diǎn)間數(shù)據(jù)傳遞
Leader節(jié)點(diǎn)接收到新的信息后,怎么傳遞給其他節(jié)點(diǎn)呢矮慕。這個(gè)信息可能是新插入的數(shù)據(jù)帮匾,可能是數(shù)據(jù)的更新,也可能是刪除一些數(shù)據(jù)痴鳄。一種傳遞的方式是把指令信息本身傳遞給其他節(jié)點(diǎn)瘟斜,其他節(jié)點(diǎn)接收到指令后,再重新執(zhí)行一下。這種方式實(shí)現(xiàn)上比較簡(jiǎn)單螺句,但是問(wèn)題是有可能會(huì)造成數(shù)據(jù)的不一致虽惭,比如數(shù)據(jù)庫(kù)的SQL指令會(huì)用到now函數(shù),兩次執(zhí)行的效果是不一樣的蛇尚。
另外一種傳遞方式是將變化后數(shù)據(jù)完全同步出來(lái)芽唇,這種方式也有問(wèn)題,就是可能需要傳遞的數(shù)據(jù)特別多取劫。比如我們將一個(gè)字段的數(shù)值做了更新匆笤,因?yàn)橛绊懥怂袛?shù)據(jù),這就意味著我們要把所有數(shù)據(jù)發(fā)送出來(lái)谱邪。
我們可以綜合兩種方式疚膊,取長(zhǎng)補(bǔ)短,根據(jù)指令不同來(lái)選擇不同的傳播方式虾标。
另外寓盗,我們需要格外注意,節(jié)點(diǎn)間這種信息同步任務(wù)璧函,是需要占用節(jié)點(diǎn)計(jì)算資源和存儲(chǔ)的傀蚌。我們不能讓同步任務(wù)影響到正常的對(duì)外服務(wù),兩類(lèi)任務(wù)需要做好隔離蘸吓。一般我們會(huì)把同步信息記錄在操作日志里善炫,同時(shí),每個(gè)節(jié)點(diǎn)都要有獨(dú)立的端口和線(xiàn)程來(lái)處理兩類(lèi)任務(wù)库继。
最終一致性
我們看到箩艺,Leader節(jié)點(diǎn)把信息同步到整個(gè)集群是需要時(shí)間的,這個(gè)時(shí)間段內(nèi)集群內(nèi)部的信息是不一致的宪萄。如果這時(shí)候訪(fǎng)問(wèn)到集群的非Leader節(jié)點(diǎn)艺谆,拿到的數(shù)據(jù)可能是舊的。
這個(gè)問(wèn)題怎么解決拜英。首先需要看我們使用數(shù)據(jù)的場(chǎng)景静汤。如果信息及時(shí)性要求不高,允許一定程度的延遲居凶。那我們就不需要做額外的處理虫给。我們只需要保證數(shù)據(jù)最終是一致的就可以。
如果及時(shí)性要求很高侠碧,我們就需要想辦法解決了抹估。比如針對(duì)這種特殊情況,我們可以在業(yè)務(wù)代碼中強(qiáng)制只從Leader節(jié)點(diǎn)讀取數(shù)據(jù)弄兜。但這么做不太優(yōu)雅药蜻,業(yè)務(wù)代碼中會(huì)耦合這種非功能性邏輯瓷式,侵入性比較高。我們可以把這部分代碼抽取出來(lái)谷暮,自動(dòng)檢測(cè)哪些數(shù)據(jù)正在被更新,更新的這個(gè)階段盛垦,對(duì)這部分?jǐn)?shù)據(jù)的請(qǐng)求只從Leader節(jié)點(diǎn)讀取湿弦。大家可以再想想有沒(méi)有更好的方式。
業(yè)務(wù)分工
我們可以看到腾夯,存儲(chǔ)集群是通過(guò)Leader節(jié)點(diǎn)來(lái)統(tǒng)一協(xié)調(diào)的颊埃。這樣做的好處是信息傳遞的效率比較高,只要Leader確認(rèn)了就可以蝶俱,再由他去通知大家班利。但是,當(dāng)數(shù)據(jù)量日益增加榨呆,集群規(guī)模越來(lái)越大罗标,Leader節(jié)點(diǎn)會(huì)越來(lái)越力不從心。就像人一樣积蜻,每個(gè)管理者都有他的管理半徑闯割,節(jié)點(diǎn)越多,需要同步和管理的代價(jià)就越大竿拆。
那怎么辦呢宙拉?我們可以繼續(xù)按照業(yè)務(wù)進(jìn)行垂直分工。一個(gè)大的集群分工成多個(gè)小的集群丙笋,每個(gè)小集群再由各自的Leader節(jié)點(diǎn)來(lái)組織谢澈。
按照什么原則來(lái)分工呢?一個(gè)簡(jiǎn)單的原則就是耦合度御板。首先是業(yè)務(wù)耦合度锥忿,就是說(shuō)這兩個(gè)業(yè)務(wù)從邏輯上是否分類(lèi)合理;另外就是數(shù)據(jù)耦合度怠肋,就是這兩塊的數(shù)據(jù)是否經(jīng)常會(huì)關(guān)聯(lián)在一起查詢(xún)缎谷。
無(wú)論怎么分工,可能總會(huì)有一些數(shù)據(jù)分布在不同的集群灶似,但是偶爾需要關(guān)聯(lián)查詢(xún)列林,那怎么辦。一種辦法就是在計(jì)算集群中去做酪惭,由業(yè)務(wù)代碼分別讀取各自數(shù)據(jù)希痴,然后在內(nèi)存中進(jìn)行拼裝。這種辦法因響應(yīng)比較及時(shí)春感,但是無(wú)法處理大量的數(shù)據(jù)砌创。
另外一種辦法就是通過(guò)離線(xiàn)計(jì)算來(lái)做虏缸,離線(xiàn)計(jì)算的話(huà)題以后我們?cè)倭摹5沁@種方式的及時(shí)性不夠好嫩实。需要計(jì)算完成后刽辙,把中間結(jié)果數(shù)據(jù)放到其他存儲(chǔ)集群中來(lái)實(shí)時(shí)訪(fǎng)問(wèn)。大家需要跟進(jìn)自己的業(yè)務(wù)特點(diǎn)來(lái)自己選擇甲献。
總結(jié)一下宰缤,存儲(chǔ)集群通過(guò)日志記錄在各個(gè)節(jié)點(diǎn)中同步信息,達(dá)到數(shù)據(jù)的最終一致性晃洒。隨著集群節(jié)點(diǎn)規(guī)模的增大慨灭,需要根據(jù)業(yè)務(wù)做集群劃分,降低超大集群的管理成本球及。