在大型web應用中,快取可算是當今的乙個標準開發配置了。在大規模的快取應用中,應運而生了分布式快取系統。分布式快取系統的基本原理,大家也有所耳聞。key-value如何均勻的分散到集群中?說到此,最常規的方式莫過於hash取模的方式。比如集群中可用機器適量為n,那麼key值為k的的資料請求很簡單的應該路由到hash(k) mod n對應的機器。的確,這種結構是簡單的,也是實用的。但是在一些高速發展的web系統中,這樣的解決方案仍有些缺陷。隨著系統訪問壓力的增長,快取系統不得不通過增加機器節點的方式提高集群的相應速度和資料承載量。增加機器意味著按照hash取模的方式,在增加機器節點的這一時刻,大量的快取命不中,快取資料需要重新建立,甚至是進行整體的快取資料遷移,瞬間會給db帶來極高的系統負載,設定導致db伺服器宕機
。那麼就沒有辦法解決hash取模的方式帶來的詬病嗎?看下文。。。。
一致性雜湊(consistent hashing):
選擇具體的機器節點不在只依賴需要快取資料的key的hash本身了,而是機器節點本身也進行了hash運算。
(1) hash機器節點
首先求出機器節點的hash值(怎麼算機器節點的hash?ip可以作為hash的引數吧。。當然還有其他的方法了),然後將其分布到0~2^32的乙個圓環上(順時針分布)。如下圖所示:
圖 - 1
集群中有機器:a , b, c, d, e五颱機器,通過一定的hash演算法我們將其分布到如圖 - 1所示的環上。
(2)訪問方式
如果有乙個寫入快取的請求,其中key值為k,計算器hash值hash(k),
hash(k)
對應於圖 - 1環中的某乙個點,如果該點對應沒有對映到具體的某乙個機器節點,那麼順時針查詢,直到第一次找到有對映機器的節點,該節點就是確定的目標節點,如果超過了2^32仍然找不到節點,則命中第乙個機器節點。比如
hash(k)
的值介於a~b之間,那麼命中的機器節點應該是b節點(如上圖 - 1)。
(3)增加節點的處理
如上圖 - 1,在原有集群的基礎上欲增加一台機器f,增加過程如下:
計算機器節點的hash值,將機器對映到環中的乙個節點,如下圖:
增加機器節點f之後,訪問策略不改變,依然按照(2)中的方式訪問,此時快取命不中的情況依然不可避免,不能命中的資料是hash(k)在增加節點以前落在c~f之間的資料。儘管依然存在節點增加帶來的命中問題,但是比較傳統的hash取模的方式,一致性hash已經將不命中的資料降到了最低。
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...