Memcached

4.一、什麼是Memcached

 4.1.一、Memcached概述

  Memcached是一個免費的開源的、高性能的、具備又分佈式內存對象的緩存系統,它經過減輕數據庫負載加速動態WEB應用,php

4.1.一、Memcached和數據庫交互流程

(1)、檢查客戶端請求的數據是在Memcached中存在,若是存在,直接把請求的數據返回,再也不對數據進行任何操做。git

(2)、若是請求的數據再也不Memcache中,就去查詢數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到Memcahe中github

(3)、每次更新數據庫(若是更新、刪除數據庫的數據)的同時更新Memcache中的數據,保證Memcache中的數據數據庫中的數據一致。算法

(4)、當分配的Memcache內存空間用完以後,會使用LRU(Least Recetnly Used 最近最少使用數據庫

)策略加到期失效策略,失效的數據首先被替換掉,而後再替換掉最近使用的數據.數組

4.1.二、Memcached和數據庫交互流程圖

 

4.二、Memcahed的特徵

4.2.一、Memached特徵以下:

  Memcached做爲高性能的緩存服務器,具備以下特徵:緩存

  (1)、協議簡單服務器

   Memcahed的協議實現比較簡單,使用的是基於文本的協議,能直接經過telnet在服務器上存取數據.網絡

  (2)、基於libevent的處理併發

Libevent使一套利用C開發的程序庫,它將BSD系統kqueue Linux系統的epoll等事件處理功能封裝成一個接口,確保即便服務端的連接數增長也能發揮很好的性能.Memcached利用這個庫進行異步事件處理。

  (3)、內置的內存管理方式

   當內存但終得數據空間沾滿時,使用LRU算法自動刪除不使用的緩存,即重用過時數據的內存空間,Memcahed的爲緩存系統設計的.沒有考慮數據的容災問題,和機器的內存同樣,重啓機器數據將會丟失

  (4)、互不通訊的Memcached之間有分佈特徵。

各個Memcahed服務器之間相互不通訊,都是獨立的存取數據,不共享任何信息,經過對客戶端的設計,讓Memcahed具備分佈式,能支持海量緩存的大規模一個應用.

memcached儘管是「分佈式」緩存服務器,但服務器端並無分佈式功能。各個memcached不會互相通訊以共享信息。那麼,怎樣進行分佈式呢?這徹底取決於客戶端的實現。本文也將介紹memcached的分佈式。

 

4.2.二、Memached原理:

   Memcahed 是一種C/S模式,在服務器端啓動服務守護進程,此時能夠指定監聽的IP地址,首先 memcached 是以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的鏈接操做,客戶端能夠由各類語言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客戶端在與 memcached 服務創建鏈接以後,接下來的事情就是存取對象了,每一個被存取的對象都有一個惟一的標識符 key,存取操做均經過這個 key 進行,保存到memcached 中的對象其實是放置內存中的,並非保存在 cache 文件中的,這也是爲何 memcached 可以如此高效快速的緣由。注意,這些對象並非持久的,服務中止以後,裏邊的數據就會丟失。

與許多 cache 工具相似,Memcached 的原理並不複雜。它採用了C/S的模式,在 server 端啓動服務進程,在啓動時能夠指定監聽的 ip,本身的端口號,所使用的內存大小等幾個關鍵參數。一旦啓動,服務就一直處於可用狀態。Memcached 的目前版本是經過C實現,採用了單進程,單線程,異步I/O,基於事件 (event_based) 的服務方式.使用libevent 做爲事件通知實現。多個 Server 能夠協同工做,但這些 Server 之間是沒有任何通信聯繫的,每一個 Server 只是對本身的數據進行管理。Client 端經過指定 Server 端的 ip 地址(經過域名應該也能夠)。須要緩存的對象或數據是以 key->value對的形式保存在Server端。key 的值經過 hash 進行轉換,根據 hash 值把 value 傳遞到對應的具體的某個 Server 上。當須要獲取對象數據時,也根據 key 進行。首先對 key 進行 hash,經過得到的值能夠肯定它被保存在了哪臺 Server 上,而後再向該 Server 發出請求。Client 端只須要知道保存 hash(key) 的值在哪臺服務器上就能夠了。

 其實說到底,memcache 的工做就是在專門的機器的內存裏維護一張巨大的 hash 表,來存儲常常被讀寫的一些數組與文件,從而極大的提升網站的運行效率。

 

 

4.二、Memcahed的安裝

4.2.一、安裝libevnet

