一致性哈希

一致性哈希最早是1997年在麻省理工大學提出的一種解決熱點問題的算法。后來在分布式環(huán)境被廣泛使用。

試想如果我們的服務產生大量數(shù)據(jù),這些數(shù)據(jù)的存取如果只是單臺服務器,那么肯定會出現(xiàn)一定的性能瓶頸,所以我們需要多臺數(shù)據(jù)庫來支撐業(yè)務。

而在分布式的環(huán)境中,數(shù)據(jù)的分布需要解決以下幾個問題:

  • 數(shù)據(jù)服務器發(fā)生故障的時候,整體不會受到影響
  • 服務器擴容時,
  • 數(shù)據(jù)分布不均勻

而一致性哈希很好地解決了這些問題,它的核心思想是設置一個2^32次方個空間的環(huán)形空間,然后分成幾個區(qū)域,數(shù)據(jù)哈希值所在的指定區(qū)域就會決定數(shù)據(jù)的落地位置(也就是落到哪一臺服務器上面)。

這里假設我們有三臺服務器:

  • Server A
  • Server B
  • Server C

將機器通過特定的Hash函數(shù)算出對應的key值,然后將這些標記值散列在這個環(huán)形空間上。

這個時候將一個數(shù)據(jù)(Data)對象使用同樣的Hash函數(shù)算出對應的key值,并將這些值也標記在環(huán)形空間上。按順時針方向去找最近的服務器對應key標記,這臺服務器就是這個數(shù)據(jù)對象要落地的位置了。

環(huán)形空間

比如這個數(shù)據(jù)最終會落到Server C上面去,每次讀取數(shù)據(jù)也通過同樣的方式來尋找圖片的位置。

在以上的例子中。假設出現(xiàn)三個數(shù)據(jù):

  • Data1
  • Data2
  • Data3

Data1存在Server A上,Data2存在Server B上,Data3存在Server C上。

數(shù)據(jù)定位到對應的數(shù)據(jù)庫上

Server A宕機了,那么這個時候可能無法查詢到數(shù)據(jù)Data1了。但是并不妨礙數(shù)據(jù)Data2Data3的查詢。

`Server A`宕機

如果這個時候出現(xiàn)了Server D,Data3通過上面的方式,就會查詢到Server D上,而這臺新的服務器上并沒有數(shù)據(jù)。我們可以改進一下,如果當前的位置查不到數(shù)據(jù),可以順延去下一個節(jié)點(也就是Server C)上查找數(shù)據(jù)。

新增一臺新的服務器

光光以上這樣還不夠,如果每臺服務器僅有一個節(jié)點,數(shù)據(jù)很容易堆積到一臺服務器上。

這個時候可以通過添加虛擬節(jié)點來解決這個問題,我們將一臺服務器做出多個映射值。這樣可以在環(huán)形上,讓服務器分布地更加均勻一些。

使用虛擬節(jié)點,平衡節(jié)點

通過一致性哈希算法,數(shù)據(jù)很好地被存到的不同的機器上,分攤了單機服務器的壓力。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容