學習分布式, 一致性雜湊是最最基礎的知識, 所以要理解好.
那什麼是一致性雜湊呢?(what)
1.平衡性是指 hash的結果應該平均分配到各個節點, 這樣從演算法上就解決了負載均衡問題.
2.單調性是指 在新增或者刪減節點時, 同乙個key訪問到的值總是一樣的.
3.分散性是指 資料應該分散的存放在 分布式集群中的各個節點(節點自己可以有備份), 不必要每個節點都儲存所有的資料.
為什麼要一致性雜湊?(why)
這個問題問得很好…首先我們要看看不使用一致性hash, 我們的分布式集群如何工作.
1. 普通集群, 把固定的key對映到固定的節點上, 節點只存放各自key的資料, 如圖:
[img]
這樣, 我們必須維護好key和節點的關係, 而且當其中乙個節點掛掉了, 節點上的資料可以遷移, 但key的關係也要重新維護.
2. 簡單hash集群. 為了不想維護key, 降低複雜性和其他開銷, 很容想到 對key進行hash , 然後對節點數取模, 比如我們原本有四個節點, 如下圖
[img]
這個時候就不必維護這些key對應的node了, 直接通過hash值, 然後對節點數取模, 看起來貌似很完美, 足夠了吧?
no! 如果這個時候其中乙個節點掛了, 那這個節點的資料就完全不可用了. 當然你會說可以通過資料遷移呀, 嘿嘿, 問題
恰恰難在資料遷移, 因為這時候掛了, 節點數變為3了, 對key取hash後再 mod 3 的話, 大部分的key對應的節點都要改. 這個時候
只能整個集群的資料都重新遷移一遍才能達到效果, 也許你忙完這些工作, 還不如把掛掉的機器換個新的!!! 再者, 不僅僅是節點掛了會出現問題
如果整個分布式集群負載很高, 希望增加節點來解決問題, 這個時候, 遷移的工作還是一樣的麻煩, 這樣我估計如果資料量龐大的話, 沒人敢輕易遷移.
於是便有了一致性hash
3. 一致性雜湊
[img]
如圖, 所有的節點也有自己的key(比如hostname), 經過hash, 然後mod 2的32次方, 對映到這個超大的環上面的乙個虛擬節點
然後所有的key去獲取value的時候, 也是同樣的hash演算法, mod 2的32次方, 這時候不一定所有的key都剛好對映到各個節點相應的虛擬
節點上(事實上概率很小), 然後這時候取值只要按照約定好的固定方向(如順時針), 找到第乙個的虛擬節點, 然後根據該虛擬節點
就可以找到相應的node, 然後進行相應的操作.
這個時候, 如果其中乙個節點掛了, 那麼依然要進行資料遷移, 只不過資料遷移的資料量減少了, 只需要將掛了的節點的資料遷移到他順時針的下乙個
節點上即可, 這個對應的keys依然能夠找到資料. 同樣的, 如果增加節點, 資料遷移量也不多, 只需要將該節點逆時針方向到達上乙個節點之前的key對應的資料都
遷移到新增的節點上就ok了.這就是傳說中的一致性雜湊.
比如上圖, key1 key2 key3 key4 key5 key6的值將由 node2返回( 假設這是乙個key value儲存集群)
同樣的, key7~key11 對應 node3
key12 ~key17對應node4
key18~key22 對應node1
3. 講完了what和why, 就是how了
其實上面在why講解過程中, how的部分已經講解了一大片, 其實關鍵的地方還是在hash演算法的選擇, 如何選擇好的hash演算法, 讓他能夠平均地分配每個節點, 這才是
最大的問題.
另外參考
和這篇
他們的圖畫的比我生動
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...