分布式雜湊和一致性雜湊是分布式儲存和p2p網路中說的比較多的兩個概念了。介紹的論文很多,這裡做一個入門性質的介紹。
分布式雜湊(DHT)
兩個key point:每個節點只維護一部分路由;每個節點只儲存一部分資料。從而實現整個網路中的定址和儲存。
DHT只是一個概念,提出了這樣一種網路模型。並且說明它是對分布式儲存很有好處的。但具體怎麼實現,並不是DHT的範疇。
一致性雜湊:
DHT的一種實現。本質還是一個雜湊演算法。回想平時我們做負載平衡,按querystring簽名對後端節點模數是最簡單也是最常用的演算法,但節點的增刪後所造成的問題顯而易見,原有的請求幾乎都落不到同一台機器上。最佳化一點的是carp演算法(用機器ip和querystring一起做hash,選取hash值最小的一台),只讓1/n的資料受到影響。
一致性雜湊,似乎最早提出是在分布式cache裡面的,讓節點震蕩的時候,影響最小,以提高分布式cache的命中率。不過現在更多的應用在分布式儲存和p2p系統裡面。
一致性雜湊也只是提出四個概念和原則,並沒有提及具體實現:
1、balance:雜湊結果儘可能的平均分散到各個節點上,使得每個節點都能得到充分利用。
2、Monotonicity:上面也說了,如果是用簽名模數演算法,節點變更會使得整個網路的映射關係更改。如果是carp,會使得1/n的映射關係更改。一致性雜湊的目標,是節點變更,不會改變網路的映射關係。
3、spread:同一份資料,儲存到不同的節點上,換言之就是系統冗餘。一致性雜湊致力於降低系統冗度。
4、load:負載分散,和balance其實是差不多的意思,不過這裡更多是指資料存放區的均衡,balance是指訪的均衡。
Chord演算法:
一致性雜湊有多種實現演算法,最關鍵的問題在於如何定義資料分割策略和節點快速查詢。
chord算是最為經典的實現。cassandra中的DHT,基本是chord的簡化版。
網路中每個節點分配一個唯一id,可以通過機器的mac地址做sha1,是網路發現的基礎。
假設整個網路有N 個節點,並且網路是呈環狀。兩個節點間的距離定義為節點間下標差。每個節點會儲存一張路由表(finger表),表內順時針按照離本節點2、4、8、16、32.……2i的距離選定log2N個其他節點的ip資訊來記錄,主要是為了查詢加速。
儲存:資料被按一定規則切割,每一份資料也有一個獨立id(查詢key),並且和節點id的範圍是一樣的。然後尋找節點,如果存在和資料id一樣的節點id,則將這份資料存在該節點上;如果不存在,則儲存到離該資料id距離最近的節點上。同時,為了保證數 據的可靠性,會順時針往下找K個冗餘節點,儲存這份資料。一般認為K=3是必須的。
簡單描述了一個chord網路的部署,綠色節點為機器,編碼為hash值。N0節點的finger表可以看出N0節點的路由規則,其他節點也有類似的finger表。藍色節點為資料,根據hash值找到最近的節點並儲存。虛線所指是表示冗餘儲存。
查詢:先從自己的路由表中,找一個和資料id距離最近、並且存活在網路中的節點next。如果該節點的 id巧合和資料id相等,那麼恭喜你。如果不相等,則到next進行遞迴尋找。一般或需要經過多次查詢才能找到資料所在的節點,而這個次數是可以被證明小於等於log2N的。
在這個查詢的過程中就體現了路由表的選取優勢了,其實是實現了一個二分尋找,從每個節點來觀察網路,都是將網路分成了log2N塊,最大一塊裡面有N/2個節點。路由表裡面其實是記錄了每一塊的第一個節點。這樣每一次查詢,最少排除了一半的節點。保證在 log2N次內找到目標節點。
簡單展示了從N0節點尋找N21節點的一個資料的過程,通過finger表經過2跳到達目的地。
新增一個節點i:需要預Crowdsourced Security Testing道網路中已經存活的一個節點j,然後通過和節點j互動,更新自己和其他節點的路由表。並且,需要將離自己距離最近的節點中的資料copy過來,以提供資料服務。
損失一個節點:路由演算法會自動跳過這個節點,並且依靠資料的冗餘來持續提供服務。
KAD演算法(Kademlia)
kad演算法其實是在chord上做的最佳化。主要是兩個點:
1、用二進位(32/64/128)表示一個節點的id,兩節點的id異或運算得到節點間的距離。
2、 每個節點保持的路由資訊更豐富,同樣是將整個網路按照劃分成log2N份,在chord中,是保持log2N個路由節點,但在kad裡面,是儲存了 log2N個隊列。每個隊列長度為配置值K,記錄網路中對應節點地區的多個節點,並且根據活躍時間對這些節點進行換入換出。
第一點是方便進行網路劃分,節點按照二進位中每一bit的0或1建成一棵二叉樹。
第二點是使得節點查詢更迅速。從分割情況我們就可以得知,最壞情況不會差於chord,但儲存更多的節點使得命中機率更高。另外隊列中根據活躍時間進行換入換出,更有利於在p2p這種節點變更頻繁的網路中快速找到有效節點。
關於kad的介紹,這篇文章講的比較詳細wenku.baidu.com/view/ee91580216fc700abb68fcae.html