1. 程式人生 > >分散式快取負載均衡負載均衡的快取處理:虛擬節點對一致性hash的改進

分散式快取負載均衡負載均衡的快取處理:虛擬節點對一致性hash的改進

採用固定雜湊演算法平衡負載

在大規模的快取應用中,應運而生了分散式快取系統。key-value如何均勻的分散到叢集中?最常規的方式莫過於hash取模的方式。比如叢集中可用機器適量為N,那麼key值為K的的資料請求很簡單的應該路由到hash(K) mod N對應的機器。但是在一些高速發展的web系統中,這樣的解決方案仍有些缺陷。隨著系統訪問壓力的增長,快取系統不得不通過增加機器節點的方式提高叢集的相應速度和資料承載量。增加機器意味著按照hash取模的方式,在增加機器節點的這一時刻,大量的快取命不中,快取資料需要重新建立,甚至是進行整體的快取資料遷移,瞬間會給DB帶來極高的系統負載,設定導致DB伺服器宕機。

如果不是快取資料,而是持久化的資料,那麼當擴容的時候,絕大部分資料都要遷移(取模的基數N變化了),這也是不能忍受的。

一致性雜湊平衡負載

引入一致性雜湊,解決以上增減機器導致負載瞬間整體增大問題

通過在整數範圍內負責各區域的方式,節點負責區域的負載不會隨著增減節點發生大規模的遷移

但是最簡單的一致性雜湊,在增減物理機的時候,似乎要增加一倍節點或減去一半節點才能保證各個節點的負載均衡

虛擬節點對一致性雜湊的改進

對於一致性雜湊的負載分佈不平均問題,所以提出:虛擬節點對一致性雜湊的改進

4個物理節點可以變成很多個虛擬節點,每個虛擬節點支援連續的雜湊環上的一段。而這時如果加入一個物理節點,就會相應加入很多虛擬節點,這些新的虛擬節點是相對均勻地插入到整個雜湊環上,這樣,就可以很好的分擔現有物理節點的壓力了;如果減少一個物理節點,對應的很多虛擬節點就會失效,這樣,就會有很多剩餘的虛擬節點來承擔之前虛擬節點的工作,但是對於物理節點來說,增加的負載相對是均衡的。

所以可以通過一個物理節點對應非常多的虛擬節點,並且同一個物理節點的虛擬節點儘量均勻分佈的方式來解決增加或減少節點時負載不均衡的問題。

至於一個物理節點對應多少的虛擬節點才能達到比較好的均衡效果,有一個圖

x軸表示的是需要為每臺物理伺服器擴充套件的虛擬節點倍數(scale),y軸是實際物理伺服器數,可以看出,當物理伺服器的數量很小時,需要更大的虛擬節點,反之則需要更少的節點,從圖上可以看出,在物理伺服器有10臺時,差不多需要為每臺伺服器增加100~200個虛擬節點才能達到真正的負載均衡。

對映表與規則自定義計算方式

對映表示根據分庫分表字段的值的查表法來確定資料來源的方法,一般用於對熱點資料的特殊處理,或者在一些場景下對不完全符合規律的規則進行補充。

可以通過自定義函式實現來計算最終的分庫,舉例來說,假設根據id取模分成了4個庫,但是對於一些熱點id,我們希望將其獨立到另外的庫,那麼通過類似下面的表示式可以完成:

if (id in  hotset) {
    return nodes;
}
return hash(id);

參考:

http://www.iteye.com/topic/611976

http://www.iteye.com/topic/684087

《大型網站系統與Java中介軟體實踐》

http://blog.csdn.net/sparkliang/article/details/5279393