溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

memcache緩存服務器是什么?

發(fā)布時間:2020-05-25 15:34:18 來源:億速云 閱讀:278 作者:鴿子 欄目:系統(tǒng)運維

1,memcache簡介

mamcache是一套分布式的高速緩存系統(tǒng),可以提高網(wǎng)站訪問的速度,尤其是對于一些大型的公司或者頻繁訪問數(shù)據(jù)庫的網(wǎng)站訪問速度提升效果十分顯著,memcache是一個開源免費的軟件,memcache通過鍵值對的訪問將數(shù)據(jù)緩存在內存當中,減少從后端數(shù)據(jù)讀取數(shù)據(jù)的次數(shù)。

2,memcache分布式緩存系統(tǒng)

分布式:將數(shù)據(jù)分散存儲在不同服務器上。
緩存系統(tǒng):嚴格意義上來說,memcache不是一個nosql數(shù)據(jù)庫,只是提供內存緩存功能系統(tǒng),那怎么理解別人來說memcache是一個nosql數(shù)據(jù)庫呢?關系型數(shù)據(jù)庫是基于二維表來存放數(shù)據(jù)(事務,元祖,數(shù)據(jù)的持久性)等,最簡單的理解就是數(shù)據(jù)在斷電后不會丟失,非關系型數(shù)據(jù)庫不使用sql語句來進行數(shù)據(jù)的查詢而是基于key-value存儲和讀取數(shù)據(jù)的,所以又可以理解成nosql數(shù)據(jù)庫了。

3,memcache和mysql區(qū)別

1)沒有使用sql語句查詢或存儲數(shù)據(jù);
2)memcache中沒有mysql的表的概念,都是使用鍵值對來保存的;
3)memcache的數(shù)據(jù)保存在內存當中,數(shù)據(jù)讀取速度快,數(shù)據(jù)斷電丟失;

4,memcache分布式部署的原理

memcache雖然被稱為“分布式緩存”,但是memcache本身完全不具備分布式的功能,memcache集群之間不會相互通信,所謂的“分布式”,完全依賴于客戶端程序的實現(xiàn),就像下面這張圖的流程一樣。
memcache緩存服務器是什么?
同時基于這張圖,理一下memcache一次寫緩存的流程:
① 應用程序輸入需要寫緩存的數(shù)據(jù);
② API將key輸入路由算法模塊,路由算法根據(jù)key和memcache集群服務器列表得到一臺服務器編號;
③ 由服務器編號得到memcache及其的ip地址和端口號;
④ API調用通信模塊和指定編號的服務器通信,將數(shù)據(jù)寫入該服務器,完成一次分布式緩存的寫操作。

讀操作和寫緩存一樣,只要使用相同的路由算法和服務器列表,只要應用程序查詢的是相同的key,memcache客戶端總是訪問相同的客戶端去讀取數(shù)據(jù),只要服務器中還緩存著該數(shù)據(jù),就能保證緩存命中。

這種memcache集群的方式也是從分區(qū)容錯性的方面考慮的,假如node02宕機了,那么node02上面存儲的數(shù)據(jù)都不可用了,此時由于集群中node0和node1還存在,下一次請求node02中存儲的key值的時候,肯定是沒有命中的,這時先從數(shù)據(jù)庫中拿到要緩存的數(shù)據(jù),然后路由算法模板根據(jù)key值在node0和node1中選取一個節(jié)點,把對應的數(shù)據(jù)放進去,這樣下一次就有可以走緩存了。但集群的做法要考慮成本的問題。

5,路由算法

從上面的圖中,看出對服務器集群的管理,路由算法至關重要,就和負載均衡算法一樣,路由算法決定著究竟該訪問集群中的哪臺服務器。
1)余數(shù)hash算法:
將要存儲的key-vaule數(shù)據(jù)進行hash運算得到一個值,然后根據(jù)memcache的數(shù)據(jù)進行整除取余。根據(jù)余數(shù)把數(shù)據(jù)方放到對應的服務器上,由于hash值的隨機性很大,所以服務器上存放的數(shù)據(jù)也就比較平衡,一般不會造成大量數(shù)據(jù)只放在一臺服務器上的情況,但是這樣又出現(xiàn)一個問題,當添加一臺節(jié)點的時候,之前的數(shù)據(jù)就會讀取不到。
解決方案:
(1)在網(wǎng)站訪問量低的時候,技術團隊加班,擴容,重啟服務器
(2)通過模擬請求的方式進行緩存預熱,使服務器中的數(shù)據(jù)重新分布。

2) 一致性hash算法:
通過一個叫做一致性hash環(huán)的數(shù)據(jù)結果實現(xiàn)key到緩存服務器的hash映射,簡單來說一致性hash將整個hash值的控制組織成一個虛擬的圓環(huán)(這個環(huán)被稱為一致性hash環(huán))
memcache緩存服務器是什么?
缺點:當服務器節(jié)點太少的時候,容易造成節(jié)點數(shù)據(jù)不均勻??梢赃x擇采用增加虛擬節(jié)點的方式解決。
更重要的是,集群中緩存服務器節(jié)點越多,增加/減少節(jié)點帶來的影響越??;也就是說隨著集群規(guī)模的增大,繼續(xù)命中原有緩存數(shù)據(jù)的概率會越來越大,雖然仍然有小部分數(shù)據(jù)緩存在服務器中不能被讀到,但是這個比例足夠小,即使訪問數(shù)據(jù)庫,也不會對數(shù)據(jù)庫造成致命的負載壓力。

