1. 程式人生 > >大型分散式網站的分散式快取

大型分散式網站的分散式快取

高併發環境下,大量的讀寫請求湧向資料庫,磁碟的處理速度與記憶體顯然不在一個量級,從減輕資料庫的壓力和提高系統響應速度兩個角度來考慮,一般都會在資料庫之前加一層快取。由於單臺機器的記憶體資源以及承載能力有限,並且,如果大量使用本地快取,也會使相同的資料被不同的節點儲存多份,對記憶體資源造成較大的浪費,因此,才催生出了分散式快取。


Memcache

memcache是一款開源的高效能的分散式記憶體物件快取系統,用於在應用中減少對資料庫的訪問,提高應用的訪問速度,並降低資料庫的負載。為了在記憶體中提供資料的高速查詢能力,memcache使用key-value的形式儲存和訪問資料,在記憶體中維護一張巨大的HashTable,使得對資料查詢的時間複雜度降低到O(1),保證了對資料的高效能訪問。記憶體的空間總是有限的,當記憶體沒有更多的空間來儲存新的資料時,memcache就會使用LRU(LeastRecently Used)演算法,將最近不常訪問的資料淘汰掉,以騰出空間來存放新的資料。

memcache儲存支援的資料格式也是靈活多樣的,通過物件的序列化機制,可以將更高層抽象的物件轉

換成為二進位制資料,儲存在快取伺服器中,當前端應用需要時,又可以通過二進位制內容反序列化,將

資料還原成原有物件。

快取的分散式架構

memcache本身並不是一種分散式的快取系統,它的分散式,是由訪問它的客戶端來實現的。一種比較簡單的實現方式是根據快取的key來進行hash,當後端有N臺快取伺服器時,訪問的伺服器為hash(key)%N,這樣可以將前端的請求均衡的對映到後端的快取伺服器,如圖所示,但是,這樣也會導致一個問題,一旦後端某臺快取伺服器宕機,或者是由於叢集壓力過大,需要新增新的快取伺服器,大部分的key將會重新分佈,對於高併發系統來說,這可能會演變成一場災難,所有的請求將如洪水般瘋狂的湧向後端的資料庫伺服器,而資料庫伺服器的不可用,將會導致整個應用的不可用,形成所謂的“雪崩效應”

一致性hash演算法

consistenthash演算法能夠在一定程度上改善快取的雪崩問題,它能夠在移除/新增一臺緩

存伺服器時,儘可能小的改變已存在的key對映關係,避免大量key的重新對映。


分散式session

傳統的應用伺服器,如tomcat、jboss等等,其自身所實現的session管理大部分都是基於單機的,對於大型分散式網站來說,支撐其業務的遠遠不止是一臺伺服器,而是一個分散式集群,請求在不同伺服器之間跳轉,需要保持伺服器之間的session同步。傳統網站一般通過將一部分資料儲存在cookie中,來規避分散式環境下session的操作,這樣做弊端很多,一方面cookie的安全性一直廣為詬病,並且,cookie儲存資料的大小是有限制的,隨著移動網際網路

的發展,很多情況下還得兼顧移動端的session需求,使得采用cookie來進行session同步的方式弊端更為凸顯。分散式session正是在這種情況下應運而生的。

一種分散式session解決方案

前端使用者請求經過隨機分發之後,可能會命中後端任意的webserver,並且,webserver也可能會因為各種不確定的原因宕機,這種情況下,session是很難在叢集間同步的,而通過將session以sessionid作為key,儲存到後端的快取叢集中,使得不管請求如何分配,即便是webserver宕機,也不會影響其他的web server通過sessionid從cacheserver中獲得session,這樣,即實現了叢集間的session同步,又提高了webserver的容錯性。

快取的容災

業務強依賴快取,快取需做到容災:

1.雙機房相互備份

2.資料複製多份,單臺快取失效,叢集間能夠自動複製和備份

3.資料庫留有餘量

4.萬兆網絡卡