Memcached 分散式快取實現原理
摘要
在高併發環境下,大量的讀、寫請求湧向資料庫,此時磁碟IO將成為瓶頸,從而導致過高的響應延遲,因此快取應運而生。無論是單機快取還是分散式快取都有其適應場景和優缺點,當今存在的快取產品也是數不勝數,最常見的有redis和memcached等,既然是分散式,那麼他們是怎麼實現分散式的呢?本文主要介紹分散式快取服務mencached的分散式實現原理。
快取本質
計算機體系快取
什麼是快取,我們先看看計算機體系結構中的儲存體系,根據馮·諾依曼計算機體系結構模型,計算機分為五大部分:運算器、控制器、儲存器、輸入裝置、輸出裝置。結合現代計算機,CPU包含運算器和控制器兩個部分,CPU負責計算,其需要的資料由儲存提供,儲存分為幾個級別,就拿我當前的PC舉個例子,我的機器儲存清單如下:
- 356G的磁碟
- 4G的記憶體
- 3MB三級快取
- 256KB二級快取(pre core)
除了上述部分,還有CPU內的暫存器,當然有的計算機還有一級快取等。CPU運算器工作的時候需要資料,資料哪裡來?首先從距離CPU最近的二級快取去拿,這塊快取速度最快,通常也是體積最小,因為價格最貴:
儲存金字塔
如上圖所示,儲存體系就像個金子塔,最上層最快,價格最貴,最下層最慢,價格也最便宜,CPU的資料來源優先順序一層層從上到下去尋找資料。
很顯然,除了最慢的那塊儲存,在計算機體系中,相對較快的那些儲存都可以被稱為快取,他們解決的問題是讓儲存訪問更快。
快取應用系統
計算機體系儲存系統模型擴充套件到應用也是一樣,應用需要資料,資料哪裡來?快取(更快的儲存)->DB(較慢的儲存),他們的工作流程大致如下圖所示:
帶快取的儲存訪問一般模型
如上圖所示,快取應用系統一般儲存訪問流程:首先訪問快取較快的儲存介質,如果命中且未失效則返回內容,如果未命中或失效則訪問較慢的儲存介質將內容返回同時更新快取。
memcached簡介
什麼是memcached
memcached是LiveJournal旗下的Danga Interactive公司的Brad Fitzpatric為首開發的一款軟體。現在已經成為mixi、hatena、Facebook、Vox、LiveJournal等眾多服務中提高Web應用擴充套件性的重要因素。傳統的Web應用都將資料儲存到RDBMS中,應用伺服器從RDBMS中讀取資料、處理資料並在瀏覽器中顯示。但是隨著資料量增大、訪問的集中、就會出現RDBMS的負擔加重、資料庫響應變慢、導致整個系統響應延遲增加。
而memcached就是為了解決這個問題而出現的,memcached是一款高效能的分散式記憶體快取伺服器,一般目的是為了通過快取資料庫的查詢命中減少資料庫壓力、提高應用響應速度、提高可擴充套件性。
memcached快取應用
memcached快取特點
- 協議簡單
- 基於libevent的事件處理
- 內建記憶體儲存方式
- memcached不相互通訊的分散式
memcached分散式原理
今天的內容主要涉及memcached特點的第四條,memcached不相互通訊,那麼memcached是如何實現分散式的呢?memcached的分散式實現主要依賴客戶端的實現:
memcached分散式
如上圖所示,我們看下快取的儲存的一般流程:
當資料到達客戶端,客戶端實現的演算法就會根據“鍵”來決定儲存的memcached伺服器,伺服器選定後,命令他儲存資料。取的時候也一樣,客戶端根據“鍵”選擇伺服器,使用儲存時候的相同演算法就能保證選中和存的時候相同的伺服器。
餘數計算分散法
餘數計算分散法是memcached標準的memcached分散式方法,演算法如下:
CRC($key)%N
該演算法下,客戶端首先根據key來計算CRC,然後結果對伺服器數進行取模得到memcached伺服器節點,對於這種方式有兩個問題值得說明一下:
- 當選擇到的伺服器無法連線的時候,一種解決辦法是將嘗試的連線次數加到key後面,然後重新進行hash,這種做法也叫rehash。
- 第二個問題也是這種方法的致命的缺點,儘管餘數計算分散發相當簡單,資料分散也很優秀,當新增或者移除伺服器的時候,快取重組的代價相當大。
Consistent Hashing演算法
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最大限度的抑制了鍵的重新分配,且有的consistent Hashing的實現方式還採用了虛擬節點的思想。問題起源於使用一般hash函式的話,伺服器的對映地點的分佈非常不均勻,從而導致資料庫訪問傾斜,大量的key被對映到同一臺伺服器上。為了避免這個問題,引入了虛擬節點的機制,為每臺伺服器計算出多個hash值,每個值對應環上的一個節點位置,這種節點叫虛擬節點。而key的對映方式不變,就是多了層從虛擬節點再對映到物理機的過程。這種優化下儘管物理機很少的情況下,只要虛擬節點足夠多,也能夠使用得key分佈的相對均勻。
總結
本文介在理解快取基本概念的情況下介紹了memcached的分散式演算法實現原理,memcached的分散式是由客戶端函式庫實現的。
相關文章
- memcached分散式原理與實現分散式
- 讀《深入分散式快取 - 從原理到實踐》分散式快取
- LNMP 分散式叢集(四):Memcached 快取伺服器的搭建LNMP分散式快取伺服器
- WEB 應用快取解析以及使用 Redis 實現分散式快取Web快取Redis分散式
- 分散式快取分散式快取
- 基於快取或zookeeper的分散式鎖實現快取分散式
- Redis分散式實現原理Redis分散式
- redis→分散式快取Redis分散式快取
- 分散式快取方案分散式快取
- 聊聊分散式快取分散式快取
- 聊聊本地快取和分散式快取快取分散式
- Gitlab Runner的分散式快取實戰Gitlab分散式快取
- Redisson實現分散式鎖---原理Redis分散式
- 分散式鎖的實現原理分散式
- 分散式鎖的3種實現(資料庫、快取、Zookeeper)分散式資料庫快取
- 在Kubernetes上使用Spring Boot實現Hazelcast分散式快取 – PiotrSpring BootAST分散式快取
- SmartSql Redis 分散式快取SQLRedis分散式快取
- 分散式快取擊穿分散式快取
- 分散式快取NCache使用分散式快取
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- 分散式鎖的實現及原理分散式
- 分散式事務(3)---RocketMQ實現分散式事務原理分散式MQ
- 分散式之快取擊穿分散式快取
- k04_分散式快取分散式快取
- 分散式快取 - 概念解釋分散式快取
- 分散式快取基礎教程分散式快取
- 雲上的分散式快取分散式快取
- 分散式系統快取系列一 認識快取分散式快取
- 用Java寫一個分散式快取——快取管理Java分散式快取
- 分散式鎖實現原理與最佳實踐分散式
- Spring Boot整合Hazelcast實現叢集與分散式記憶體快取Spring BootAST分散式記憶體快取
- 從快取到分散式快取的那些事快取分散式
- Redis分散式鎖的原理和實現Redis分散式
- redisson之分散式鎖實現原理(三)Redis分散式
- zookeeper 分散式鎖的原理及實現分散式
- 分散式快取架構綜述分散式快取架構
- 分散式系統中有哪些快取?分散式快取
- Redis、Zookeeper實現分散式鎖——原理與實踐Redis分散式