一致性雜湊 Consistent Hashing

2021-06-20 00:32:33 字數 1636 閱讀 8916

直到現在為止,一致性雜湊也沒有乙個非常明確的定義,多數文獻還是從其應用場景之上對一致性雜湊進行描述。「雜湊」想必大家都已經了解,問題是何為「一致性」?

一致性

在討論一致性雜湊之前,先認識下「非一致性雜湊」,顯然hashmap屬於此列。

當使用hashmap時,key被均勻地對映到陣列之上,對映方法就是利用key的hash與陣列長度取模(通過&運算)。

當put的資料超過負載因子loadfactor×2len時,hashmap會按照2被的容量擴容。新put進來的資料會通過與新陣列的長度取模的方式進行對映。那之前已經對映的資料該怎麼辦?通過檢視hashmap**的resize方法會發現,每次擴容都會把之前的key重新對映。

所以對hashmap而言要想獲得較好的效能必須要提前估計所放資料集合的大小,以設計合適的初始化容量和負載因子。

2. 定義

但不是每個場景都像hashmap這麼簡單,比如在大型的p2p網路中存在上百萬臺server,資源與server的關係是以key的形式對映而成,也就是說是乙個大的hashmap,維護著每個key在哪個server之上,如果有新的節點加入或退出p2p網路,跟hashmap一樣,也會導致對映關係的變化,顯然不可能把所有的key與server的對映關係都調整一遍。這就需要一種方法,在雜湊項發生變化是,不需要調整所有的節點,而達到繼續維護雜湊對映的關係。因此一致性雜湊定義為:

就是說,」一致性雜湊,就是提供乙個hashtable,它能在節點加入離開時不會導致對映關係的重大變化「。

3.實現

一致性雜湊的定義除了描述乙個定義或者一種想法並沒有給出任何實現方面的描述,所有細化的問題都留給開發者去思考。但一般的實現思路如下:

假如有n個節點,m個key,當節點增加時大約有o(m/n)的節點需要移動。但一般一致性雜湊需要滿足下面幾個條件才對實際系統有意義:

其實一致性雜湊(雜湊)有個明顯的優點就是負載均衡,只要雜湊函式設計得當,每個點就是對等的可以均勻地分布系統負載。

4.memcached

看了上面的定義和實現可能還是比較迷茫,那就舉個實際例子。

memcached對大家應該不陌生,通過把key對映到memcached server上,實現快速讀取。我們可以動態對其節點增加,並未影響之前已經對映到記憶體的key與memcached server之間的關係,這就是因為使用了一致性雜湊。

因為memcached的雜湊策略是在其客戶端實現的,因此不同的客戶端實現也有區別,以spymemcache、xmemcache為例,都是使用了ketama作為其實現。

ketama實現方式如下:

但是這樣做的效果並不理想,原因是雜湊雖然是隨機的,但往往隨機的不如人意,尤其是在server節點數量上的情況下,server不會均勻分布在雜湊環上,這會導致雜湊不均勻,某些server會承擔很多的key,而另一些會很少,如圖:

絕大多數key會對映到server1,因此ketama引入了虛節點的概念,就是假象每個server對映到n個節點(根據測試n在100~200時較優化),但key的雜湊對映到這n個節點時實際都有該server來託管。這樣做的意義在於,使因為實際節點少而導致大片未被對映的區別有虛節點去填充,從而使實節點有了處理本不屬於自己區間的key。有虛節點後的環如下:

新增的同名節點即為虛節點。

還有最後乙個問題,虛節點是如何產生的呢?也非常簡單,就是在每個server加個字尾,在做md5雜湊,取其32位。

一致性雜湊

直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...

一致性雜湊

from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...

一致性雜湊

一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...