久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

147次閱讀
沒有評論

共計 1926 個字符,預計需要花費 5 分鐘才能閱讀完成。

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

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

一致性 hash 原理

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

1、環形空間

按照常用的 hash 算法來將對應的 key 哈希到一個具有 2 的 32 次方個節點的空間中,即 0 ~ (2 的 32)- 1 的數字空間中。我們可以把這個東西想象成一個咬住尾巴的,形成了一個閉環。

2、服務器 hash 到環上

環有了我們現在需要把服務器放到環上,可以根據服務器的 IP 地址獲取編號等唯一標識取 hash 后放到環上。

3、數據存儲和獲取

當我們需要把一個數據放到服務器上的時候我們首先需要計算數據的 hash 值然后取余,如果取余后的值在環上有對應的服務器那直接放進去如果沒有則向后查找。

所以最后 data1 在 redis1 里面,data2 在 redis2 里面。當我們獲取數據的時候也是執行相同的過程,計算 key 的 hash 值,然后根據相同的規則獲取存儲的服務器。

4、服務器的刪除和添加

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

所以 redisNeo 加入后 data3 就到 redisNeo 里面去了。

5、平衡性

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

hash 槽

哈希槽是在 redis cluster 集群方案中采用的,redis cluster 集群沒有采用一致性哈希方案,而是采用數據分片中的哈希槽來進行數據存儲與讀取的。redis cluster 采用數據分片的哈希槽來進行數據存儲和數據的讀取。redis cluster 一共有 2^14(16384)個槽,所有的 master 節點都會有一個槽區比如 0~1000,槽數是可以遷移的。master 節點的 slave 節點不分配槽,只擁有讀權限。但是注意在代碼中 redis cluster 執行讀寫操作的都是 master 節點,并不是你想 的讀是從節點,寫是主節點。第一次新建 redis cluster 時,16384 個槽是被 master 節點均勻分布的。

和一致性哈希相比在擴容和縮容的時候需要手動手動分配 hash 槽,并且在刪除 master 節點的時候要把他的從節點和 hash 槽交給其他 master 節點;hash 槽的是根據 CRC-16(key)%16384 的值來判斷屬于哪個槽區。

感謝各位的閱讀,以上就是“redis 的一致性 hash 和 hash 槽是什么”的內容了,經過本文的學習后,相信大家對 redis 的一致性 hash 和 hash 槽是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計1926字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 富宁县| 张家港市| 广河县| 元氏县| 龙陵县| 江源县| 新津县| 松江区| 红安县| 读书| 化德县| 蒙城县| 合作市| 临高县| 阿图什市| 肥乡县| 奈曼旗| 成安县| 玉树县| 淳化县| 富宁县| 固安县| 大名县| 饶阳县| 长春市| 武城县| 穆棱市| 顺平县| 佳木斯市| 册亨县| 大余县| 东乡族自治县| 林周县| 呼伦贝尔市| 佳木斯市| 灵璧县| 沾化县| 米泉市| 新营市| 宜君县| 蕉岭县|