6,memcache實現(xiàn)原理

首先要說明一點,memcache的數(shù)據(jù)存放在內存中,因此有以下特點:
1)訪問數(shù)據(jù)的速度比傳統(tǒng)的關系型數(shù)據(jù)庫要快,因為傳統(tǒng)的關系型數(shù)據(jù)庫(mysql,oracle)為了保證數(shù)據(jù)的持久性,數(shù)據(jù)存放在硬盤中,io操作速度慢。
2)memcache的數(shù)據(jù)存放在內存中,只要memcache重啟,數(shù)據(jù)就會丟失。
3)既然memacache的數(shù)據(jù)存放在內存中,那么勢必受到機器位數(shù)的限制,32位機器最多只能使用2GB的內存空間,64位機器可以認為沒有上限。

然后我們來看一下memcache的原理,memcache最重要的是內存如何分配,memcache采用的內存分配方式是固定空間分配,如下圖所示:
memcache緩存服務器是什么?
這張圖片里面涉及了 slab_class、 slab、 page、 chunk 四個概念,它們之間的關系是:
1、 MemCache 將內存空間分為一組 slab;
2、每個 slab 下又有若干個 page,每個 page 默認是 1M,如果一個 slab 占用 100M 內存的話,那么這個 slab 下應該有 100 個 page;
3、每個 page 里面包含一組 chunk, chunk 是真正存放數(shù)據(jù)的地方,同一個 slab 里面的 chunk的大小是固定的;
4、有相同大小 chunk 的 slab 被組織在一起,稱為 slab_class;
MemCache 內存分配的方式稱為 allocator(分配運算), slab 的數(shù)量是有限的,幾個、十幾個或者幾十個,這個和啟動參數(shù)的配置相關。

memcache中的value存放的地方是有value的大小決定的,value總是會被存放到chunk大小最接近的一個slab中,比如 slab[1]的chunk 大小為 80 字節(jié)、 slab[2]的 chunk 大小為 100字節(jié)、 slab[3]的 chunk 大小為 128 字節(jié)(相鄰 slab 內的 chunk 基本以 1.25 為比例進行增長,MemCache 啟動時可以用-f 指定這個比例),那么過來一個88字節(jié)的value,這個value將被放到2號slab中。
放到slab的時候,首先slab要申請內存,申請內存是以page為單位的,所以在放入第一個數(shù)據(jù)的時候,無論帶下多少,都會有1M大小的page被分配給該slab。申請到page后, slab會將這個page的內存按chunk的大小進行切分,這樣就變成了一個chunk數(shù)組,最后從這個 chunk 數(shù)組中選擇一個用于存儲數(shù)據(jù)。
如果這個slab中沒有chunk可以分配了怎么辦,如果memcache啟動沒有追加-M(禁止LRU,這種情況下內存不夠會報Out Of Memory 錯誤),那么 MemCache 會把這個 slab 中最近最少使用的 chunk 中的數(shù)據(jù)清理掉,然后放上最新的數(shù)據(jù)。

7,memcache的工作流程

memcache緩存服務器是什么?
(1)檢查客戶端的請求數(shù)據(jù)是否在memcached中,如果有,直接把請求數(shù)據(jù)返回,不在對數(shù)據(jù)庫進行任何操作,路徑操作為①②③⑦。
(2)如果請求的數(shù)據(jù)不在memcached中,就去查數(shù)據(jù)庫,把從數(shù)據(jù)庫中獲取的數(shù)據(jù)返回給客戶端,同時把數(shù)據(jù)緩存一份到memecached中(memcached客戶端不負責,需要程序明確實現(xiàn)),路徑操作為①②④⑤⑦⑥。
(3)每次更新數(shù)據(jù)庫的同時更新memcached中的數(shù)據(jù),保證一致性。
(4)當分配給memcached內存空間用完之后,會使用LRU策略加上到期失效策略,失效數(shù)據(jù)首先被替換,然后再替換掉最近未使用的數(shù)據(jù)。

8,memcached的特征

協(xié)議簡單:
基于文本協(xié)議:常見的協(xié)議http,ftp,smtp都是基于文本行的,所謂基于文本行,指的是信息以文本傳遞;
基于libevent事件處理:
libevent是一套利用c語言開發(fā)的程序庫,它將BSD系統(tǒng)的kqueue(BSD是unix的衍生版本),linux系統(tǒng)的epoll等事件處理功能封裝成一個接口,與傳統(tǒng)的select相比,提高了性能。
內置的內存管理方式:
所有數(shù)據(jù)都保存在內存中,數(shù)據(jù)訪問速度快,但沒有考慮數(shù)據(jù)單點容災問題,重啟服務,所有數(shù)據(jù)會丟失。
分布式:
各個memcached服務器之間互不通信,各自獨立存取數(shù)據(jù),不共享任何信息,服務器并不具備分布式功能,分布是部署取決于memcache客戶端。
memcache的安裝分為兩個過程:memcache服務器端的安裝和memcached客戶端的安裝。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI