假設有n臺redis作為快取,傳統的hash演算法是:ser = hash(k) % n
,即對鍵值雜湊,然後對伺服器的個數取餘,這樣做簡單、而且分布均勻,但是有兩個問題:
- 假設有伺服器x
發生了宕機,那麼此時取餘命中x
是失效的,我們需要對鍵值進行相應的遷移,把伺服器變成n-1臺,但是這樣面臨伺服器一定時間不可用的情況,造成redis雪崩
- 假設容量不夠,我們需要擴容,此時新加入伺服器後,也需要改變為n + 1
,同樣有遷移key造成雪崩的問題。
綜上可知,取餘的雜湊的核心缺陷在於:伺服器變動後,會影響n,造成整體key的遷移
n
變化是造成整體不可用的核心原因,最容易想到的方式是: 讓n=2
32−1n=2^-1
n=232−
1,然後對每個服務的ip或者其它的值進行雜湊取餘,使這些資料分布在0-n的乙個圓環上。之後對key
取餘,然後順時針的對應到相應的伺服器上,如下圖:
在雜湊環上的值,按照順時針方向,去尋找自己的伺服器,這樣就可以找到對應的服務了。
為什麼一致性雜湊可以解決傳統方式的雪崩問題:
假設下面乙個場景,伺服器c崩潰,此時請求c的雜湊值,會落在d上,而請求a、b、d的服務不會發生變化,製造成了1/4的不可用。同樣的,假設加入伺服器x在a和b之間,此時請求b的服務,會有一部分去x上,也是影響了部分的流量。通過一致性雜湊的方式,把影響降到了最小。參考下面兩個圖:
一致性雜湊相對於傳統雜湊來說,最大的缺陷在於服務數量少的時候,可能造成請求不均衡的情況,比如下面這個:
大量的資料都去了節點a,只有少部分資料在節點b上。
緩解方案:
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...