《算法 - 一致性 (hash) 算法》

圖片摘自:算法

  天天進步一點點——五分鐘理解一致性哈希算法(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值就能快速的定位到對應的機器中,這樣就能找到對象真正的存儲位置了。

 

五:問題解答

  - 如何解決單個節點壓力過大的問題?

    - 在 一致哈希算法中,提出了虛擬節點的概念,既一個機器能夠經過 哈希 算法,映射至多個節點。以解決單個節點的壓力問題

相關文章
相關標籤/搜索