用hash做快取,假如有三颱伺服器,1,2,3,有三萬張,我想將平均快取到我三颱伺服器上,乙個伺服器大概一萬張,怎麼去實現這個辦法呢,可以用hash來取餘數進行操作,加入我們是以的名字作為key進行hash計算,hash (名稱)%n 其中n為我們伺服器的個數,我們將hash(名稱)這一部分進行計算後得到的是乙個正數,然後除以伺服器的數目進行取餘數,結果將會是0,1,2三個數,對應我們的伺服器的編號,當我們作為客戶端去請求的時候,已經進行過hash運算了,直接找到對應伺服器的編號進行的訪問,這樣解決了我需要遍歷所有的伺服器進行查詢
那如果我快取的伺服器的數量減少或者增加,如果還是按照原來的演算法走,必定會造成快取資料的丟失,會去向後端的伺服器去請求,如果有一台快取伺服器發生了故障,那我原來快取的位置必定會發生改變,原來本該運算後要進行快取到某一台伺服器的,現在找不到對應快取伺服器,肯定會發生快取的雪崩
所以出現了一致性hash演算法
相當於將伺服器和分別hash到我的hash環上進行就近快取,hash環就是對2^32次方進行取模,從0開始一直到2^32,均勻分布在乙個圓環(乙個比方),0的順時針方向的第一位為1,逆時針方向第一位為2^32,大概如下圖
具體就是比方我有三個伺服器a,b ,c對其進行 hash (伺服器aip)%2^32 得出來的一定是乙個整數,而且一定是在0--2^32之間,那麼這個數就會分布在hash環上對應的位置,相同的b,c都一樣,假設我們hash過後abc的位置如下圖
然後我們將需要快取的key進行hash,它的hash值也會分布在我的hash環上,
如上圖,我hash到了a和c之間,的儲存規則是順時針方向的儲存,所以應該儲存到a,如果有四張的話如下圖
那如果我們的hash演算法將伺服器和hash的存放位置比較相近,類似於;
所有的快取都集中儲存到了a一台,只有5到了b,那麼這樣a的壓力就不言而喻,沒有均勻可言了,辛虧hash環可以新增快取伺服器的虛擬節點,類似於虛擬機器,一台實機可以虛擬多台,類似於這樣:
這樣的話就會盡可能的把快取都均衡放在各個伺服器
一致性hash演算法的優勢在哪:
乙個是當我有一台快取節點掛了之後,快取的儲存不會受太大的影響,
我們將b節點拿走,本來要在b節點儲存的3,因為找不到b伺服器,而遵循規則快取到c,而4的快取節點不會發生改變,這就是一致hash的優點,如果發生伺服器的增加或者減少只有部分的快取會失效,不造成全盤皆輸的可能
一致hash到此結束。。。。。。。。
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...
Hash一致性演算法理解
在分布式地環境中,集群中大量機器的重啟,新增新機器,刪除舊的機器是經常發生的事情。如果採用傳統的雜湊演算法將快取對映到機器,即就是採用如下的方法 hash object n上面公式中的object為結果,n為當前集群中機器節點的數目。採用這種方式有什麼缺陷呢?怎麼解決這個問題呢?這就需要hash一致...