Memcache用到了libevent這個庫用於Socket的處理,因此還須要安裝libevent。(若是你的系統已經安裝了libevent,能夠不用安裝

#wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

# ls /usr/lib | grep libevent

# mkdir /opt/tmp && cd /opt/tmp

# mv /libevent-2.0.21-stable.tar.gz /opt/tmp

# tar -xvf libevent-2.0.21-stable.tar.gz

# cd libevent-2.0.21-stable

# ./configure --prefix=/usr && make && make install

 

4.2.二、安裝memcached

# wget http://www.danga.com/memcached/dist/memcached-1.4.0.tar.gz

# tar -xvf memcached-1.4.0.tar.gz && cd memcached-1.4.0

# ./configure --with-libevent=/usr && make && make install

# ls -al /usr/local/bin/memcached 檢測是否安裝成功

 

 

 

4.2.二、啓動memcached

/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 12000 -c 512 -P /tmp/memcached.pid

-d選項是啓動一個守護進程,

-m是分配給Memcache使用的內存數量,單位是MB,我這裏是10MB,正常來講都分1024或者根據業務來分

-u是運行Memcache的用戶,我這裏是root,

-l是監聽的服務器IP地址,若是有多個地址的話,我這裏指定了服務器的IP地址192.168.0.200,

-p是設置Memcache監聽的端口,我這裏設置了12000,最好是1024以上的端口,

-c選項是最大運行的併發鏈接數,默認是1024,我這裏設置了256,按照你服務器的負載量來設定,

-P是設置保存Memcache的pid文件,我這裏是保存在 /tmp/memcached.pid

 

4.三、Memcahed測試

4.3.一、常見出錯

這說明沒有找到文件:libevent-1.2.so.1解決辦法以下:

/usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

# ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

4.3.二、基本測試

# telete 127.0.0.1 12000

# telnet 127.0.0.1 12000

set test 0 0 3  向test當中存儲數據

123     輸入的key爲test存入數據

STORED       返回set結果

get test        獲取數據

VALUE test 0 3

123   取得key爲test中的數據

incr test 1   數據 增長1

124

decr test 2  數據減小2  

122

quit

4.3.五、參數說明

>status

pid               Process id of this server process (memcache服務器的進程ID)
uptime            Number of seconds this server has been running (服務器已經運行的秒數)
time              Current UNIX time according to the server (服務器當前的UNIX時間)
version           Version string of this server (memcache版本)
pointer_size      Current system pointer 當前操做系統的指針大小(32位系統通常是32bit)
rusage_user       Accumulated user time for this process (該進程累計的用戶時間(秒:微妙))
rusage_system     Accumulated system time for this process (該進程累計的系統時間(秒:微妙))
curr_items        Current number of items stored by the server (服務器當前存儲的內容數量)
total_items       Total number of items stored by this server ever since it started (服務器啓動以來存儲過的內容總數)
bytes             Current number of bytes used by this server to store items (服務器當前存儲內容所佔用的字節數)
curr_connections  Number of open connections (當前打開着的鏈接數量)
total_connections Total number of connections opened since the server started running (服務器運行以來接受的鏈接總數)
connection_structures Number of connection structures allocated by the server (服務器分配的鏈接結構的數量)
cmd_get             Cumulative number of retrieval requests (get命令(獲取)總請求次數)
cmd_set             Cumulative number of storage requests (set命令(保存)總請求次數)
get_hits            Number of keys that have been requested and found present (請求成功的總次數)
get_misses          Number of items that have been requested and not found (請求失敗的總次數)
threads             Current number of thread (當前線程數)
bytes_read          Total number of bytes read by this server from network (服務器從網絡讀取到的總字節數)
bytes_written       Total number of bytes sent by this server to network (服務器向網絡發送的總字節數)
limit_maxbytes      Number of bytes this server is allowed to use for storage. (服務器在存儲時被容許使用的字節總數)
evictions           Number of valid items removed from cache to free memory for new items (爲獲取空閒內存而刪除的items數(分配給memcache的空間用滿後須要刪除舊的items來獲得空間分配給新的items))

其中,最關注最多的幾個參數:
uptime:是memcached運行的秒數。
cmd_get:是查詢緩存的次數。
cmd_get/uptime 結果是平均每秒請求緩存的次數——結果值越大,說明Memcached的利用率越高,站點的訪問量大,若是過低,用文件系統緩存就能夠了,根本不會體現出使用memcached的強大性能。
cmd_set:是設置key=>value的次數。整個memcached是個大hash,用cmd_get沒有找到的內容,就會調用一下cmd_set寫進緩存裏。
get_hits:是緩存命中的次數。所謂的命中率 = get_hits/cmd_get * 100%。
get_misses:是緩存未命中的次數。get_misses加上get_hits就等於cmd_get。
stats:顯示服務器信息、統計數據等
stats reset:清空統計數據

stats slabs:顯示各個slab的信息,包括chunk的大小、數目、使用狀況等
stats items:顯示各個slab中item的數目和存儲時長(最後一次訪問距離如今的秒數)
quit:退出

4.3.四、重啓

# kill `cat /tmp/memcached.pid`

 

4.四、Memcahed分佈式部署概念

4.4.一、方案

一般較小的應用一臺Memcached服務器就能夠知足需求,可是大中型項目可能就須要多臺Memcached服務器了,這就牽涉到一個分佈式部署的問題。

對於多臺Memcached服務器,怎麼肯定一個數據應該保存到哪臺服務器呢?有兩種方案,一是普通Hash分佈,二是一致性Hash分佈。下面詳細說明。

跟DB的Amoeba同樣這裏經過Hash算法後進行取模 % 2

分佈到 server1

       server2

 

<?php

/**

* 普通Hash分佈

*/

//Hash函數

function mHash($key){

    $md5 = substr(md5($key), 0, 8);

    $seed = 31;

    $hash = 0;

    for($i = 0; $i < 8; $i++){

        $hash = $hash * $seed + ord($md5{$i});

        $i++;

    }

    return $hash & 0x7FFFFFFF;

}

//假設有2臺Memcached服務器

$servers = array(

    array('host' => '192.168.1.1', 'port' => 11211),

    array('host' => '192.168.1.1', 'port' => 11211)

);

$key = 'MyBlog';

$value = 'http://blog.phpha.com';

$sc = $servers[mHash($key) % 2];

$memcached = new Memcached($sc);

$memcached->set($key, $value);

?>

相關文章
相關標籤/搜索