圖片摘自:算法
天天進步一點點——五分鐘理解一致性哈希算法(consistent hashing)緩存
一:背景服務器
- 一致性哈希算法在1997年由麻省理工學院的Karger等人在解決分佈式Cache中提出的。分佈式
- 設計目標是爲了解決因特網中的熱點(Hot spot)問題。函數
- 一致性哈希修正了使用的簡單哈希算法帶來的問題。性能
二:簡單哈希算法帶來的問題?spa
- 在簡單哈希算法中.net
- 咱們會根據hash算法得出的數值和機器數取模計算,計算髮到哪臺機器上。設計
- Hash(資源)% 機器數 = 落到哪臺機器上xml
- 這樣的話就不會遍歷全部的服務器,大大提高了性能!
- 可是,在服務器數量變更的時候,全部緩存的位置都要發生改變!
- 假設4臺緩存中忽然有一臺緩存服務器出現了故障,沒法進行緩存。
- 那麼咱們則須要將故障機器移除,可是若是移除了一臺緩存服務器,那麼緩存服務器數量從4臺變爲3。
- 若是想要訪問資源,資源的緩存位置一定會發生改變,之前資源緩存也會失去緩存的做用與意義。
- 同時因爲大量緩存在同一時間失效,形成了緩存的雪崩,服務端也會承受巨大壓力。
三:一致性哈希(hash)解決的問題
- 解決增減服務器致使的大量數據震盪問題。
四:一致性哈希(hash)
- 原理
- 創造環形哈希(hash)空間,不一樣節點映射到環上的不一樣位置,經過和機器節點的匹配,完成hash一致。
- 作法
- 按照經常使用的hash算法來將對應的key哈希到一個具備2^32次方個桶的空間中,即0~(2^32)-1的數字空間中。 能夠將這些數字頭尾相連,想象成一個閉合的環形。
-
- 如今咱們將object一、object二、object三、object4四個對象經過特定的Hash函數計算出對應的key值,而後散列到Hash環上。
-
- 在採用一致性哈希算法的分佈式集羣中將新的機器加入。
- 其原理是經過使用與對象存儲同樣的Hash算法將機器也映射到環中,而後以順時針的方向計算,將全部對象存儲到離本身最近的機器中。
-
- 經過上圖能夠看出對象與機器處於同一哈希空間中,這樣按順時針轉動object1存儲到了節點1中
- object3存儲到了節點2中
- object二、object4存儲到了節點3中。
- 在這樣的部署環境中,hash環是不會變動的,所以,經過算出對象的hash值就能快速的定位到對應的機器中,這樣就能找到對象真正的存儲位置了。
五:問題解答
- 如何解決單個節點壓力過大的問題?
- 在 一致哈希算法中,提出了虛擬節點的概念,既一個機器能夠經過 哈希 算法,映射至多個節點。以解決單個節點的壓力問題