首先我們可以看看為什麼需要一致性雜湊演算法。
假設我們有3臺redis快取伺服器,編號為0,1,2.現在我們想將3萬張均勻的快取存到這3臺伺服器上。因為不想在快取中找某張時去遍歷3臺伺服器,所以我們原始的做法是對快取項的鍵進行雜湊,將雜湊後的結果對伺服器的數量進行取模操作。
hash(名稱) % 3
這樣當我們訪問任意一張圖時,就能快速的找出該被快取在哪個伺服器上
但是當我們需要增加伺服器,或者乙個快取伺服器突然出現故障時,伺服器的數量就改變了,這麼取餘的結果肯定會發生變化。這樣帶來的後果就是所有快取的位置都會發生變化,造成快取的崩潰,引起整體體統壓力過大崩潰。
這時候就引入了一致性雜湊演算法。
一致性雜湊也是使用取模的方法,只不過是對2^32取模。
我們把2的32次方想象成乙個圓,和鐘錶一樣,如圖
正上方的點代表成0,一直到2^32-1. 這個環就是hash環。
然後我們三颱伺服器的ip位址進行雜湊計算,再對2^32取模,對映到環上。
hash(伺服器a的ip位址) % 2^32
hash(伺服器b的ip位址) % 2^32
hash(伺服器c的ip位址) % 2^32
我們再將4張也通過同樣的方法對映到雜湊環上
hash(1的名字) % 2^32
hash(2的名字) % 2^32
hash(3的名字) % 2^32
hash(4的名字) % 2^32
然後通過順時針方向,遇到的第乙個伺服器就將快取到伺服器上
1、2快取到a ,3快取到b,4快取到c。
假設伺服器b出現了問題
那麼只有3改變然後就會被快取到c中,之前如果一台伺服器故障,所有的快取都會失效,而使用一致性雜湊演算法,只有部分的(3)快取會失效。
但是現實中可能會出現這樣的問題,1、2、3、4、6號全部被快取到了同乙個伺服器上,這樣資源分布是極度不均勻的。
虛擬節點
只要讓伺服器的數量更多,雜湊環就會更均勻。但真正的伺服器資源只有3臺,該怎麼辦呢?
我們只能將現有的物理節點通過虛擬的方式複製出來。這些被複製出來的節點就是「虛擬節點」。
創造出虛擬節點之後,快取的分布就均勻多了。hash環上的節點越多,均勻分布的概率越大。
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...