目錄
一、什么是一致性哈希
二、一致性哈希原理
2.1 hash 環
三、服務器擴容場景?
3.1 服務器增加
3.2 服務器減少
3.3 使用虛擬節點
四、 一致性哈希的使用場景?
一、什么是一致性哈希
一致性哈希是一種哈希算法,用于將數據分布到不同的節點或存儲區域,而保持數據的一致性和均衡性。在分布式系統中,一致性哈希通常用于解決負載均衡和數據分布的問題。
一致性哈希的基本原理是將數據的鍵通過哈希函數映射到一個固定的哈希空間中。然后,將這個哈希空間分布到環形的哈希環上。每個節點或存儲區域在哈希環上占據一個位置,稱為虛擬節點或者物理節點。
當需要存儲或查找數據時,通過哈希函數計算數據的哈希值,并沿著哈希環順時針尋找距離最近的節點。這樣可以實現數據的高效分布和查找,同時也能夠避免節點動態增減時數據重新分布的開銷。
一致性哈希算法的優勢在于其簡單、高效,并且能夠保持數據的均衡性和一致性。在分布式存儲系統、負載均衡器等場景中被廣泛應用。
一致性哈希算法的優點在于:當新增或刪除節點時,只會影響到環上的一小部分節點,因此不會像傳統的哈希算法那樣造成大量的數據遷移和重新分片。同時,由于節點數較多,請求可以被更好地平均分配,從而實現了負載均衡的效果。
另外,一致性哈希算法還可以通過增加虛擬節點來解決節點不均衡的問題,從而進一步提高負載均衡的效果。
例如:有三臺服務器編號node1,node2,node3;有3000萬個key,需要將這3000萬個key均勻的緩存到三臺機器上。
解決方案:取模算法?hash(key)% N
,即:對 key 進行 hash 運算后取模,N 是機器的數量;
這樣對 key 進行 hash 后的結果對 3 取模,得到的結果一定是 0、1 或?2,正好對應服務器node0
、node1
、node2
,存取數據直接找對應的服務器即可。
取模算法雖然使用簡單,而服務器數量 N 發生變化后?hash(key)% N
計算的結果也會隨之變化!
二、一致性哈希原理
一致性哈希算法也是取模算法,與上面的對服務器取模不同的是它是對 2^32 取模。
即:key % (2^32)
2.1 hash 環
這時,通過計算 key%(2^32),看它落到了圓上的哪一點,然后順時針向后走,遇到的第一臺服務器就是它存放的服務器。
A->B弧線上的點都對應->B服務器
B->C弧線上的點都對應->C服務器
C->A弧線上的點都對應 ->A服務器
三、服務器擴容場景?
3.1 服務器增加
受到影響的數據范圍只有 A到D 這條弧線上的數據
3.2 服務器減少
受到影響的數據范圍只有A->B?
3.3 使用虛擬節點
實際應用中,服務器綁定的點可能長這個樣子:
這樣的話容易出現數據偏斜:A服務器承擔壓力太大,B和C服務器性能浪費了。
這時候就要用到虛擬節點技術:我們就給A服務器,設置三個虛擬的分身,B/C也一樣
A->A1 A2 A3
B->B1 B2 B3
C->C1 C2 C3
?
這里只有ABC三臺服務器是真正存在的,所以數據如果順時針遇到的是A的分身服務器,則直接存儲到A上。
同理,B的分身,存儲到B服務器上
同理,C的分身,存儲到C服務器上
四、 一致性哈希的使用場景?
一致性哈希是一種在分布式系統中常用的技術,其使用場景包括但不限于以下幾個方面:
-
負載均衡:一致性哈希可以用于負載均衡,將請求均勻地分布到多個服務器上,避免出現某些服務器負載過重的情況。
-
緩存分布:在分布式緩存系統中,一致性哈希可以用來確定將數據存儲在哪個節點上,從而提高緩存命中率和整體性能。
-
分布式存儲:一致性哈希可用于分布式存儲系統中,確定數據存儲在哪個節點上,提高數據的訪問速度和可靠性。
-
容錯性:當系統中的節點出現故障或新增節點時,一致性哈希可以幫助系統快速地重新分配數據,提高系統的容錯性和可擴展性。
-
P2P 網絡:在對等網絡(P2P)中,一致性哈希可以幫助節點發現其他節點的位置并快速建立連接。
總的來說,一致性哈希在分布式系統中起到了路由和數據分布的作用,能夠提高系統的性能和可靠性。