一致性哈希简单介绍
一致性哈希簡單介紹
- ?Consistent Hashing 算法早在 1997 年就在論文《Consistent hashing and random trees》中被提出,提出了在動態變化的Cache環境中,哈希算法應該滿足的4個適應條件:
?
一致性哈希原理
一致性哈希將key用hash函數進行映射,映射出來的所有點能夠分布到一個圓環內,實際上consistent hashing 是一種 hash 算法, 在改變映射內容的大小時,而不需要改變hash算法,且能夠盡可能小的改變已存在 key 映射關系,盡可能的滿足單調性的要求。。這里我要講述一種特殊的一致性哈?!植际揭恢滦怨?Distributed Consistent Hashing):
普通的一致性哈希
- 分布式一致性哈希(DCH)滿足節點的對稱分布,普通的一致性哈希表現如圖1:
- 3個節點平均分布在圓環上,每個節點之間的角度為120°,此時,只要hash函數夠均勻,那么每個節點所命中的概率則都是一樣的。
- 如果再增加一個節點,普通的一致性哈希認為無論在那個節點之間增加新的節點,那么與新的節點非相鄰的節點盡量保持不變,這樣保證一致性哈希的單調性,如圖 2:
- 新的節點4(n4)自由分配到節點2(n2)和節點3(n3)之間,那么原來的key的映射范圍k3變成了新的k3和k4,插入時,新的k3將著落在節點 4(n4)上;新的k4將著落在節點3上(n3)。為了節點的老數據不丟失,我們還需要將節點3上的屬于k3范圍的數據遷移到新的節點4(n4)上,并定期刪除節點3(n3)的冗余數據(一致性哈希的分散性),這樣在查詢時,不會有命中不到的情況。雖然保證了一致性哈希的單調性,但是這樣的方式不能保證節點的負載均衡,畢竟大部分的查詢會著落在節點1(n1)和節點2(n2)上。
- 如果減少節點,普通的一致性哈希情況如圖3:
- 節點3(n3)因為某種原因不能進行映射,那么圓環上只剩下2個節點(n1、n2),這樣原來k1和k3合并成新的k1,即所有的負載全部著落在節點 1(n1)上,同新增加節點一樣,雖然保證了單調性,但是明顯不能保證負載均衡。
?
分布式一致性哈希
?
- 分布式一致性哈希(DCH)只是在普通的的一致性哈希算法進行的一點改進。同樣DCH是將key映射到一個圓環中,與普通一致性哈希不同的是,節點增加了虛擬的節點;包括實節點對之對應的虛節點不是按照連續的弧度范圍進行劃分,而是定義一個最小的弧度單位(最好能夠被圓整分),在這個最小的弧度單位里面均勻放置所有的節點,如圖4:
- 上圖實線部分表示實節點,虛線部分表示虛節點。
- 當增加新節點或刪除節點的時候,保證最小弧度單位不變化,每個節點分別控制插入和數據遷移的大小,如圖5所示:
- 當新增加節點時
最小弧度中數據遷移大小=最小弧度/節點數
總共數據遷移量=最小弧度中數據遷移大小*360/最小弧度=360/節點數
- 與傳統一致性哈希比較,遷移數據從1點節點開始增加,那么遷移的數據弧度比例分別為:
傳統一致性哈希(2分法):1/2+1/4+1/4+1/8+1/8+1/8+1/8+...
DCH:1/2+1/3+1/4+1/5+1/6+1/7+1/8...
- 很明顯,傳統一致性哈希遷移數據量少,但是負載集中在某幾個節點上;而DCH則主要體現在遷移數據會利用各個節點的資源達到均衡,查詢時也會比傳統一致性哈希更均勻些。
- 當刪除節點時,并無數據遷移;
總結
- 對于在分布式的環境中來說,數據的訪問負載均衡更加重要,所以采用DCH的類似架構可能比數據遷移更加重要,比如memcache當中就采用了虛擬節點方式去達到負載均衡的目的。
- 對于數據遷移來說,普通的一致性哈希針對的是某兩個節點的數據遷移,而DCH針對的是一個分布式的環境,在數據量特別大的時候,DCH方式將數據遷移的壓力分散到各個節點,而不是集中在某些節點上。
總結
- 上一篇: 软件设计中的一些原则
- 下一篇: 使用Rainbow tables和Oph