這篇文章主要講解了“redis的一致性hash和hash槽是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“redis的一致性hash和hash槽是什么”吧!
創(chuàng)新互聯(lián)是專業(yè)的蘆溪網(wǎng)站建設(shè)公司,蘆溪接單;提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蘆溪網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
假如我們現(xiàn)在有x臺緩存設(shè)備,我們在決定把數(shù)據(jù)放到哪個緩存設(shè)備上的時候可以key%x,但是如果發(fā)生擴(kuò)容或者節(jié)點(diǎn)丟失你就需要key%(x±y)這樣就會遇到大量的數(shù)據(jù)遷移問題,一致性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ù)器。
按照常用的hash算法來將對應(yīng)的key哈希到一個具有2的32 次方個節(jié)點(diǎn)的空間中,即0 ~ (2的32)-1的數(shù)字空間中。我們可以把這個東西想象成一個咬住尾巴的,形成了一個閉環(huán)。
環(huán)有了我們現(xiàn)在需要把服務(wù)器放到環(huán)上,可以根據(jù)服務(wù)器的IP地址獲取編號等唯一標(biāo)識取hash后放到環(huán)上。
當(dāng)我們需要把一個數(shù)據(jù)放到服務(wù)器上的時候我們首先需要計算數(shù)據(jù)的hash值然后取余,如果取余后的值在環(huán)上有對應(yīng)的服務(wù)器那直接放進(jìn)去如果沒有則向后查找。
所以最后data1在redis1里面,data2在redis2里面。當(dāng)我們獲取數(shù)據(jù)的時候也是執(zhí)行相同的過程,計算key的hash值,然后根據(jù)相同的規(guī)則獲取存儲的服務(wù)器。
如果現(xiàn)在某個redis節(jié)點(diǎn)掛掉了,那么其他節(jié)點(diǎn)里面的數(shù)據(jù)是還在的,原來節(jié)點(diǎn)里面的數(shù)據(jù)會被重新分配到下一個節(jié)點(diǎn)里面。
如果在環(huán)境中新增一臺服務(wù)器RedisNeo,通過hash算法將RedisNeo映射到環(huán)中,通過按順時針遷移的規(guī)則,那么以前hash值在Redis2和RedisNeo之間的數(shù)據(jù)遷移到RedisNeo里面(下圖中RedisNeo挨著Redis2),其它對象還保持這原有的存儲位置。通過對節(jié)點(diǎn)的添加和刪除的分析,一致性哈希算法在保持了單調(diào)性的同時,還是數(shù)據(jù)的遷移達(dá)到了最小,這樣的算法對分布式集群來說是非常合適的,避免了大量數(shù)據(jù)遷移,減小了服務(wù)器的的壓力。
所以redisNeo加入后data3就到redisNeo里面去了。
到目前為止一致性hash也可以算做完成了,但是有一個問題還需要解決,那就是平衡性。從下圖我們可以看出,當(dāng)服務(wù)器節(jié)點(diǎn)比較少的時候,會出現(xiàn)一個問題,就是此時必然造成大量數(shù)據(jù)集中到一個節(jié)點(diǎn)上面,例如你只有兩個節(jié)點(diǎn)一個在1另一個在10,那么很顯然1節(jié)點(diǎn)的壓力是無限大的,因為只有hash值在[2,10]之間的才會到10節(jié)點(diǎn),其他的全到1節(jié)點(diǎn)上去了,為了解決這種數(shù)據(jù)傾斜問題,一致性哈希算法引入了虛擬節(jié)點(diǎn)機(jī)制,即對每一個服務(wù)節(jié)點(diǎn)計算多個哈希,每個計算結(jié)果位置都放置一個此服務(wù)節(jié)點(diǎn),稱為虛擬節(jié)點(diǎn)。具體做法可以先確定每個物理節(jié)點(diǎn)關(guān)聯(lián)的虛擬節(jié)點(diǎn)數(shù)量,然后在ip或者主機(jī)名后面增加編號,同時數(shù)據(jù)定位算法不變,只是多了一步虛擬節(jié)點(diǎn)到實(shí)際節(jié)點(diǎn)的映射。
哈希槽是在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é)點(diǎn)都會有一個槽區(qū)比如0~1000,槽數(shù)是可以遷移的。master節(jié)點(diǎn)的slave節(jié)點(diǎn)不分配槽,只擁有讀權(quán)限。但是注意在代碼中redis cluster執(zhí)行讀寫操作的都是master節(jié)點(diǎn),并不是你想 的讀是從節(jié)點(diǎn),寫是主節(jié)點(diǎn)。第一次新建redis cluster時,16384個槽是被master節(jié)點(diǎn)均勻分布的。
和一致性哈希相比在擴(kuò)容和縮容的時候需要手動手動分配hash槽,并且在刪除master節(jié)點(diǎn)的時候要把他的從節(jié)點(diǎn)和hash槽交給其他master節(jié)點(diǎn);hash槽的是根據(jù)CRC-16(key)%16384的值來判斷屬于哪個槽區(qū)。
感謝各位的閱讀,以上就是“redis的一致性hash和hash槽是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對redis的一致性hash和hash槽是什么這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!