一致性哈希最早是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ù)對象要落地的位置了。

比如這個數(shù)據(jù)最終會落到Server C上面去,每次讀取數(shù)據(jù)也通過同樣的方式來尋找圖片的位置。
在以上的例子中。假設出現(xiàn)三個數(shù)據(jù):
- Data1
- Data2
- Data3
Data1存在Server A上,Data2存在Server B上,Data3存在Server C上。

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

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

光光以上這樣還不夠,如果每臺服務器僅有一個節(jié)點,數(shù)據(jù)很容易堆積到一臺服務器上。
這個時候可以通過添加虛擬節(jié)點來解決這個問題,我們將一臺服務器做出多個映射值。這樣可以在環(huán)形上,讓服務器分布地更加均勻一些。

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