天天看點

分布式緩存——memcache原理

内容:1.什麼是Memcached

            2.MemCache和MemCached的差別

            3.memcache通路模型

            4.Memcached作為高速運作的分布式緩存伺服器具有以下特點

            5.Memcached的記憶體算法

            6.Memcached的緩存政策

            7.分布式算法(Consistent Hashing)

            8. MemCache的特性和限制總結

1.什麼是Memcached

        MemCache是一個自由、源碼開放、高性能、分布式的分布式記憶體對象緩存系統,用于動态Web應用以減輕資料庫的負載。它通過在記憶體中緩存資料和對象來減少讀取資料庫的次數,進而提高了網站通路的速度。 MemCaChe是一個存儲鍵值對的HashMap,在記憶體中對任意的資料(比如字元串、對象等)所使用的key-value存儲,資料可以來自資料庫調用、API調用,或者頁面渲染的結果。MemCache設計理念就是小而強大,它簡單的設計促進了快速部署、易于開發并解決面對大規模的資料緩存的許多難題,而所開放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程式語言。

        許多Web 應用程式都将資料儲存到RDBMS中,應用伺服器從中讀取資料并在浏覽器中顯示。但随着資料量的增大,通路的集中,就會出現REBMS的負擔加重,資料庫響應惡化,網站顯示延遲等重大影響。Memcached是高性能的分布式記憶體緩存伺服器。一般的使用目的是通過緩存資料庫查詢結果,減少資料庫的通路次數,以提高動态Web 應用的速度、提高擴充性。

2.MemCache和MemCached的差別:

1、MemCache是項目的名稱

2、MemCached是MemCache伺服器端可以執行檔案的名稱

3.memcache通路模型

<a href="http://s2.51cto.com/wyfs02/M02/87/26/wKiom1fV6rewEf1BAAEKuSzMIzw678.jpg" target="_blank"></a>

        同時基于這張圖,理一下MemCache一次寫緩存的流程:

1、應用程式輸入需要寫緩存的資料

2、API将Key輸入路由算法子產品,路由算法根據Key和MemCache叢集伺服器清單得到一台伺服器編号

3、由伺服器編号得到MemCache及其的ip位址和端口号

4、API調用通信子產品和指定編号的伺服器通信,将資料寫入該伺服器,完成一次分布式緩存的寫操作

        讀緩存和寫緩存一樣,隻要使用相同的路由算法和伺服器清單,隻要應用程式查詢的是相同的Key,MemCache用戶端總是通路相同的用戶端去讀取資料,隻要伺服器中還緩存着該資料,就能保證緩存命中。

        這種MemCache叢集的方式也是從分區容錯性的方面考慮的,假如Node2當機了,那麼Node2上面存儲的資料都不可用了,此時由于叢集中Node0和Node1還存在,下一次請求Node2中存儲的Key值的時候,肯定是沒有命中的,這時先從資料庫中拿到要緩存的資料,然後路由算法子產品根據Key值在Node0和Node1中選取一個節點,把對應的資料放進去,這樣下一次就又可以走緩存了,這種叢集的做法很好,但是缺點是成本比較大。

    4.Memcached作為高速運作的分布式緩存伺服器具有以下特點。

        協定簡單:memcached的伺服器用戶端通信并不使用複雜的MXL等格式,而是使用簡單的基于文本的協定。

        基于libevent的事件處理:libevent是個程式庫,他将Linux 的epoll、BSD類作業系統的kqueue等時間處理功能封裝成統一的接口。memcached使用這個libevent庫,是以能在Linux、BSD、Solaris等作業系統上發揮其高性能。

        内置記憶體存儲方式:為了提高性能,memcached中儲存的資料都存儲在memcached内置的記憶體存儲空間中。由于資料僅存在于記憶體中,是以重新開機memcached,重新開機作業系統會導緻全部資料消失。另外,内容容量達到指定的值之後memcached回自動删除不适用的緩存。

        Memcached不互通信的分布式:memcached盡管是“分布式”緩存伺服器,但伺服器端并沒有分布式功能。各個memcached不會互相通信以共享資訊。他的分布式主要是通過用戶端實作的。

    5.Memcached的記憶體算法:

        Memcached利用slab allocation機制來配置設定和管理記憶體,它按照預先規定的大小,将配置設定的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,資料在存放時,根據鍵值 大小去比對slab大小,找就近的slab存放,是以存在空間浪費現象。

      傳統的記憶體管理方式是,使用完通過malloc配置設定的記憶體後通過free來回收記憶體,這種方式容易産生記憶體碎片并降低作業系統對記憶體的管理效率。

      Memcached根據收到的資料的大小,選擇最合适資料大小的Slab (圖2) memcached中儲存着slab内空閑chunk的清單,根據該清單選擇chunk,然後将資料緩存于其中。

