一致性雜湊演算法 虛擬節點

2022-08-18 04:21:14 字數 970 閱讀 3098

一致性雜湊演算法——虛擬節點

一致性雜湊演算法是分布式系統中常用的演算法。比如,乙個分布式的儲存系統,要將資料儲存到具體的節點上,如果採用普通的hash方法,將資料對映到具體的節點上,如key%n,key是資料的key,n是機器節點數,如果有乙個機器加入或退出這個集群,則所有的資料對映都無效了,如果是持久化儲存則要做資料遷移,如果是分布式快取,則其他快取就失效了。

因此,引入了一致性雜湊演算法:

把資料用hash函式(如md5),對映到乙個很大的空間裡,如圖所示。資料的儲存時,先得到乙個hash值,對應到這個環中的每個位置,如k1對應到了圖中所示的位置,然後沿順時針找到乙個機器節點b,將k1儲存到b這個節點中。

如果b節點宕機了,則b上的資料就會落到c節點上,如下圖所示:

這樣,只會影響c節點,對其他的節點a,d的資料不會造成影響。然而,這又會造成乙個「雪崩」的情況,即c節點由於承擔了b節點的資料,所以c節點的負載會變高,c節點很容易也宕機,這樣依次下去,這樣造成整個集群都掛了。

為此,引入了「虛擬節點」的概念:即把想象在這個環上有很多「虛擬節點」,資料的儲存是沿著環的順時針方向找乙個虛擬節點,每個虛擬節點都會關聯到乙個真實節點,如下圖所使用:

圖中的a1、a2、b1、b2、c1、c2、d1、d2都是虛擬節點,機器a負載儲存a1、a2的資料,機器b負載儲存b1、b2的資料,機器c負載儲存c1、c2的資料。由於這些虛擬節點數量很多,均勻分布,因此不會造成「雪崩」現象。

一致性雜湊的虛擬節點

設環空間從 0 1000 目前有三個節點 300,600,900 各負責大約 300 的區段,現在的問題是,在沒有虛擬節點概念的情況下,如果乙個節點失效,其下游的節點會承擔失效節點的所有資料量,造成資料分布不均.可以通過以下方式改善 new list for real node in 300,600...

一致性hash演算法虛擬節點 一致性hash演算法

hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...