【高並發解決方案】7、一致性hash解讀,一致性hash

來源:互聯網
上載者:User

【高並發解決方案】7、一致性hash解讀,一致性hash
   一致性雜湊演算法在1997年由麻省理工學院提出的一種分布式雜湊(DHT)實現演算法,設計目標是為瞭解決網際網路中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡 單雜湊演算法帶來的問題,使得分布式雜湊(DHT)可以在P2P環境中真正得到應用。      一致性hash演算法提出了在動態變化的Cache環境中,判定雜湊演算法好壞的四個定義: 

1、平衡性(Balance):平衡性是指雜湊的結果能夠儘可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。
 
2、單調性(Monotonicity):單調性是指如果已經有一些內容通過雜湊指派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已指派的內容可以被映射到原有的或者新的緩衝中去,而不會被映射到舊的緩衝集合中的其他緩衝區。 
 
3、分散性(Spread):在分布式環境中,終端有可能看不到所有的緩衝,而是只能看到其中的一部分。當終端希望通過雜湊過程將內容映射到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端映射到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。 
 
4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的使用者映射為不同 的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠盡量降低緩衝的負荷。
     在分布式叢集中,對機器的添加刪除,或者機器故障後自動脫離叢集這些操作是分布式叢集管理最基本的功能。如果採用常用的hash(object)%N演算法,那麼在有機器添加或者刪除後,很多原有的資料就無法找到了,這樣嚴重的違反了單調性原則。 關於一致性hash,這裡有一篇更詳細的文章:http://www.zsythink.net/archives/1182虛擬節點(一下完全引自:http://my.oschina.net/jsan/blog/49702)

考量 Hash 演算法的另一個指標是平衡性 (Balance) ,定義如下:

平衡性

平衡性是指雜湊的結果能夠儘可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。

hash 演算法並不是保證絕對的平衡,如果 cache 較少的話,對象並不能被均勻的映射到 cache 上,比如在上面的例子中,僅部署 cache A 和 cache C 的情況下,在 4 個對象中, cache A 僅儲存了 object1 ,而 cache C 則儲存了 object2 、 object3 和 object4 ;分布是很不均衡的。

為瞭解決這種情況, consistent hashing 引入了“虛擬節點”的概念,它可以如下定義:

“虛擬節點”( virtual node )是實際節點在 hash 空間的複製品( replica ),一實際個節點對應了若干個“虛擬節點”,這個對應個數也成為“複製個數”,“虛擬節點”在 hash 空間中以 hash 值排列。

仍以僅部署 cache A 和 cache C 的情況為例,在圖 4 中我們已經看到, cache 分布並不均勻。現在我們引入虛擬節點,並設定“複製個數”為 2 ,這就意味著一共會存在 4 個“虛擬節點”, cache A1, cache A2 代表了 cache A ; cache C1, cache C2 代表了 cache C ;假設一種比較理想的情況,參見圖 6 。

圖 6 引入“虛擬節點”後的映射關係

 

此時,對象到“虛擬節點”的映射關係為:

objec1->cache A2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache C2 ;

因此對象 object1 和 object2 都被映射到了 cache A 上,而 object3 和 object4 映射到了 cache C 上;平衡性有了很大提高。

引入“虛擬節點”後,映射關係就從 { 對象 -> 節點 } 轉換到了 { 對象 -> 虛擬節點 } 。查詢物體所在 cache時的映射關係 7 所示。

圖 7 查詢對象所在 cache

 

“虛擬節點”的 hash 計算可以採用對應節點的 IP 地址加數字尾碼的方式。例如假設 cache A 的 IP 地址為202.168.14.241 。

引入“虛擬節點”前,計算 cache A 的 hash 值:

Hash(“202.168.14.241”);

引入“虛擬節點”後,計算“虛擬節”點 cache A1 和 cache A2 的 hash 值:

Hash(“202.168.14.241#1”);  // cache A1

Hash(“202.168.14.241#2”);  // cache A2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.