每添加或者移除一個新的節點,只有相鄰的那個節點會受到影響,因此,一致性哈希解決了節點變化引起的數據重新分佈問題。
Cassandra1.2以前採用的是這種標準的一致性哈希算法:爲每個節點分配一個token,根據這個token值來決定節點在集羣中的位置以及這個節點所存儲的數據範圍。
由於這種方式會造成數據分佈不均的問題,在Cassandra1.2以後採用了虛擬節點的思想:不需要爲每個節點分配token,把圓環分成更多部分,讓每個節點負責多個部分的數據,這樣一個節點移除後,它所負責的多個token會託管給多個節點處理,這種思想解決了數據分佈不均的問題。
如圖所示,上面部分是標準一致性哈希,每個節點負責圓環中連續的一段,如果Node2突然down掉,Node2負責的數據託管給Node1,即Node1負責EFAB四段,如果Node1裏面有很多熱點用戶產生的數據導致Node1已經有點撐不住了,恰巧B也是熱點用戶產生的數據,這樣一來Node1可能會追隨Node2而去,Node1去了,Node6還hold住嗎?
下面部分是虛擬節點實現,每個節點不再負責連續部分,且圓環被分爲更多的部分。如果Node2突然down掉,Node2負責的數據不全是託管給Node1,而是託管給多個節點。而且也保持了一致性哈希的特點。