亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

分析redis集群中數據分布算法

發布時間:2021-11-05 16:58:19 來源:億速云 閱讀:178 作者:iii 欄目:web開發

這篇文章主要介紹“分析redis集群中數據分布算法”,在日常操作中,相信很多人在分析redis集群中數據分布算法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”分析redis集群中數據分布算法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

哈希算法

哈希算法在分布式架構中應用廣泛,不僅僅是數據存儲,還有負載均衡等應用上有用的比較多,哈希算法的思想非常簡單,也許你知道 HashMap  的哈希函數,哈希算法跟 HashMap  一樣,也是通過一個哈希函數得到某一個數字,然后根據數字找到相應的服務器。哈希算法的哈希函數比較簡單,一般是根據某個key的值或者key 的哈希值與當前可用的  master節點數取模,根據取模的值獲取具體的服務器。哈希算法服務結構模型圖如下圖所示:

分析redis集群中數據分布算法

哈希算法結構模型圖

用我們前面假設的數據,利用哈希算法來實驗一把,加深我們對哈希算法在分布式中的應用的理。我們假設哈希算法中的哈希函數為“id % master  節點數”,結果為 0 的數據存放到 server1 服務器上,結果為 1 的數據存放到 server2 服務器上,結果為 2 的數據存放到 server3  服務器上。

所以經過哈希算法之后,id=3、id=6 的數據與 master 節點數取模為 0 (3%3=0,6%3=0),所以這兩個數據會存放到 server1  服務器 ,以此類推,id=1、id=4 的數據將存放到 server2 服務器中,id=2、id=5 的數據將存放到 server3  上,這時候服務器存儲數據如下圖所示:

分析redis集群中數據分布算法

服務器存儲數據

這就是哈希算法在分布式中的作用,比較簡單,可以看出只要你哈希函數設計的好,數據在各個服務器上是比較均勻分布的,但是哈希算法有一個致命的缺點:擴展性特別的差,比如我們的集群中,服務器server3  宕機了,這時候集群中可用的機器只有兩臺了,這樣哈希函數就變成了id %  2了,這就會導致一個問題,所有的數據需要重新計算,找到新的存儲節點,每次有服務器宕機或者添加機器時,都需要進行大量的數據遷移,這會使得系統的可用性、穩定性變差。

一致性哈希算法

一致性哈希算法可以說是哈希算法的升級版,解決了哈希算法擴展性差的問題,一致性哈希算法跟哈希算法不一樣,一致性哈希算法會將服務器和數據都通過哈希函數映射到一個首尾相連的哈希環上,存儲節點映射可以根據  ip  地址來進行哈希取值,數據映射到哈希環上后按照順時針的方向查找存儲節點,即從數據映射在環上的位置開始,順時針方向找到的第一個存儲節點,那么他就存儲在這個節點上。

我們使用一致性哈希算法來存儲我們的數據,我畫了一張圖來模擬一致性哈希算法可能出現的結果:

分析redis集群中數據分布算法

一致性算法模擬存儲圖

我們先來解讀一下這張圖,按照一致性哈希算法的規則,數據沿著順時針的方向查找數據,那么 id=4 的數據存放在 server1 服務器,id=2  的數據存放在服務器 server2 上,id=3、id=1、id=5、id=6 的數據都存放在服務器 server3  上,如果你比較敏感的話,也許你就會發現一致性哈希算法的不足之處, 從圖中可以看出,我們六條數據分布不均勻,并不是每臺服務器存儲 2  條數據,而且差距好像還有點大,這里我們就要來說一說一致性哈希算法的缺點:一致性哈希算法會會造成數據分布不均勻的問題或者叫做數據傾斜問題,就像我們圖中那樣,數據分布不均勻可能會造成某一個節點的負載過大,從而宕機。造成數據分布不均勻有以下兩種情況:

  • 第一:哈希函數的原因,經過哈希函數之后服務器在哈希環上的分布不均勻,服務器之間的間距不相等,這樣就會導致數據不均勻。

  • 第二:某服務器宕機了,后繼節點就需要承受原本屬于宕機機器的數據,這樣也會造成數據不均勻。

前面我們提到過一致性哈希算法解決了哈希算法中擴展性差的問題,這個怎么理解呢?我們來看看,在一致性哈希算法中當有存儲節點加入或者退出時,只會影響應該該節點的后繼節點,舉個例子說明一下,例如我們要在服務器server3  和服務 server2 之間加入了一個服務器存儲節點 server4,只會對服務器server3 造成影響,原本存儲到服務器server3  上的數據有一部分會落入到服務器 server4 上,對服務器 server1 和 server2  并沒有任何影響,這樣就不會進行大量的數據遷移,擴展性就變強了。

帶有限負載的一致性哈希算法

