一致性Hash算法通過一個叫作一致性Hash環的數據結構實現Key到服務器的Hash映射。
具體算法過程為:
? ? 構造一個長度為0~2^32的整數環,根據節點名稱的Hash值(其分布范圍同樣為0~2^32)將緩存服務器節點放置在這個Hash環上。根據需要緩存的數據的Key值計算得到其Hash值(其分布范圍同樣為0~2^32),然后在Hash環上順時針查找距離這個Key的Hash值最近的服務器節點,完成Key到服務器的Hash映射查找。
新加入的節點只影響整個環中的一小段。
具體應用中,長度為2^32的一致性Hash環通常使用二叉查找樹實現,Hash查找過程實際上是在二叉查找樹中查找不小于查找數的最小數值。當然這個二叉樹最右邊葉子節點和最左邊的葉子節點相連接,構成環。
缺點:加入新節點的負載壓力比其他節點壓力小。
解決方案:增加一個虛擬層來解決。將每臺物理服務器虛擬為一組虛擬服務器,將虛擬服務器的Hash值放置在Hash環上,Key在環上先找到虛擬服務器節點,再得到物理服務器的信息。
效果:新加入物理服務器節點時,是將一組虛擬節點加入環中,如果虛擬節點的數目足夠多,這組虛擬節點將會影響同樣多數目的已經在環上存在的虛擬節點。新加入一臺服務器將會較為均勻地影響原來集群中已經存在的所有服務器,即分攤原有緩存服務器集群中所有服務器的一小部分負載。
實踐:虛擬節點太多影響性能,太少會導致負載不均衡。一臺物理服務器虛擬為虛擬服務器節點的經驗值為150。
參考資料:
李智慧 大型網站技術架構:核心原理與案例分析