1. 程式人生 > 其它 >ADAMoracle預言機為你的資料安全護航

ADAMoracle預言機為你的資料安全護航

一致性雜湊環

傳統的hash演算法在節點數量變化的時候會出現對映關係前後不一致的現象,如果每個節點提供的服務不一致,對映關係的改變將是致命的,比如無法找到已經映射了的資料。以雜湊取模演算法為例子,其公式是:node_index = hash(key) % N 。

節點減少的前後對比:對於新的key來說,對映沒有問題,但是對於舊的key來說,對映關係發生了變化,本來如果hash(key)==3,那麼會對映到編號為0的節點上,節點數量變化之後,卻將對映到編號為1的節點上。這時去1節點取資料將訪問不到,出現錯誤,對於分散式快取系統而言,可能出現“快取雪崩”。節點增加的情況同理。這成為簡單雜湊演算法在分散式雜湊表中存在的動態伸縮問題。

要解決對映不一致的問題,直觀的方法是通過重新分配已有的key來迎合新的對映關係,但這代價昂貴。更好的方法是使用一致性雜湊演算法。

一致性雜湊演算法是一種特殊的雜湊演算法,在移除或者新增一個伺服器的時候能夠儘可能小地改變已經存在的服務請求和處理請求的伺服器之間的對映關係。

一致性雜湊演算法通過一個叫作一致性雜湊環的資料結構實現,一致性雜湊環的主要思想是減少需要移動的已對映資料。原先的mod函式將key對映到一個特定的值上,並且為這個值提供一個伺服器,一致性雜湊演算法首先將key對映到一個很大的範圍內,並且為每個範圍內的值提供一個伺服器。如果負責某一範圍的資料的伺服器被刪除,其上儲存的資料將順時針遷移到下一臺伺服器上,下一臺伺服器將負責對映到這兩個連續範圍內請求的處理。增加節點同理進行資料遷移。通過這種方式,節點數量發生變化時也不會改變其他範圍的資料對映關係,儘可能地減少了需要遷移的資料數量。

如圖所示,橙色節點表示資料對映到的環上的位置,藍色節點表示伺服器。初始時刻K1和K2由B伺服器負責,如果B伺服器被刪除,K1和K2將遷移到C伺服器上。

當然,這種方法也存在問題。當刪除了一系列連續的節點之後,這些被刪除節點的負載將交由環上的下一臺機器統一處理。這臺機器將承載大量的負載,可能因此崩潰,由此迴圈下去,造成雪崩,整個叢集最後可能完全崩潰。

為了解決這一問題,引入虛擬節點的概念。資料的儲存首先根據對映關係在環上找到對應的虛擬節點,每個虛擬節點都會關聯到一個真實節點。例如下圖中的A1、A2關聯到真實節點A,資料都在A上儲存,B1、B2關聯到真實節點B,資料都在B上儲存。由於節點數量很多,分佈均勻,即使在連續範圍內有機器崩潰,也不會給同一臺機器增加負載,因此不容易造成雪崩。

【參考】
https://segmentfault.com/a/1190000021199728

https://zhuanlan.zhihu.com/p/379724672