做一致性hash算法時發現虛擬節點是個好東西,但同時也有缺點,需要結合場景使用。
此處不做詳細排版和鋪墊,不了解一致性hash的可以先去查查,此處僅做拋磚引玉。
虛擬節點的存在可以使hash環中的節點命中率變的均衡。
虛擬節點越多,分布越均勻。
但會帶來數據犧牲,真實節點增加或者減少時
由於虛擬節點數量劇烈變化,數據的重新分配可能會影響到更多的真實節點。
因為有可能所有虛擬節點的下一個節點列表覆蓋了其他所有真實節點。
所以,如果key與服務無關,可以適當調大這個值,達到良好的均衡效果
服務真實節點較多、數量變化頻繁時,適當減少或者不設置,以減少數據遷移帶來的影響,提高系統整體的可用性
可參考下圖--圖片來源

具體做法
當服務掛掉時,刷新 hash環,以適應新的環境
數據遷移
服務掛掉時,數據丟失,新數據走到下一個節點。
服務增加或恢復時,將新服務的每個虛擬節點的下一個節點中的數據遍歷一遍,進行遷移,其他節點不受影響
總結
虛擬節點越多 在服務增加或恢復時,涉及數據遷移的真實節點就越多。有數據遷移場景需求的話需要考慮這一點。