因為一致性哈希算法的數據分布不均勻的問題,Google 在 2017  年提出了帶有限負載的一致性哈希算法來解決這個問題,帶有限負載的一致性哈希算法思想比較簡單,給每個存儲節點設置了一個存儲上限值來控制存儲節點添加或移除造成的數據不均勻,當數據按照一致性哈希算法找到相應的存儲節點時,要先判斷該存儲節點是否達到了存儲上限;如果已經達到了上限,則需要繼續尋找該存儲節點順時針方向之后的節點進行存儲。

我們利用帶有限負載的一致性哈希算法來改進上面的數據存儲,我們限定每臺服務器節點存儲的數據上限為 2 ,數據插入的順序就按照 ID  大小的順序,同樣我也畫了一張模擬圖:

分析redis集群中數據分布算法

帶有限負載的一致性哈希算法

一起來分析一下這張圖,因為我們的添加順序是按照 id 大小的順序,所以前四個數據都沒有問題,這時候的服務器都沒有超過最高負載數量,id=5  的數據落在了服務器server2 和服務器server3 之間,本應該是存儲在服務器server3 上,但是由于此時的服務器server3 上已經存儲了  id=1、id=3 的數據達到了最高限定,因此 id=5 的數據會沿著順時針的方向繼續往下尋找服務器,下一個服務器就是server1,此時的服務器server1  就存儲了 id=4 的數據并沒有達到上限,所以 id=5 的數據就會存儲在服務器server1,id=6  的數據同樣的道理。這樣就利用帶有限負載的一致性哈希算法解決了一致性哈希算法中數據分布不均勻的問題。

帶虛擬節點的一致性哈希算法

帶有限負載的一致性哈希算法也有一個問題,那就是每臺服務器的性能配置可能存在不一樣,如果規定數量過小的話,對于配置高的服務器來說有點浪費,這是因為服務器之間可能存在差異,叫做服務器之間的異構性,為了解決服務器之間的異構性問題,引入了一種叫做帶虛擬節點的一致性哈希算法,帶虛擬節點的一致性哈希算法核心思想是:根據每個節點的性能為每個節點劃分不同數量的虛擬節點,并將這些虛擬節點映射到哈希環中,然后再按照一致性哈希算法進行數據映射和存儲。

為了演示帶虛擬節點的一致性哈希算法,我們先做一個假設服務器server3是配置最差的,所以我們以服務器server3 為基準,服務器server2  是服務器server3 的兩倍,服務器server1 是服務器server3 的三倍,有了這個前提之后,我們就可以來建立虛擬節點,我們假設服務器server3  的虛擬節點為服務器server3_1,服務器server2 就有兩個虛擬節點服務器server2_1、服務器server2_2,服務器server1  有三個虛擬節點 服務器server1_1、服務器server1_2、服務器server1_3。我還是跟前面一樣畫了一張模擬圖:

分析redis集群中數據分布算法

落到虛擬節點上的數據都會存到對應的物理服務器上,所以通過帶虛擬節點的一致性哈希算法后,數據存儲結果為:數據id=2、id=3、id=5  的數據都會存儲到服務器server1 上,id=1 的數據將會存儲到服務器server2 上,數據 id=4、id=6  都會存放到服務器server3上。

虛擬節點可以讓配置好的服務器存儲更多的數據,這樣就解決了系統異構性的問題,同時由于大量的虛擬節點的存在  在數據遷移時數據會落到不同的物理機上,這樣就減小了數據遷移時某臺服務器的分擔壓力,能夠保證系統的穩定性。

虛擬槽分區

虛擬槽分區是 redis cluster  中默認的數據分布技術,虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有數據映射到一個固定范圍的整數集合中,這個整數定義為槽(slot),而且這個槽的個數一般遠遠的大于節點數。

在 redis cluster 中有16384(0~16383)個槽,會將這些槽平均分配到每個 master 上,在存儲數據時利用 CRC16  算法,具體的計算公式為:slot=CRC16(key)/16384 來計算 key 屬于哪個槽。在我們的集群環境中,一個 key  的存儲或者查找過程,可能如下圖所示:

分析redis集群中數據分布算法

虛擬槽分區解耦了數據與節點的關系,通過引入槽,讓槽成為集群內數據管理和遷移的基本單位,簡化了節點擴容和收縮難度,你只需要關注數據在哪個槽,并不需要關心數據在哪個節點上。所以虛擬槽分區可以說比較好的兼容了數據均勻分布和擴展性的問題。

到此,關于“分析redis集群中數據分布算法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

萨嘎县| 庄浪县| 禹州市| 杨浦区| 府谷县| 宝坻区| 阳原县| 宁津县| 十堰市| 奉化市| 西丰县| 子长县| 京山县| 富川| 晋宁县| 马鞍山市| 天津市| 永川市| 怀柔区| 义马市| 平利县| 佳木斯市| 田阳县| 太保市| 梅河口市| 马龙县| 安龙县| 景谷| 兴国县| 盐亭县| 兴海县| 手游| 佛学| 富川| 乐昌市| 侯马市| 化隆| 南宫市| 临泉县| 集安市| 屯门区|