分佈式概念:一致性哈希

存儲方案選型時,通常會考慮這三個維度
數據均勻:

(1)不同存儲節點中存儲的數據要儘量均衡,避免讓某一個或某幾個節點存儲壓力過大,而其他節點卻幾乎沒什麼數據。
(2)用戶訪問也要做到均衡,避免出現某一個或某幾個節點的訪問量很大,但其他節點卻無人問津的情況。
數據穩定:
當存儲節點出現故障需要移除或者擴增時,數據按照分佈規則得到的結果應該儘量保持穩定,不要出現大範圍的數據遷移。
節點異構性:
根據不同存儲節點的硬件配置,分配不同權重比例的數據量。

一個好的數據分佈算法,應該爲每個數據映射一組存儲節點,這些節點應該儘量在不同的故障域,比如不同機房、不同機架等。


哈希是指,將數據按照提前規定好的函數(哈希函數)映射到相應的存儲節點。
一致性哈希同樣是採用哈希函數,進行兩步哈希:(1)對存儲節點進行哈希計算,也就是對存儲節點做哈希映射;(2)當對數據進行存儲或訪問時,首先對數據進行映射得到一個結果,然後找到比該結果大的第一個存儲節點,就是該數據應該存儲的地方。

哈希

優點:只要哈希函數設置得當,可以很好地保證數據均勻性缺點:穩定性較差。如,隨着數據量的增加,三個節點的容量無法再滿足存儲需求了,需要再添加一個節點。這時,哈希函數變成了 id%4,原先存儲在那三個節點的數據需要重新計算,然後存入相應節點,即需要大規模的數據遷移,顯然會降低穩定性。

一致性哈希

存儲節點和數據都映射到一個首尾相連的哈希環上,存儲節點可以根據 IP 地址進行哈希數據通常通過順時針方向尋找的方式,來確定自己所屬的存儲節點,即從數據映射在環上的位置開始,順時針方向找到的第一個存儲節點。

示例1:

假設D0~D7 數據按照 ID 進行等值映射,即映射值與 ID 值相等,比如數據 D0 映射到哈希環上的值爲 100,數據 D1 映射到哈希環上的值爲 200······;
假設存儲節點 Node1、Node2 和 Node3 映射到哈希環上的值分別爲 400、600、900。
按照規則,D0,D1,D2 和 D3 順時針方向的下一個存儲節點爲 Node1,因此 ,
Node1 將存儲數據 D0(id = 100)、D1(id = 200)、D2(id = 300)和 D3(id = 400);
Node2 將存取數據 D4(id = 500)和 D5(id = 600),
Node3 將存取數據 D6(id = 700)和D7(id=800)。

當節點加入或退出時,僅影響該節點在哈希環上順時針相鄰的後繼節點。
比如,當 Node2 發生故障需要移除時,由於 Node3 是 Node2 順時針方向的後繼節點,本應存儲到 Node2 的數據就會存儲到 Node3 中,其他節點不會受到影響,因此不會發生大規模的數據遷移。

一致性哈希方法比較適合同類型節點、節點規模會發生變化的場景(Cassandra)。

缺點:即對後繼節點的負載會變大。有節點退出後,該節點的後繼節點需要承擔該節點的所有負載,繼續導致後繼節點故障。

帶有限負載的一致性哈希

給每個存儲節點設置了一個存儲上限值來控制存儲節點添加或移除造成的數據不均勻。當數據按照一致性哈希算法找到相應的存儲節點時,要先判斷該存儲節點是否達到了存儲上限;如果已經達到了上限,則需要繼續尋找該存儲節點順時針方向之後的節點進行存儲。

比較適合同類型節點、節點規模會發生變化的場景(Google Cloud Pub/Sub)。

帶虛擬節點的一致性哈希

根據每個節點的性能,爲每個節點劃分不同數量的虛擬節點,並將這些虛擬節點映射到哈希環中,然後再按照一致性哈希算法進行數據映射和存儲。

示例:

(1)機器性能:Node1 性能最差,Node2 性能一般,Node3 性能最好。以 Node1 的性能作爲參考基準,Node2 是 Node1 的 2 倍,Node3 是 Node1 的 3 倍。
(2)虛擬節點劃分:Node1 對應一個虛擬節點 Node1_1,Node2 對應 2 個虛擬節點 Node2_1 和 Node2_2,Node3 對應 3 個虛擬節點 Node3_1、Node3_2 和 Node3_3。
(3)虛擬節點哈希映射:虛擬節點 Node1_1、Node2_1、Node2_2、Node3_1、Node3_2、Node3_3 的哈希值,分別爲 100、200、300、400、500、600。
(4)數據哈希映射:按照帶虛擬節點的哈希一致性方法, 數據 D0 和 D6 按順時針方向的下一個虛擬存儲節點爲 Node 1-1,因此,
    節點 Node1 將會存儲數據 D0(id = 100)和 D6(id = 700);
    節點 Node2 將會存儲數據 D1(id = 200)和 D2(id = 300),
    節點 Node3 將會存儲數據 D3(id = 400)、D4(id = 500)和 D5(id = 600)。

帶虛擬節點的一致性哈希方法比較適合異構節點、節點規模會發生變化的場景(memcahched)。

優點:解決了節點異構性問題,還提高了系統的穩定性。

缺點:增加了節點規模,從而增加了節點的維護和管理的複雜度。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章