Redis資料分布一致性雜湊

2021-10-25 04:50:15 字數 1608 閱讀 2923

一致性雜湊

一致性雜湊的原理:

把所有的雜湊值空間組織成乙個虛擬的圓環(雜湊環),整個空間按順時針方向組織。因為是環形空間,0 和2^32-1 是重疊的。

假設我們有四台機器要雜湊環來實現對映(分布資料),我們先根據機器的名稱或者ip 計算雜湊值,然後分布到雜湊環中(紅色圓圈)。

現在有4 條資料或者4 個訪問請求,對key 計算後,得到雜湊環中的位置(綠色圓圈)。沿雜湊環順時針找到的第乙個node,就是資料儲存的節點。

在這種情況下,新增了乙個node5 節點,不影響資料的分布。

刪除了乙個節點node4,只影響相鄰的乙個節點。

谷歌的murmurhash 就是一致性雜湊演算法。在分布式系統中,負載均衡、分庫分表等場景中都有應用。

一致性雜湊解決了動態增減節點時,所有資料都需要重新分布的問題,它只會影響到下乙個相鄰的節點,對其他節點沒有影響。

但是這樣的一致性雜湊演算法有乙個缺點,因為節點不一定是均勻地分布的,特別是在節點數比較少的情況下,所以資料不能得到均勻分布。解決這個問題的辦法是引入虛擬節點(virtual node)。

比如:2 個節點,5 條資料,只有1 條分布到node2,4 條分布到node1,不均勻。

node1 設定了兩個虛擬節點,node2 也設定了兩個虛擬節點(虛線圓圈)。

這時候有3 條資料分布到node1,1 條資料分布到node2。

redis 虛擬槽分割槽

redis 既沒有用雜湊取模,也沒有用一致性雜湊,而是用虛擬槽來實現的。

redis 建立了16384 個槽(slot),每個節點負責一定區間的slot。比如node1 負責0-5460,node2 負責5461-10922,node3 負責10923-16383。

redis 的每個master 節點維護乙個16384 位(2048bytes=2kb)的位序列,比如:序列的第0 位是1,就代表第乙個slot 是它負責;序列的第1 位是0,代表第二個slot不歸它負責。

物件分布到redis 節點上時,對key 用crc16 演算法計算再%16384,得到乙個slot的值,資料落到負責這個slot 的redis 節點上。

檢視key 屬於哪個slot:

redis> cluster keyslot leon
注意:key 與slot 的關係是永遠不會變的,會變的只有slot 和redis 節點的關係。

比如有些multi key 操作是不能跨節點的,如果要讓某些資料分布到乙個節點上,例如使用者2673 的基本資訊和金融資訊,怎麼辦?

在key 裡面加入即可。redis 在計算槽編號的時候只會獲取{}之間的字串進行槽編號計算,這樣由於上面兩個不同的鍵,{}裡面的字串是相同的,因此他們可以被計算出相同的槽。

userbase=…

userfin=…

127.0.0.1:7293> set aa 1

ok127.0.0.1:7293> set ab 1

ok127.0.0.1:7293> set ac 1

ok127.0.0.1:7293> set ad 1

ok127.0.0.1:7293> set ae 1

ok

問題:客戶端連線到哪一台伺服器?訪問的資料不在當前節點上,怎麼辦?

一致性雜湊

直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...

一致性雜湊

from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...

一致性雜湊

一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...