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