站長資訊網
        最全最豐富的資訊網站

        redis緩存學習之一致性hash和hash槽

        本篇文章給大家帶來了關于Redis的相關知識,其中主要介紹了一致性hash和hash槽的相關問題,如果發生擴容或者節點丟失你就會遇到大量的數據遷移問題,一致性hash和hash槽就可以避免這種問題,希望對大家有幫助。

        redis緩存學習之一致性hash和hash槽

        推薦學習:Redis學習教程

        假如我們現在有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的數字空間中。我們可以把這個東西想象成一個咬住尾巴的,形成了一個閉環。
        redis緩存學習之一致性hash和hash槽

        2、服務器hash到環上

        環有了我們現在需要把服務器放到環上,可以根據服務器的IP地址獲取編號等唯一標識取hash后放到環上。
        redis緩存學習之一致性hash和hash槽

        3、數據存儲和獲取

        當我們需要把一個數據放到服務器上的時候我們首先需要計算數據的hash值然后取余,如果取余后的值在環上有對應的服務器那直接放進去如果沒有則向后查找。
        redis緩存學習之一致性hash和hash槽
        所以最后data1在redis1里面,data2在redis2里面。當我們獲取數據的時候也是執行相同的過程,計算key的hash值,然后根據相同的規則獲取存儲的服務器。

        4、服務器的刪除和添加

        如果現在某個redis節點掛掉了,那么其他節點里面的數據是還在的,原來節點里面的數據會被重新分配到下一個節點里面。
        如果在環境中新增一臺服務器RedisNeo,通過hash算法將RedisNeo映射到環中,通過按順時針遷移的規則,那么以前hash值在Redis2和RedisNeo之間的數據遷移到RedisNeo里面(下圖中RedisNeo挨著Redis2),其它對象還保持這原有的存儲位置。通過對節點的添加和刪除的分析,一致性哈希算法在保持了單調性的同時,還是數據的遷移達到了最小,這樣的算法對分布式集群來說是非常合適的,避免了大量數據遷移,減小了服務器的的壓力。
        redis緩存學習之一致性hash和hash槽
        所以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節點均勻分布的。
        redis緩存學習之一致性hash和hash槽
        和一致性哈希相比在擴容和縮容的時候需要手動手動分配hash槽,并且在刪除master節點的時候要把他的從節點和hash槽交給其他master節點;hash槽的是根據CRC-16(key)%16384的值來判斷屬于哪個槽區。

        推薦學習:Redis教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 四虎国产精品永久一区| 国产精品美女久久久久av爽 | 亚洲视频精品在线| 嫖妓丰满肥熟妇在线精品| 精品无码国产自产拍在线观看蜜| 国内精品91最新在线观看| 国内精品久久久久久99蜜桃| 亚洲国产精品久久久天堂| 香蕉依依精品视频在线播放| 久草热久草热线频97精品| 国产精品人人做人人爽人人添| 麻豆精品久久久一区二区| 国产精品视频网| 91精品成人免费国产| 99久久精品影院老鸭窝| CAOPORM国产精品视频免费| 熟妇无码乱子成人精品| 中日精品无码一本二本三本| 亚洲国产精品综合久久一线| 四虎影院国产精品| 欧美精品亚洲精品日韩专区| 免费精品精品国产欧美在线欧美高清免费一级在线 | 久久久久久夜精品精品免费啦| 永久免费精品影视网站| 亚洲爆乳精品无码一区二区 | 久久精品中文字幕第23页| 精品日韩欧美国产| 久久这里有精品视频| 久久九九久精品国产免费直播| 久久精品亚洲乱码伦伦中文| 人妻精品久久久久中文字幕| 无码8090精品久久一区| 亚洲精品tv久久久久| 亚洲国产一成久久精品国产成人综合 | 亚洲国产欧美日韩精品一区二区三区 | 丁香色婷婷国产精品视频| 99久久国产综合精品成人影院| segui久久国产精品| 精品日本一区二区三区在线观看| 麻豆精品国产自产在线观看一区| 日韩欧美国产精品第一页不卡 |