1. 程式人生 > >【修真院java小課堂】什麼是一致性雜湊

【修真院java小課堂】什麼是一致性雜湊

大家好,我是IT修真院北京分院JAVA學員,一枚正直純潔善良的java程式設計師。

今天給大家分享一下,什麼是一致性雜湊

1.背景介紹

一致性雜湊概述

一致性雜湊演算法在1997年由麻省理工學院提出(參見擴充套件閱讀[1]),設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡單雜湊演算法帶來的問題,使得DHT可以在P2P環境中真正得到應用。

知識剖析

2、一致性雜湊演算法原理

研究過memcached快取資料庫的人都知道,memcached伺服器端本身不提供分散式cache的一致性,而是由客戶端來提供,具體在計算一致性hash時採用如下步驟:

(1)首先求出memcached伺服器(節點)的雜湊值,並將其配置到0~232的圓(continuum)上。

(2)然後採用同樣的方法求出儲存資料的鍵的雜湊值,並對映到相同的圓上。

(3)然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第一個伺服器上。如果超過232仍然找不到伺服器,就會儲存到第一臺memcached伺服器上。

3、一致性雜湊演算法特性之平衡性

平衡性是指雜湊的結果能夠儘可能分佈到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。

4、 一致性雜湊演算法特性之單調性

單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝區加入到系統中,那麼雜湊的結果應能夠保證原有已分配的內容可以被對映到新的緩衝區中去,而不會被對映到舊的緩衝集合中的其他緩衝區。簡單的雜湊演算法往往不能滿足單調性的要求,如最簡單的線性雜湊:x = (ax + b) mod (P),在上式中,P表示全部緩衝的大小。不難看出,當緩衝大小發生變化時(從P1到P2),原來所有的雜湊結果均會發生變化,從而不滿足單調性的要求。雜湊結果的變化意味著當緩衝空間發生變化時,所有的對映關係需要在系統內全部更新。而在P2P系統內,緩衝的變化等價於Peer加入或退出系統,這一情況在P2P系統中會頻繁發生,因此會帶來極大計算和傳輸負荷。單調性就是要求雜湊演算法能夠應對這種情況。

5、一致性雜湊演算法特性一致性雜湊演算法特性之分散性一致性雜湊演算法特性之分散性一致性雜湊演算法特性之分散性之分散性

在分散式環境中,終端有可能看不到所有的緩衝,而是隻能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠儘量避免不一致的情況發生,也就是儘量降低分散性。

6、 一致性雜湊演算法特性之負載

負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的使用者對映為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠儘量降低緩衝的負荷。

7、解決資料分佈的常用對映方式

Hash對映:通過雜湊演算法將key對映到有限值上,例如crc16(key)%16384

範圍對映:對key的值空間劃分範圍,根據資料ID快取到對應區域

Hash與範圍結合:典型演算法為一致性雜湊演算法,統一對key進行雜湊運算求得雜湊值,通過對整個雜湊空間劃分範圍,劃分的節點為用來儲存資料的快取節點,然後將資料儲存到對應的儲存空間中。

常見問題:

(1)問:為什麼需要一致性雜湊

答:在解決資料分佈的問題上,若採用簡單的雜湊取模方式,由於模是與快取伺服器資料量繫結的,當對快取伺服器進行增減時,模也要變化,這會導致以前的資料全部失效;若採用一致性雜湊演算法,由於模固定,所以對伺服器進行增減時不會導致全部資料失效,受影響的部分只是一小部分。

(2)問:一致性雜湊運用場景有哪些

答:xmemcached的客戶端是使用一致性雜湊演算法來解決資料分佈問題的,redis預設採用crc16(key)%16384解決資料分佈問題,但我們也可以將一致性雜湊應用在redis的資料分佈上,具體怎麼選擇看應用場景 。

(3)問:使用虛擬節點技術解決平衡性問題,那麼資料一定是均勻分佈在各個伺服器上嗎?

答:這個不一定,使用虛擬節點技術只能說能夠儘量使節點均勻分佈在雜湊環上,但不能絕對均勻,若想提高平衡性,可以多虛擬出幾個節點

資料來源:

[1]http://www.zsythink.net/archives/1182/

[2]《深入分散式快取》

[3]https://www.cnblogs.com/lpfuture/p/5796398.html