普通的hash演算法在分布式應用中的不足:
比如,在分布式的儲存系統中,要將資料儲存到具體的節點上,如果我們採用普通的hash演算法進行路由,將資料對映到具體的節點上,如key%n,key是資料的key,n是機器節點數,如果有乙個機器加入或退出這個集群,則所有的資料對映都無效了,如果是持久化儲存則要做資料遷移,如果是分布式快取,則其他快取就失效了。
接下來我們來了解,一致性hash演算法是怎麼解決這個問題的。
一致性hash演算法
distributed hash table(dht) 是一種雜湊分布方式,其目的是為了克服傳統雜湊分布在伺服器節點數量變化時大量資料遷移的問題。
將雜湊空間 [0, 2n-1] 看成乙個雜湊環,每個伺服器節點都配置到雜湊環上。每個資料物件通過雜湊取模得到雜湊值之後,存放到雜湊環中順時針方向第乙個大於等於該雜湊值的節點上。一致性雜湊在增加或者刪除節點時只會影響到雜湊環中相鄰的節點。
一致性雜湊提出了在動態變化的cache環境中,雜湊演算法應該滿足的4個適應條件:
均衡性(balance)
平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。
單調性(monotonicity)
單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝區加入到系統中,那麼雜湊的結果應能夠保證原有已分配的內容可以被對映到新的緩衝區中去,而不會被對映到舊的緩衝集合中的其他緩衝區。(這段翻譯資訊有負面價值的,當緩衝區大小變化時一致性雜湊(consistent hashing)盡量保護已分配的內容不會被重新對映到新緩衝區。)
分散性(spread)
在分布式環境中,終端有可能看不到所有的緩衝,而是只能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。
負載(load)
負載問題實際上是從另乙個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於乙個特定的緩衝區而言,也可能被不同的使用者對映為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠盡量降低緩衝的負荷。
虛擬節點
上面描述的一致性雜湊存在資料分布不均勻的問題,節點儲存的資料量有可能會存在很大的不同。資料不均勻主要是因為節點在雜湊環上分布的不均勻,這種情況在節點數量很少的情況下尤其明顯。解決方式是通過增加虛擬節點,然後將虛擬節點對映到真實節點上。虛擬節點的數量比真實節點來得多,那麼虛擬節點在雜湊環上分布的均勻性就會比原來的真實節點好,從而使得資料分布也更加均勻。
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...
一致性hash演算法
july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...