我們對同乙個名稱做相同的雜湊計算時,得出的結果應該是不變的,如果我們有3臺伺服器,使用雜湊後的結果對3求餘,那麼餘數一定是0、1或者2,正好與我們之前的伺服器編號相同,如果求餘的結果為0, 我們就把當前名稱對應的快取在0號伺服器上,如果餘數為1,就把當前名對應的快取在1號伺服器上,如果餘數為2,同理,那麼,當我們訪問任意乙個的時候,只要再次對名稱進行上述運算,即可得出對應的應該存放在哪一台快取伺服器上,我們只要在這一台伺服器上查詢即可,如果在對應的伺服器上不存在,則證明對應的沒有被快取,也不用再去遍歷其他快取伺服器了,通過這樣的方法,即可將3萬張隨機的分布到3臺快取伺服器上了,而且下次訪問某張時,直接能夠判斷出該應該存在於哪台快取伺服器上,這樣就能滿足我們的需求了,我們暫時稱上述演算法為hash演算法或者取模演算法,取模演算法的過程可以用下圖
hash演算法的缺點:
這種情況帶來的結果就是當伺服器數量變動時,所有快取的位置都要發生改變 當伺服器數量發生改變時,所有快取在一定時間內是失效的
當快取伺服器數量發生變化時,會引起快取的雪崩,可能會引起整體系統壓力過大而崩潰(大量快取同一時間失效)
一致性雜湊演算法也是使用取模的方法 hash演算法的取模法是對伺服器的數量進行取模,而一致性雜湊演算法是對2^32取模
hash(伺服器a的ip位址) % 2^32
hash(伺服器b的ip位址) % 2^32
hash(伺服器c的ip位址) % 2^32
我們需要使用快取伺服器快取,而且我們仍然使用的名稱作為找到的key,那麼我們使用如下公式可以將對映到上圖中的hash環上
hash(名稱) % 2^32
伺服器與都被對映到了hash環上,到底應該被快取到哪一台伺服器上呢?將會被快取到從的位置開始,沿順時針方向遇到的第乙個伺服器就是a伺服器,所以, 將會被快取到伺服器a上 如下圖:
使用hash演算法,伺服器數量發生改變時,所有伺服器的所有快取在同一時間失效了,而使用一致性雜湊演算法時,伺服器的數量如果發生改變,並不是所有快取都會失效,而是只有部分快取會失效,前端的快取仍然能分擔整個系統的壓力,而不至於所有壓力都在同一時間集中到後端伺服器上.
1號、2號、3號、4號、6號均被快取在了伺服器a上 只有5號被快取在了伺服器b上 伺服器c上甚至沒有快取任何 如果出現上圖中的情況,a、b、c三颱伺服器並沒有被合理的平均的充分利用,快取分布的極度不均勻,而且,如果此時伺服器a出現故障,那麼失效快取的數量也將達到最大值,在極端情況下,仍然有可能引起系統的崩潰,上圖中的情況則被稱之為hash環的偏斜 我們應該怎樣防止hash環的偏斜
每乙個服務節點計算多個雜湊,每個計算結果位置都放置乙個此服務節點,稱為虛擬節點。具體做法可以在伺服器ip或主機名的後面增加編號來實現.可以為每台伺服器計算三個虛擬節點,於是可以分別計算 「node a#1」、「node a#2」、「node a#3」、「node b#1」、「node b#2」、「node b#3」的雜湊值,於是形成六個虛擬節點:
從上圖可以看出,a、b、c三颱伺服器分別虛擬出了乙個虛擬節點,當然,如果你需要,也可以虛擬出更多的虛擬節點。引入虛擬節點的概念後,快取的分布就均衡多了,上圖中,1號、3號被快取在伺服器a中,5號、4號被快取在伺服器b中,6號、2號被快取在伺服器c中,當然可以虛擬出更多的虛擬節點,以便減小hash環偏斜所帶來的影響,虛擬節點越多,hash環上的節點就越多,快取被均勻分布的概率就越大。
Hash和一致性Hash演算法
hash hash無論是資料結構還是分布式快取,都有應用。hash更確切的說是hash函式,是乙個集合的資料到另乙個集合內資料的乙個對映。被對映方在數學裡面叫做原象,這裡我們叫做資料,對映到的叫象,這裡我們稱作槽。分布式快取伺服器和應用伺服器的區別在於,應用伺服器中的所有伺服器都部署著相同的應用,而...
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...