大型網站技術架構,6網站的伸縮性架構之分佈式緩存集羣的伸縮性設計

和全部服務器都部署相同應用的應用服務器集羣不一樣,分佈式緩存服務器集羣中不一樣的服務器中緩存的數據各不相同,緩存訪問請求不能夠在緩存服務器集羣中的任意一臺處理,必須先找到緩存有須要數據的服務器,而後才能訪問。算法

 

這個特色制約了分佈式緩存集羣的伸縮性設計,由於新上線的緩存服務器沒有緩存任何數據,而已下線的緩存服務器還緩存這網站的許多熱點數據。數據庫

 

必須讓新上線的緩存服務器對整個分佈式緩存集羣影響最小,也就是說新加入的緩存服務器應使整個緩存服務器集羣中已經緩存的數據儘量還被訪問到,這是分佈式緩存集羣伸縮性設計的最主要目標緩存

 

6.3.1 Memcached分佈式緩存集羣的訪問模型

 以Memcached爲表明的分佈式緩存,訪問模型以下圖所示:服務器

 

 

 應用程序經過Memcached客戶端訪問Memcached服務器集羣,網絡

Memcached客戶端由一組API、Memcached服務器集羣路由算法、Memcached服務器集羣列表及通訊模塊構成。數據結構

 

其中路由算法負責根據應用程序輸入的緩存KEY計算獲得應該將數據寫入到Memcache的哪臺服務器(寫緩存)或者應該從哪臺服務器讀數據(讀緩存)。架構

 

緩存寫入流程:負載均衡

 

緩存讀取流程:分佈式

 

6.3.2 Memcached分佈式緩存集羣的伸縮性挑戰

餘數Hash:用服務器數據除以緩存數據Key的Hash值,餘數爲服務器列表下標編號。網站

因爲HashCode具備隨機性,所以使用餘數Hash路由算法能夠保證緩存數據在整個Memcached服務器集羣中比較均衡地分佈。

 

若是不考慮緩存服務器集羣伸縮性,能夠知足絕大多數地緩存路由需求。

可是,當分佈式緩存集羣須要擴容的時候,事情就變得棘手了。

 

擴容的時候,集羣規模越大,不能命中的機率越高。當100臺服務器的集羣中加入一臺新服務器,不能命中的機率使99%(N/(N+1))。

 

而網站業務中的大部分讀操做是經過緩存獲取的,數據庫的負載能力是以有緩存爲前提而設計的。當大部分被緩存的數據不能正確讀取時,會致使數據庫壓力猛增,甚至宕機(而這個狀況宕機,還沒法經過簡單的重啓數據庫解決,網站須要較長時間才能逐漸恢復正常,詳見第13章。)

 

6.3.3 分佈式緩存的一致性Hash算法

一致性Hash算法經過一個叫做一致性Hash環的數據結構實現KEY到緩存服務器的Hash映射,以下圖所示:

 

 

 具體算法過程:

先構造一個長度爲2^32的整數Hash環,根據節點名稱的Hash值(其分佈範圍一樣爲0~2^32-1)將緩存服務器節點放置在這個Hash環上。

而後根據須要緩存的數據的KEY的Hash值取餘2^32,獲得0~2^32-1這個範圍之間的一個整數值,而後在Hash環上順時針查找距離這個KEY的hash值最近的緩存服務器節點。

 

當緩存服務器集羣須要擴容的時候,只須要將新加入的節點名稱(NODE3)的Hash值放入一致性Hash環中,因爲KEY是順時針查找距離其最近的節點,所以新加入的節點隻影響整個環中的一小段。

 

具體應用中,這個長度爲2^32的一致性Hash環一般使用二叉查找樹實現,Hash查找過程其實是在二叉查找樹中查找不小於查找數的最小數值。固然這個二叉查找樹的最右邊葉子節點和最左邊的葉子節點相鏈接,構成環。

 

hash傾斜

上面的一致性Hash算法存在hash傾斜的問題,即當服務器節點在環中不均勻的位置上時,位置是傾斜的,服務器節點集中的較近,環的大部分圓弧上沒有被映射到服務器節點。

這種狀況大部分的緩存對象會落到其中某臺服務器上,致使緩存分佈不均勻。因爲緩存較多的服務器壓力較大,易發生故障,一旦宕機,失效的緩存太多,大部分緩存請求又會落到其下一個節點,極端狀況會致使系統崩潰。

 

計算機的任何問題均可以經過增長一個虛擬層來解決。計算機網絡的7層協議,每層均可以看做是下一層的虛擬層;計算機操做系統能夠看做是計算機硬件的虛擬層;Java虛擬機能夠看做是操做系統的虛擬層;分層的計算機軟件架構事實上也是利用虛擬層的概念。

 

解決一致性Hash算法帶來的負載不均的問題,也可使用虛擬層的手段:

將每臺物理緩存服務器虛擬爲一組虛擬緩存服務器,將虛擬服務器的hash值放置在hash環上,key在環上先找到虛擬服務器節點,再獲得物理服務器的信息。

 

新加入物理服務器節點時,是將一組虛擬節點加入環中,若是虛擬節點的數目足夠多,這組虛擬節點將會影響一樣多數目的已經在環上存在的虛擬節點,這些已經存在的虛擬節點又對應不一樣的物理節點。最終的結果是:新加入一臺緩存服務器,將會較均勻地影響原來集羣中已經存在的全部服務器,也就是說分攤原有緩存服務器集羣中全部服務器地一小部分負載。

 

 

 每一個物理節點對應的虛擬節點越多,各個物理節點之間的負載越均衡,新加入服務器對原有的物理服務器的影響越保持一致。

實踐中,一臺物理服務器能夠虛擬爲150個虛擬服務器節點,固然根據集羣規模和負載均衡的精度需求,這個值應該根據具體狀況具體對待。

 

 總結

本節主要講解了分佈式緩存伸縮性設計利器:一致性Hash算法。必須對這個算法理解和掌握。

相關文章
相關標籤/搜索