溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

redis的一致性hash和hash槽是什么

發(fā)布時間:2022-03-28 14:11:46 來源:億速云 閱讀:342 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

這篇文章主要講解了“redis的一致性hash和hash槽是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“redis的一致性hash和hash槽是什么”吧!

redis的一致性hash和hash槽是什么

假如我們現(xiàn)在有x臺緩存設(shè)備,我們在決定把數(shù)據(jù)放到哪個緩存設(shè)備上的時候可以key%x,但是如果發(fā)生擴(kuò)容或者節(jié)點丟失你就需要key%(x±y)這樣就會遇到大量的數(shù)據(jù)遷移問題,一致性hash和hash槽就可以避免這種問題。

一致性hash原理

普通的hash是對服務(wù)器的數(shù)量取余,一致性hash是對特定的數(shù)字取余(2^32)不會因為服務(wù)器的數(shù)量變化,首先我們對服務(wù)器的ip或者其他唯一標(biāo)識取余得到一個值這個值就是服務(wù)器在hash環(huán)上的位置,然后對要放入服務(wù)器的對象進(jìn)行hash得到一個值,在hash換上找對應(yīng)的服務(wù)器如果值所在的位置沒有服務(wù)器就看下一個位置是否服務(wù)器知道找到可存儲的服務(wù)器。

1、環(huán)形空間

按照常用的hash算法來將對應(yīng)的key哈希到一個具有2的32 次方個節(jié)點的空間中,即0 ~ (2的32)-1的數(shù)字空間中。我們可以把這個東西想象成一個咬住尾巴的,形成了一個閉環(huán)。
redis的一致性hash和hash槽是什么

2、服務(wù)器hash到環(huán)上

環(huán)有了我們現(xiàn)在需要把服務(wù)器放到環(huán)上,可以根據(jù)服務(wù)器的IP地址獲取編號等唯一標(biāo)識取hash后放到環(huán)上。
redis的一致性hash和hash槽是什么

3、數(shù)據(jù)存儲和獲取

當(dāng)我們需要把一個數(shù)據(jù)放到服務(wù)器上的時候我們首先需要計算數(shù)據(jù)的hash值然后取余,如果取余后的值在環(huán)上有對應(yīng)的服務(wù)器那直接放進(jìn)去如果沒有則向后查找。
redis的一致性hash和hash槽是什么
所以最后data1在redis1里面,data2在redis2里面。當(dāng)我們獲取數(shù)據(jù)的時候也是執(zhí)行相同的過程,計算key的hash值,然后根據(jù)相同的規(guī)則獲取存儲的服務(wù)器。

4、服務(wù)器的刪除和添加

如果現(xiàn)在某個redis節(jié)點掛掉了,那么其他節(jié)點里面的數(shù)據(jù)是還在的,原來節(jié)點里面的數(shù)據(jù)會被重新分配到下一個節(jié)點里面。
如果在環(huán)境中新增一臺服務(wù)器RedisNeo,通過hash算法將RedisNeo映射到環(huán)中,通過按順時針遷移的規(guī)則,那么以前hash值在Redis2和RedisNeo之間的數(shù)據(jù)遷移到RedisNeo里面(下圖中RedisNeo挨著Redis2),其它對象還保持這原有的存儲位置。通過對節(jié)點的添加和刪除的分析,一致性哈希算法在保持了單調(diào)性的同時,還是數(shù)據(jù)的遷移達(dá)到了最小,這樣的算法對分布式集群來說是非常合適的,避免了大量數(shù)據(jù)遷移,減小了服務(wù)器的的壓力。
redis的一致性hash和hash槽是什么
所以redisNeo加入后data3就到redisNeo里面去了。

5、平衡性

到目前為止一致性hash也可以算做完成了,但是有一個問題還需要解決,那就是平衡性。從下圖我們可以看出,當(dāng)服務(wù)器節(jié)點比較少的時候,會出現(xiàn)一個問題,就是此時必然造成大量數(shù)據(jù)集中到一個節(jié)點上面,例如你只有兩個節(jié)點一個在1另一個在10,那么很顯然1節(jié)點的壓力是無限大的,因為只有hash值在[2,10]之間的才會到10節(jié)點,其他的全到1節(jié)點上去了,為了解決這種數(shù)據(jù)傾斜問題,一致性哈希算法引入了虛擬節(jié)點機(jī)制,即對每一個服務(wù)節(jié)點計算多個哈希,每個計算結(jié)果位置都放置一個此服務(wù)節(jié)點,稱為虛擬節(jié)點。具體做法可以先確定每個物理節(jié)點關(guān)聯(lián)的虛擬節(jié)點數(shù)量,然后在ip或者主機(jī)名后面增加編號,同時數(shù)據(jù)定位算法不變,只是多了一步虛擬節(jié)點到實際節(jié)點的映射。

hash槽

哈希槽是在redis cluster集群方案中采用的,redis cluster集群沒有采用一致性哈希方案,而是采用數(shù)據(jù)分片中的哈希槽來進(jìn)行數(shù)據(jù)存儲與讀取的。redis cluster采用數(shù)據(jù)分片的哈希槽來進(jìn)行數(shù)據(jù)存儲和數(shù)據(jù)的讀取。redis cluster一共有2^14(16384)個槽,所有的master節(jié)點都會有一個槽區(qū)比如0~1000,槽數(shù)是可以遷移的。master節(jié)點的slave節(jié)點不分配槽,只擁有讀權(quán)限。但是注意在代碼中redis cluster執(zhí)行讀寫操作的都是master節(jié)點,并不是你想 的讀是從節(jié)點,寫是主節(jié)點。第一次新建redis cluster時,16384個槽是被master節(jié)點均勻分布的。
redis的一致性hash和hash槽是什么
和一致性哈希相比在擴(kuò)容和縮容的時候需要手動手動分配hash槽,并且在刪除master節(jié)點的時候要把他的從節(jié)點和hash槽交給其他master節(jié)點;hash槽的是根據(jù)CRC-16(key)%16384的值來判斷屬于哪個槽區(qū)。

感謝各位的閱讀,以上就是“redis的一致性hash和hash槽是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對redis的一致性hash和hash槽是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI