一致性哈希
文章目錄
- 一致性哈希
- 前言
- 一、基本概念/原理
- 二、優勢
- 1.服務器故障宕機節點減少
- 2.擴容/動態添加服務器
- 三、存在問題及解決方案
- 1.哈希環偏斜
- 2.新增節點資料命中問題
- 四、應用場景
- 總結
前言
本文主要講明一致性哈希的 原理,優點,新問題及解決,應用場景,
一、基本概念/原理
一致性哈希演算法也是使用取模的方法,只不過是對232取模,然后將232個點均勻的散列在一個圓上,這個圓環叫做哈希環,
可以參考下圖,正上方的點代表0,順時針方向為0,1,2,3…232-1 ,

結合實際問題解釋:
有三臺快取服務器,需要將資訊均勻的放到三臺快取服務器中,
1、對三臺機器的ip進行哈希計算后對232取模,計算出的結果是一個0到232-1之間的一個整數,這樣三臺機器就映射到了這個環上,(圖例為理想情況)

2、將要存的資訊同樣映射放置到哈希環上,對資訊的key進行hash計算后對232進行取模,計算出來的數值對應hash環上的位置如下圖橙點所示,按照順時針方向找到第一個服務器是A服務器,那么就會把資訊放到A服務器中,

通過這種方法,判斷一個資源應該被快取到哪臺服務器上,將快取服務器與被快取資源都映射到hash環上以后,從被快取資源的位置出發,沿順時針方向遇到的第一個服務器,就是當前資源將要快取在上面的服務器,由于被快取資源與服務器hash后的值是固定的,所以,在服務器不變的情況下,一個資源必定會被快取到固定的服務器上,下次想要訪問這個資源時,只要再次使用相同的演算法進行計算,即可算出這個資源被快取在哪個服務器上,直接去對應的服務器查找對應的資源就可以了,
二、優勢
1.服務器故障宕機節點減少
結合上面三臺服務器來說,如果B服務器出現了故障,那么B服務器會從Hash環上移除,如下圖所示,原先的資源3是放在B服務器的,現在B宕機移除后,資源3的位置會發生變化,會放到C機器中,但是其他的資源位置不會發生變動,
一致性hash優點:如果使用之前的hash演算法,服務器數量發生改變時,所有服務器的所有快取在同一時間失效需要重新計算快取拉取,而使用一致性哈希演算法時,服務器的數量如果發生改變,并不是所有快取都會失效,而是只有部分快取會失效,前端的快取仍然能分擔整個系統的壓力,而不至于所有壓力都在同一時間集中到后端服務器上,

2.擴容/動態添加服務器
當我們發現三臺機器壓力過大需要增加機器時,對新加的機器D進行hash計算后對 232取模映射放置到hash環上,如下圖所示,此時只會影響資源2所存的位置,而不會影響其他的資源,

三、存在問題及解決方案
1.哈希環偏斜
問題:
在上面hash環上的服務器分布是極其理想化的,在實際情況中可能會出現下圖情況,這樣的話,1,2,3,4,6號資源均被快取在了服務器A上,5號資源被快取在了服務器B上,服務器C上沒有快取任何資源,三臺服務器并沒有被合理的平均的充分利用,如果此時服務器A出現故障,那么失效快取的數量也將達到最大值,在極端情況下,仍然有可能引起系統的崩潰,這種情況為hash環的偏斜,

解決方案:
可以通過虛擬節點來解決偏斜問題,將現在已有的三臺真實的物理服務器節點通過虛擬的方法復制出來,這些節點為虛擬節點,“虛擬節點"是"實際節點”(實際的物理服務器)在hash環上的復制品,一個實際節點可以對應多個虛擬節點,
如下圖所示ABC三臺機器分別虛擬出了一個虛擬節點,也可以虛擬出更多的虛擬節點,這樣快取的分布就會剛加均衡,虛擬節點越多,hash環上的節點就越多,快取被均勻分布的概率就越大,

2.新增節點資料命中問題
問題:
當需要新增服務器時,讀取資源的時候,會造成一小部分資源無法直接命中,在新增的服務器上獲取資源但新增的服務器中并沒有該資源,這個時候會穿透到資料庫(或持久性服務器)中先取回資源放到新增機器上后再給服務回傳需要的資源,
解決方案:
可以分為兩階段,如果拉取的資源沒有在離自己最近的服務器上,那么首先去離自己第二近的服務器上拉取資源,然后異步將資源再快取到最近的服務器上,
四、應用場景
1、最主要用的場景是redis中多節點集群的負載中,
2、如果像是圖片等資源存的位置是自己管理的集群,可以使用該方式進行負載,一是避免集群中服務器數量發生變化的時候,會發生大量拉取圖片的請求無法直接命中而引起的雪崩,導致整體系統壓力過大而崩潰;二是如果使用的是其他的負載均衡方式,可能會導致幾乎所有的圖片資源位置發生變動,在此期間系統可用性會變差,
3、集群經常需要變動時負載均衡方式可以采用該種方式,動態擴容,宕機等,
總結
本文主要依據實際場景來講明了一致性hash的原理
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/253598.html
標籤:其他
