[转载] 一致性哈希
轉(zhuǎn)載自http://www.jiacheo.org/blog/174
學(xué)習(xí)分布式, 一致性哈希是最最基礎(chǔ)的知識, 所以要理解好.
那什么是一致性哈希呢?(what)
百度百科?上的解釋很專業(yè)術(shù)語. 要一句話定義貌似也有難度:?一致性哈希算法是在哈希算法基礎(chǔ)上,提出的在動態(tài)變化的分布式環(huán)境中,哈希算法應(yīng)該滿足的幾個條件: 平衡性, 單調(diào)性和分散性.
1.平衡性是指 hash的結(jié)果應(yīng)該平均分配到各個節(jié)點, 這樣從算法上就解決了負載均衡問題.
2.單調(diào)性是指 在新增或者刪減節(jié)點時, 同一個key訪問到的值總是一樣的.
3.分散性是指 數(shù)據(jù)應(yīng)該分散的存放在 分布式集群中的各個節(jié)點(節(jié)點自己可以有備份), 不必要每個節(jié)點都存儲所有的數(shù)據(jù).
?
為什么要一致性哈希?(why)
這個問題問得很好…首先我們要看看不使用一致性hash, 我們的分布式集群如何工作.
1. 普通集群, 把固定的key映射到固定的節(jié)點上, 節(jié)點只存放各自key的數(shù)據(jù), 如圖:
?
這樣, 我們必須維護好key和節(jié)點的關(guān)系, 而且當(dāng)其中一個節(jié)點掛掉了, 節(jié)點上的數(shù)據(jù)可以遷移, 但key的關(guān)系也要重新維護.
2. 簡單hash集群. 為了不想維護key, 降低復(fù)雜性和其他開銷, 很容想到 對key進行hash , 然后對節(jié)點數(shù)取模, 比如我們原本有四個節(jié)點, 如下圖
這個時候就不必維護這些key對應(yīng)的node了, 直接通過hash值, 然后對節(jié)點數(shù)取模, 看起來貌似很完美, 足夠了吧?
No! 如果這個時候其中一個節(jié)點掛了, 那這個節(jié)點的數(shù)據(jù)就完全不可用了. 當(dāng)然你會說可以通過數(shù)據(jù)遷移呀, 嘿嘿, 問題
恰恰難在數(shù)據(jù)遷移, 因為這時候掛了, 節(jié)點數(shù)變?yōu)?了, 對key取hash后再 mod 3 的話, 大部分的key對應(yīng)的節(jié)點都要改. 這個時候
只能整個集群的數(shù)據(jù)都重新遷移一遍才能達到效果, 也許你忙完這些工作, 還不如把掛掉的機器換個新的!!! 再者, 不僅僅是節(jié)點掛了會出現(xiàn)問題
如果整個分布式集群負載很高, 希望增加節(jié)點來解決問題, 這個時候, 遷移的工作還是一樣的麻煩, 這樣我估計如果數(shù)據(jù)量龐大的話, 沒人敢輕易遷移.
于是便有了一致性hash
3. 一致性哈希
如圖, 所有的節(jié)點也有自己的key(比如hostname), 經(jīng)過hash, 然后mod 2的32次方, 映射到這個超大的環(huán)上面的一個虛擬節(jié)點
然后所有的key去獲取value的時候, 也是同樣的hash算法, mod 2的32次方, 這時候不一定所有的key都剛好映射到各個節(jié)點相應(yīng)的虛擬
節(jié)點上(事實上概率很小), 然后這時候取值只要按照約定好的固定方向(如順時針), 找到第一個的虛擬節(jié)點, 然后根據(jù)該虛擬節(jié)點
就可以找到相應(yīng)的node, 然后進行相應(yīng)的操作.
這個時候, 如果其中一個節(jié)點掛了, 那么依然要進行數(shù)據(jù)遷移, 只不過數(shù)據(jù)遷移的數(shù)據(jù)量減少了, 只需要將掛了的節(jié)點的數(shù)據(jù)遷移到他順時針的下一個
節(jié)點上即可, 這個對應(yīng)的keys依然能夠找到數(shù)據(jù). 同樣的, 如果增加節(jié)點, 數(shù)據(jù)遷移量也不多, 只需要將該節(jié)點逆時針方向到達上一個節(jié)點之前的key對應(yīng)的數(shù)據(jù)都
遷移到新增的節(jié)點上就OK了.這就是傳說中的一致性哈希.
比如上圖, key1 key2 key3 key4 key5 key6的值將由 node2返回( 假設(shè)這是一個key value存儲集群)
同樣的, key7~key11 對應(yīng) node3
key12 ~key17對應(yīng)node4
key18~key22 對應(yīng)node1
?
3. 講完了what和why, 就是how了
其實上面在why講解過程中, how的部分已經(jīng)講解了一大片, 其實關(guān)鍵的地方還是在hash算法的選擇, 如何選擇好的hash算法, 讓他能夠平均地分配每個節(jié)點, 這才是
最大的問題.
簡單的話可以使用MD5算法來作為hash算法, 對于各個hash算法的比較, 可以參考下面的文章
http://www.iteye.com/topic/346682
另外參考?http://www.cnblogs.com/liunx/archive/2010/03/24/1693925.html
和這篇?http://blog.csdn.net/x15594/archive/2011/03/23/6270242.aspx
他們的圖畫的比我生動
轉(zhuǎn)載于:https://www.cnblogs.com/scott19820130/p/4622083.html
總結(jié)
以上是生活随笔為你收集整理的[转载] 一致性哈希的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件即子文件删除
- 下一篇: JBoss类加载机制 ClassLoad