Memcached 分布式緩存實現原理簡介
摘要
在高并發(fā)環(huán)境下,大量的讀、寫請求涌向數據庫,此時磁盤IO將成為瓶頸,從而導致過高的響應延遲,因此緩存應運而生。無論是單機緩存還是分布式緩存都有其適應場景和優(yōu)缺點,當今存在的緩存產品也是數不勝數,最常見的有redis和memcached等,既然是分布式,那么他們是怎么實現分布式的呢?本文主要介紹分布式緩存服務mencached的分布式實現原理。
緩存本質
計算機體系緩存
什么是緩存,我們先看看計算機體系結構中的存儲體系,根據馮·諾依曼計算機體系結構模型,計算機分為五大部分:運算器、控制器、存儲器、輸入設備、輸出設備。結合現代計算機,CPU包含運算器和控制器兩個部分,CPU負責計算,其需要的數據由存儲提供,存儲分為幾個級別,就拿我當前的PC舉個例子,我的機器存儲清單如下:
1.356G的磁盤
2.4G的內存
3.3MB三級緩存
4.256KB二級緩存(pre core)
除了上述部分,還有CPU內的寄存器,當然有的計算機還有一級緩存等。CPU運算器工作的時候需要數據,數據哪里來?首先從距離CPU最近的二級緩存去拿,這塊緩存速度最快,通常也是體積最小,因為價格最貴:
存儲金字塔
如上圖所示,存儲體系就像個金子塔,最上層最快,價格最貴,最下層最慢,價格也最便宜,CPU的數據源優(yōu)先級一層層從上到下去尋找數據。
很顯然,除了最慢的那塊存儲,在計算機體系中,相對較快的那些存儲都可以被稱為緩存,他們解決的問題是讓存儲訪問更快。
緩存應用系統(tǒng)
計算機體系存儲系統(tǒng)模型擴展到應用也是一樣,應用需要數據,數據哪里來?緩存(更快的存儲)->DB(較慢的存儲),他們的工作流程大致如下圖所示:
帶緩存的存儲訪問一般模型
如上圖所示,緩存應用系統(tǒng)一般存儲訪問流程:首先訪問緩存較快的存儲介質,如果命中且未失效則返回內容,如果未命中或失效則訪問較慢的存儲介質將內容返回同時更新緩存。
memcached簡介
什么是memcached
memcached是LiveJournal旗下的Danga Interactive公司的Brad Fitzpatric為首開發(fā)的一款軟件。現在已經成為mixi、hatena、Facebook、Vox、LiveJournal等眾多服務中提高Web應用擴展性的重要因素。傳統(tǒng)的Web應用都將數據保存到RDBMS中,應用服務器從RDBMS中讀取數據、處理數據并在瀏覽器中顯示。但是隨著數據量增大、訪問的集中、就會出現RDBMS的負擔加重、數據庫響應變慢、導致整個系統(tǒng)響應延遲增加。
而memcached就是為了解決這個問題而出現的,memcached是一款高性能的分布式內存緩存服務器,一般目的是為了通過緩存數據庫的查詢命中減少數據庫壓力、提高應用響應速度、提高可擴展性。
memcached緩存應用
memcached緩存特點
1.協(xié)議簡單
2.基于libevent的事件處理
3.內置內存存儲方式
4.memcached不相互通信的分布式
memcached分布式原理
今天的內容主要涉及memcached特點的第四條,memcached不相互通信,那么memcached是如何實現分布式的呢?memcached的分布式實現主要依賴客戶端的實現:
memcached分布式
如上圖所示,我們看下緩存的存儲的一般流程:
當數據到達客戶端,客戶端實現的算法就會根據“鍵”來決定保存的memcached服務器,服務器選定后,命令他保存數據。取的時候也一樣,客戶端根據“鍵”選擇服務器,使用保存時候的相同算法就能保證選中和存的時候相同的服務器。
余數計算分散法
余數計算分散法是memcached標準的memcached分布式方法,算法如下:
該算法下,客戶端首先根據key來計算CRC,然后結果對服務器數進行取模得到memcached服務器節(jié)點,對于這種方式有兩個問題值得說明一下:
1.當選擇到的服務器無法連接的時候,一種解決辦法是將嘗試的連接次數加到key后面,然后重新進行hash,這種做法也叫rehash。
2.第二個問題也是這種方法的致命的缺點,盡管余數計算分散發(fā)相當簡單,數據分散也很優(yōu)秀,當添加或者移除服務器的時候,緩存重組的代價相當大。
Consistent Hashing算法
Consistent Hashing算法描述如下:首先求出memcached服務器節(jié)點的哈希值,并將其分配到0~2^32的圓上,這個圓我們可以把它叫做值域,然后用同樣的方法求出存儲數據鍵的哈希值,并映射到圓上。然后從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上,如果超過0~2^32仍找不到,就會保存在第一臺memcached服務器上:
memcachd基本原理
再拋出上面的問題,如果新添加或移除一臺機器,在consistent Hashing算法下會有什么影響。上圖中假設有四個節(jié)點,我們再添加一個節(jié)點叫node5:
添加了node節(jié)點之后
node5被放在了node4與node2之間,本來映射到node2和node4之間的區(qū)域都會找到node4,當有node5的時候,node5和node4之間的還是找到node4,而node5和node2之間的此時會找到node5,因此當添加一臺服務器的時候受影響的僅僅是node5和node2區(qū)間。
優(yōu)化的Consistent Hashing算法
上面可以看出使用consistent Hashing最大限度的抑制了鍵的重新分配,且有的consistent Hashing的實現方式還采用了虛擬節(jié)點的思想。問題起源于使用一般hash函數的話,服務器的映射地點的分布非常不均勻,從而導致數據庫訪問傾斜,大量的key被映射到同一臺服務器上。為了避免這個問題,引入了虛擬節(jié)點的機制,為每臺服務器計算出多個hash值,每個值對應環(huán)上的一個節(jié)點位置,這種節(jié)點叫虛擬節(jié)點。而key的映射方式不變,就是多了層從虛擬節(jié)點再映射到物理機的過程。這種優(yōu)化下盡管物理機很少的情況下,只要虛擬節(jié)點足夠多,也能夠使用得key分布的相對均勻。
總結
本文介在理解緩存基本概念的情況下介紹了memcached的分布式算法實現原理,memcached的分布式是由客戶端函數庫實現的。
以上就是本文的全部內容,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Linux啟動/停止/重啟Mysql數據庫的簡單方法(推薦)
下面小編就為大家?guī)硪黄狶inux啟動/停止/重啟Mysql數據庫的簡單方法(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10CentOS使用expect批量遠程執(zhí)行腳本和命令
這篇文章主要介紹了CentOS使用expect批量遠程執(zhí)行腳本和命令,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06