首頁 >常見問題 >一致性哈希是什麼

一致性哈希是什麼

hzc
hzc原創
2020-06-29 13:13:432635瀏覽

一致性雜湊演算法在1997年由麻省理工學院提出,是一種特殊的雜湊演算法,目的是解決分散式快取的問題,在移除或添加一個伺服器時,能夠盡可能小地改變已存在的服務請求與處理請求伺服器之間的對應關係。

一致性哈希是什麼

一致性雜湊演算法在1997年由麻省理工學院提出,是一種特殊的雜湊演算法,目的是解決分散式快取的問題。在移除或新增一個伺服器時,能夠盡可能小地改變已存在的服務請求與處理請求伺服器之間的對應關係。一致性雜湊解決了簡單雜湊演算法在分散式雜湊表( Distributed Hash Table,DHT) 中存在的動態伸縮等問題。

簡介:

一致性雜湊演算法是1997年在論文Consistenthashingandrandomtrees中被提出,在分散式系統中應用非常廣泛。一致性雜湊是一種雜湊演算法,簡單地說在移除或添加一個伺服器時,此演算法能夠盡可能小地改變已存在的服務請求與處理請求伺服器之間的映射關係,盡可能滿足單調性的要求。在一般分散式叢集中,服務請求與處理請求伺服器之間可以一一對應,也就是說固定服務請求與處理伺服器之間的對應關係,某個請求由固定的伺服器去處理。這種方式無法對整個系統進行負載平衡,可能會造成某些伺服器過於繁忙以至於無法處理新來的請求。而另一些伺服器則過於空閒,整體系統的資源利用率低,並且當分散式叢集中的某個伺服器宕機,會直接導致某些服務請求無法處理 。

進一步的改進可以利用hash演算法對服務請求與處理伺服器之間的關係進行映射,以達到動態分配的目的。透過hash演算法將服務請求轉換,轉換後的結果將伺服器節點值取模運算,取模後的值就是服務請求對應的請求處理伺服器。這種方法可以應對節點失效的情況,當某個分散式叢集節點宕機,服務請求可以透過hash演算法重新分配到其他可用的伺服器上。避免了無法處理請求的狀況出現 。

但這種方法的缺陷也很明顯,如果伺服器中保存有服務請求對應的數據,那麼如果重新計算請求的hash值,會造成大量的請求被重定位到不同的伺服器而造成請求所要使用的資料失效,這種情況在分散式系統中是非常糟糕的。一個設計良好的分散式系統應該具有良好的單調性,即伺服器的添加與移除不會造成大量的雜湊重定位,而一致性雜湊恰好可以解決這個問題。

一致性雜湊演算法將整個雜湊值空間映射成一個虛擬的圓環,整個哈希空間的取值範圍為0~232-1。整個空間以順時針方向組織。 0~232-1在零點中方向重合。接下來使用以下演算法對服務請求進行映射,將服務請求使用雜湊演算法算出對應的hash值,然後根據hash值的位置沿著圓環順時針查找,第一台遇到的伺服器就是所對應的處理請求伺服器.當增加一台新的伺服器,受影響的資料只是新加入的伺服器到其環空間中前一台的伺服器(也就是順著逆時針方向遇到的第一台伺服器)之間的數據,其他都不會受到影響。綜上所述,一致性雜湊演算法對於節點的增減都只需重定位環空間中的一小部分數據,具有較好的容錯性和可擴展性。

特點:

  • 可擴展性。一致性雜湊演算法保證了增加或減少伺服器時,資料儲存的變更最少,相比傳統雜湊演算法大大節省了資料移動的開銷。

  • 更好地適應資料的快速成長。採用一致性雜湊演算法分佈數據,當數據不斷增長時,部分虛擬節點中可能包含許多數據、造成數據在虛擬節點上分佈不均衡,此時可以將包含數據多的虛擬節點分裂,這種分裂僅僅是將原有的虛擬節點一分為二、不需要將全部的資料重新哈希和劃分。虛擬節點分裂後,如果實體伺服器的負載仍然不均衡,只需在伺服器之間調整部分虛擬節點的儲存分佈。這樣可以隨資料的成長而動態的擴展實體伺服器的數量,且代價遠比傳統哈希演算法重新分佈所有資料要小得多。

#

以上是一致性哈希是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn