一致性雜湊
機器數量發生變動的時候,幾乎所有的資料都會移動(不移動的應該是運氣比較好吧前後取模都是同乙個值),這個代價很大。此時的問題從水平如何拆分變成了,當增加或者刪除節點時,對於大多數記錄,保證原來分配到的某個節點,現在仍然應該分配到那個節點,將資料遷移量的降到最低,這就是一致性雜湊要做的事情。在這裡我們不指定是資料庫還是什麼,反正都是分布式儲存節點。
1.一致性雜湊
一致性 hash 演算法也是使用取模的思想,只是,剛才描述的取模法是對節點數量進行取模,而一致性hash演算法是對 2^32 取模,什麼意思呢?簡單來說,一致性hash演算法將整個雜湊值空間組織成乙個虛擬的圓環,如假設某雜湊函式h的值空間為0-2^32-1(即雜湊值是乙個32位無符號整形),整個雜湊環如下,從 0 ~ 2^32-1 代表的分別是乙個個的節點,這個環也叫雜湊環
然後我們將我們的節點進行一次雜湊,按照一定的規則,比如按照 ip 位址的雜湊值,讓節點落在雜湊環上。比如此時我們可能得到了如下圖的環:
然後就是需要通過資料 key 找到對應的伺服器然後儲存了,我們約定,通過資料 key 的雜湊值落在雜湊環上的節點,如果命中了機器節點就落在這個機器上,否則落在順時針直到碰到第乙個機器。如下圖所示 : a 的雜湊值落在了 d2 節點的前面,往下找落在了 d2 機器上,d的雜湊值 在 d1 節點的前面,往下找到了 d1 機器,b的雜湊值剛好落在了d1 節點上,依次~~~
2 一致性雜湊的分析
一致性雜湊主要就是解決當機器減少或增加的時候,大面積的資料重新雜湊的問題,主要從下面 2 個方向去考慮的,當節點宕機時,資料記錄會被定位到下乙個節點上,當新增節點的時候 ,相關區間內的資料記錄就需要重新雜湊。
2.1 某節點宕機
我們假設上圖中的 節點 d2 因為一些原因宕機了,可以看到,只有資料 a 的記錄需要重新重新定位儲存到節點 d1 上,因為 d1 是 d2 的下乙個節點,其它的資料都沒有被影響到,此時被影響的僅僅是 圖中的 d0-d2 這段區間的記錄,也就是之前落在 d2 上的資料現在都要落到 d1 上面了。如下圖
2.2 新增節點
我們假設我們需要增加一台機器,也就是增加乙個節點d4,如下圖所示,這個節點落在 d2-d1 之間,按照上述的雜湊環上的雜湊值落在節點的規則,那麼此時之前落在 d2 到 d4 之間的資料都需要重新定位到新的節點上面了,而其它位置的資料是不需要有改變的。
2.3 一致性雜湊的資料傾斜問題
一致性hash演算法在服務節點太少時,容易因為節點分部不均勻而造成資料傾斜(被快取的物件大部分集中快取在某一台伺服器上)問題。比如只有 2 臺機器,這 2 臺機器離的很近,那麼順時針第乙個機器節點上將存在大量的資料,第二個機器節點上資料會很少。如下圖所示,d0 機器承載了絕大多數的資料
2.4 虛擬節點解決資料傾斜問題
為了避免出現資料傾斜問題,一致性 hash 演算法引入了虛擬節點的機制,也就是每個機器節點會進行多次雜湊,最終每個機器節點在雜湊環上會有多個虛擬節點存在,使用這種方式來大大削弱甚至避免資料傾斜問題。同時資料定位演算法不變,只是多了一步虛擬節點到實際節點的對映,例如定位到「d1#1」、「d1#2」、「d1#3」三個虛擬節點的資料均定位到 d1 上。這樣就解決了服務節點少時資料傾斜的問題。在實際應用中,通常將虛擬節點數設定為32甚至更大,因此即使很少的服務節點也能做到相對均勻的資料分布。這也是 dubbo 負載均衡中有一種一致性雜湊負載均衡的實現思想。
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...