[120]從局部和全局視角理解一些數(shù)據(jù)結(jié)構(gòu)

背景

讀大學(xué)的時候我們就從數(shù)據(jù)結(jié)構(gòu)課本中就知道數(shù)組和鏈表的區(qū)別和優(yōu)缺點。
假設(shè)有如下數(shù)據(jù):
數(shù)組A=[1,2,3,4,5,6,7,8,9,10],
鏈表L=[1->2->4->6->8->10]。
數(shù)組A中所有的元素都遵循一個全局的規(guī)范,即根據(jù)地址(對應(yīng)小標(biāo)索引)順序而形成的一個集合,由于是全局的規(guī)范那么從整體全局角度很容易找到其中每個元素(從感覺上來說就是有一種全局的知識)。
而鏈表L中每個元素都只關(guān)注前面是誰后面是誰(局部知識),所以沒找一個元素必須從頭索引起來。

帶有全局知識的集合便于被外界使用但是維護成本高。比如你像4后面添加一個元素12必須把后面的元素依次往后移動(維持原來的集合規(guī)范)。
帶有局部知識的集合不便于外界找到內(nèi)部元素但是維護成本低,比如你在4后面添加一個元素5,4->5->6那么只需要修改4,5的箭頭指向即可。

更形象的說,數(shù)組更像這樣一個場景:老師依照次序給學(xué)生安排座位,這種場景下老師對每個學(xué)生坐在哪里了如指掌。鏈表更像是每個學(xué)生自發(fā)的,每個人只坐在自己喜歡的人后面。

一致性hash中的整體和局部視角

在分布式系統(tǒng)中,數(shù)據(jù)經(jīng)過路由存儲到其中的一個節(jié)點。那么怎么路由呢?最簡單的辦法是求余,求余路由規(guī)則為:(data%nodecount)余數(shù)為0的數(shù)據(jù)放在編號為node0節(jié)點(依次,余數(shù)為1的數(shù)據(jù)放在編號為node1的節(jié)點,余數(shù)為2放在編號為node2節(jié)點)。
假設(shè)我們有如下數(shù)據(jù) 1 3 6 9 10 12 14 15,3臺服務(wù)器node0,node1,node2。
根據(jù)(data% count(node))規(guī)則,數(shù)據(jù)分布如下:node1(3 6 9 12 15), node1(1 10),node2(14)。
假設(shè)某一時刻node2宕機了,那么1 3 6 9 10 12 14 15 應(yīng)該的分布如下:
node1(1 3 9 15),node2(6 10 12)。而數(shù)據(jù)14 隨著node2宕機在緩沖區(qū)中消息。
此時要移動的數(shù)據(jù)為(1 6 10 12)
由于其路由規(guī)則 (data % count(node))依賴于節(jié)點數(shù)量這個全局知識所以當(dāng)全局規(guī)則變動的時候 原有整個系統(tǒng)需要重新編排維持原有條件。

為了解決由于節(jié)點宕機導(dǎo)致大部分?jǐn)?shù)據(jù)都需要移動的話,需要把全局規(guī)則變成局部規(guī)則。像鏈表一樣一個節(jié)點掛了只對相鄰節(jié)點有影響。依此想法可以把所有節(jié)點組成一個鏈表(環(huán)狀的鏈表) A->B->C->D ,當(dāng)C掛掉的時候只需要把本應(yīng)該落地到C節(jié)點的數(shù)據(jù)依順序落地到下一個節(jié)點D就行。

一致性hash的均勻性:
由于外部數(shù)據(jù)不確定性經(jīng)過hash()函數(shù)后數(shù)據(jù)分布可能非常不均勻, 假設(shè)有一串?dāng)?shù)據(jù)(1 3 5 7 8 10 11 15)經(jīng)過hash(data%(2)) 之后,大部分(1 3 5 7 11 15)數(shù)據(jù) 都分布在node1,只有(8 10)分布在node2上。
那么我們可以抽出一層邏輯節(jié)點,(1 3 5 7 8 10 11 15) ---> 數(shù)據(jù)與邏輯節(jié)點 對應(yīng) ---> 邏輯節(jié)點與物理節(jié)點對應(yīng)。
為什么有了邏輯節(jié)點數(shù)據(jù)就會相對均勻呢?理由如下:
1.邏輯節(jié)點數(shù)量一般比物理節(jié)點多比如32 個,比如(1 3 5 7 8 10 11 15 32 33 35)%32 求余后會均勻分布在邏輯節(jié)點里。邏輯節(jié)點數(shù)量比較多分布會相對均勻和平滑。
2.下一步我們保證邏輯節(jié)點與物理節(jié)點,我們可以動態(tài)維持邏輯節(jié)點與物理節(jié)點的映射。比如新加一臺機器C4,此時發(fā)現(xiàn)某一些區(qū)間邏輯節(jié)點相對比較少(負(fù)責(zé)區(qū)域比較多,對應(yīng)壓力也會比較大),我們可以單一的把該C4拆分成幾個邏輯節(jié)點把這幾個邏輯節(jié)點插入進去(單獨一一維護邏輯節(jié)點與物理節(jié)點的映射)。 由于每個節(jié)點負(fù)責(zé)一個區(qū)間,新加入節(jié)點只會分擔(dān)相鄰節(jié)點的數(shù)據(jù)(而對其他節(jié)點沒有影響)。

說在后面的話

這是我由局部和全局哲學(xué)反思 計算機中的設(shè)計。全局對整體更容易控制具有全局的知識,但是當(dāng)變更時候要維持體系一致性需要的代價就高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容