<a href="http://s3.51cto.com/wyfs02/M00/87/26/wKiom1fV7NvQKmenAAB8_f1xGko435.jpg" target="_blank"></a>

    6.Memcached的緩存政策:

      Memcached的緩存政策是LRU(最近最少使用)加上到期失效政策。當你在memcached記憶體儲資料項時,你有可能會指定它在緩存的失效時間,預設為永久。當memcached伺服器用完配置設定的内時,失效的資料被首先替換,然後也是最近未使用的資料。在LRU中,memcached使用的是一種Lazy Expiration政策,自己不會監控存入的key/vlue對是否過期,而是在擷取key值時檢視記錄的時間戳,檢查key/value對空間是否過期,這樣可減輕伺服器的負載。

    7.分布式算法(Consistent Hashing):

  當向memcached叢集存入/取出key/value時,memcached用戶端程式根據一定的算法計算存入哪台伺服器,然後再把key/value值存到此伺服器中。也就是說,存取資料分二步走,第一步,選擇伺服器,第二步存取資料。  

<a href="http://s1.51cto.com/wyfs02/M00/87/24/wKioL1fV7tKAgn_LAACgyDa-3vk087.jpg" target="_blank"></a>

  選擇伺服器算法有兩種,一種是根據餘數來計算分布,另一種是根據雜湊演算法來計算分布。

    餘數算法:

    先求得鍵的整數散列值,再除以伺服器台數,根據餘數确定存取伺服器,這種方法計算簡單,高效,但在memcached伺服器增加或減少時,幾乎所有的緩存都會失效。

    雜湊演算法:

    先算出memcached伺服器的散列值,并将其分布到0到2的32次方的圓上,然後用同樣的方法算出存儲資料的鍵的散列值并映射至圓上,最後從資料映射到的位置開始順時針查找,将資料儲存到查找到的第一個伺服器上,如果超過2的32次方,依然找不到伺服器,就将資料儲存到第一台memcached伺服器上。如果添加了一台memcached伺服器,隻在圓上增加伺服器的逆時針方向的第一台伺服器上的鍵會受到影響。

<a href="http://s2.51cto.com/wyfs02/M00/87/24/wKioL1fV7cyR3JZJAABdL_YkxAE380.jpg" target="_blank"></a>

    8. MemCache的特性和限制總結:

上面已經對于MemCache做了一個比較詳細的解讀,這裡再次總結MemCache的限制和特性:

1、MemCache中可以儲存的item資料量是沒有限制的,隻要記憶體足夠

2、MemCache單程序在32位機中最大使用記憶體為2G,這個之前的文章提了多次了,64位機則沒有限制

3、Key最大為250個位元組,超過該長度無法存儲

4、單個item最大資料是1MB,超過1MB的資料不予存儲

5、MemCache服務端是不安全的,比如已知某個MemCache節點,可以直接telnet過去,并通過flush_all讓已經存在的鍵值對立即失效

6、不能夠周遊MemCache中所有的item,因為這個操作的速度相對緩慢且會阻塞其他的操作

7、MemCache的高性能源自于兩階段哈希結構:第一階段在用戶端,通過Hash算法根據Key值算出一個節點;第二階段在服務端,通過一個内部的Hash算法,查找真正的item并傳回給用戶端。從實作的角度看,MemCache是一個非阻塞的、基于事件的伺服器程式

8、MemCache設定添加某一個Key值的時候,傳入expiry為0表示這個Key值永久有效,這個Key值也會在30天之後失效,

本文轉自willis_sun 51CTO部落格,原文連結:http://blog.51cto.com/willis/1851819,如需轉載請自行聯系原作者