在高併發環境下,大量的讀、寫請求涌向數據庫,此時磁盤IO將成爲瓶頸,從而致使太高的響應延遲,所以緩存應運而生。不管是單機緩存仍是分佈式緩存都有其適應場景和優缺點,當今存在的緩存產品也是數不勝數,最多見的有redis和memcached等,既然是分佈式,那麼他們是怎麼實現分佈式的呢?本文主要介紹分佈式緩存服務mencached的分佈式實現原理。node
什麼是緩存,咱們先看看計算機體系結構中的存儲體系,根據馮·諾依曼計算機體系結構模型,計算機分爲五大部分:運算器、控制器、存儲器、輸入設備、輸出設備。結合現代計算機,CPU包含運算器和控制器兩個部分,CPU負責計算,其須要的數據由存儲提供,存儲分爲幾個級別,就拿我當前的PC舉個例子,個人機器存儲清單以下:redis
除了上述部分,還有CPU內的寄存器,固然有的計算機還有一級緩存等。CPU運算器工做的時候須要數據,數據哪裏來?首先從距離CPU最近的二級緩存去拿,這塊緩存速度最快,一般也是體積最小,由於價格最貴:算法
存儲金字塔數據庫
如上圖所示,存儲體系就像個金子塔,最上層最快,價格最貴,最下層最慢,價格也最便宜,CPU的數據源優先級一層層從上到下去尋找數據。瀏覽器
很顯然,除了最慢的那塊存儲,在計算機體系中,相對較快的那些存儲均可以被稱爲緩存,他們解決的問題是讓存儲訪問更快。緩存
計算機體系存儲系統模型擴展到應用也是同樣,應用須要數據,數據哪裏來?緩存(更快的存儲)->DB(較慢的存儲),他們的工做流程大體以下圖所示:bash
帶緩存的存儲訪問通常模型服務器
如上圖所示,緩存應用系統通常存儲訪問流程:首先訪問緩存較快的存儲介質,若是命中且未失效則返回內容,若是未命中或失效則訪問較慢的存儲介質將內容返回同時更新緩存。併發
memcached是LiveJournal旗下的Danga Interactive公司的Brad Fitzpatric爲首開發的一款軟件。如今已經成爲mixi、hatena、Facebook、Vox、LiveJournal等衆多服務中提升Web應用擴展性的重要因素。傳統的Web應用都將數據保存到RDBMS中,應用服務器從RDBMS中讀取數據、處理數據並在瀏覽器中顯示。可是隨着數據量增大、訪問的集中、就會出現RDBMS的負擔加劇、數據庫響應變慢、致使整個系統響應延遲增長。分佈式
而memcached就是爲了解決這個問題而出現的,memcached是一款高性能的分佈式內存緩存服務器,通常目的是爲了經過緩存數據庫的查詢命中減小數據庫壓力、提升應用響應速度、提升可擴展性。
memcached緩存應用
今天的內容主要涉及memcached特色的第四條,memcached不相互通訊,那麼memcached是如何實現分佈式的呢?memcached的分佈式實現主要依賴客戶端的實現:
memcached分佈式
如上圖所示,咱們看下緩存的存儲的通常流程:
當數據到達客戶端,客戶端實現的算法就會根據「鍵」來決定保存的memcached服務器,服務器選定後,命令他保存數據。取的時候也同樣,客戶端根據「鍵」選擇服務器,使用保存時候的相同算法就能保證選中和存的時候相同的服務器。
餘數計算分散法是memcached標準的memcached分佈式方法,算法以下:
CRC($key)%N
該算法下,客戶端首先根據key來計算CRC,而後結果對服務器數進行取模獲得memcached服務器節點,對於這種方式有兩個問題值得說明一下:
Consistent Hashing算法描述以下:首先求出memcached服務器節點的哈希值,並將其分配到0~2^32的圓上,這個圓咱們能夠把它叫作值域,而後用一樣的方法求出存儲數據鍵的哈希值,並映射到圓上。而後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上,若是超過0~2^32仍找不到,就會保存在第一臺memcached服務器上:
memcachd基本原理
再拋出上面的問題,若是新添加或移除一臺機器,在consistent Hashing算法下會有什麼影響。上圖中假設有四個節點,咱們再添加一個節點叫node5:
添加了node節點以後
node5被放在了node4與node2之間,原本映射到node2和node4之間的區域都會找到node4,當有node5的時候,node5和node4之間的仍是找到node4,而node5和node2之間的此時會找到node5,所以當添加一臺服務器的時候受影響的僅僅是node5和node2區間。
上面能夠看出使用consistent Hashing最大限度的抑制了鍵的從新分配,且有的consistent Hashing的實現方式還採用了虛擬節點的思想。問題起源於使用通常hash函數的話,服務器的映射地點的分佈很是不均勻,從而致使數據庫訪問傾斜,大量的key被映射到同一臺服務器上。爲了不這個問題,引入了虛擬節點的機制,爲每臺服務器計算出多個hash值,每一個值對應環上的一個節點位置,這種節點叫虛擬節點。而key的映射方式不變,就是多了層從虛擬節點再映射到物理機的過程。這種優化下儘管物理機不多的狀況下,只要虛擬節點足夠多,也可以使用得key分佈的相對均勻。
本文介在理解緩存基本概念的狀況下介紹了memcached的分佈式算法實現原理,memcached的分佈式是由客戶端函數庫實現的。