memcached:由LiveJournal旗下Danga Interactive公司的Brad Fitzpatric爲首開發的一款軟件,現已成爲mixi,hatena,Facebook,Vox,LiveJournal等衆多服務器提高Web應用程序擴展性的重要因素;
memcached是一款開源、高性能、分佈式內存對象緩存系統,可應用各種需要緩存的場景,其主要目的是通過降低對Database的訪問來加速web應用程序。它是一個基於內存的“鍵值對”存儲,用於存儲數據庫調用、API調用或頁面引用結果的直接數據,如字符串、對象等。
memcached完全工作在旁路模式下,自身並不是緩存服務器,數據不會保存在磁盤上,只是一個提供了緩存功能的服務器,可緩存所有可序列化的數據;所能緩存的值的大小不能超過1M;基於事件驅動,使用epoll算法;
memcached的特點
1,協議簡單:服務器與客戶端通信使用基於文本行的協議,而不是基於其他複雜的協議(如XML等);
2,基於libevent的事件驅動模型:memcached依賴於libevent庫;
3,使用內存存儲的方式:memcached的數據存儲在內存中,因此性能得到提升,但重啓機器後數據會丟失,如果要保證數據不丟失可以採用memcachedb或redis;
4,memcached各服務器之間完全獨立:多臺memcached服務器的情況下,各服務器之間也不會互相通信,存放的數據不會共享;
libevent:一個事件觸發的網絡庫,適用於多種平臺(Linux,BSD,windwos),內部使用select,epoll,kqueue等事件機制,擁有高性能,即使對服務器連接數的增加,也能達到O(1)的性能;
LRU(Least Recently Used):儘管memcached或優先使用已經超時的緩存記錄空間,但當存放的數據量達到指定的值後(內存空間不足時),LRU算法會自動刪除不常使用的數據,以存放新的數據;
memcached內存管理機制
malloc和free:早期使用的內存管理機制,容易導致內存碎片,降低系統性能;
Salb Allocation:現在使用的內存管理機制,將從內核獲取到的內存分割成許多不同大小的塊,然後把相當大小的塊分爲一個組;
主要術語
page 分配給slab的內存空間,默認是1MB;分配給slab後根據slab的大小切分成塊(chunk);
chunk 用於緩存數據的內存空間;
slab class 特定大小的塊的組;
存儲過程
memcached收到程序發送的數據後,查找memcached中保存的slab class內空閒chunk的列表,選擇與數據的大小合適的chunk保存數據;
缺點:由於chunk的大小是固定的,將100字節的數據緩存到128字節的chunk,會造成28字節的內存空間浪費;
growth factor(生長因子):爲了儘量減少內存空間的浪費,可以根據緩存數據的大小爲slab指定生長因子,用於控制slab class之間的差異(使用memcached -f指定),默認爲1.25,如第一組slas class的chunk大小爲88字節,第二組slab class的chunk大小爲112字節,第三組爲144字節;在該選項出現之前,該因子爲2,被稱爲“powers of 2”策略;
memcached刪除機制
memcached類似於磁盤的存儲方式,數據刪除或超時後不會從內存中刪除,而是修改它的狀態(類似於inode map,客戶端自此將無法查看數據),memcached讓新的數據可以重複使用該chunk;
lazy expiration:memcached不會檢查緩存記錄是否過期,而是在get時查看緩存記錄的時間戳,查看是否過期;所以,memcached不會在過期檢查上耗費cpu資源;
memcached分佈式算法
當有多臺memcached服務器時,客戶端程序使用的算法主要有以下兩種
根據餘數計算分散:根據服務器臺數的餘數進行分散,通過計算對"鍵"的整數哈希值,然後再除以服務器的臺數,根據其餘數來選擇服務器;
缺點:添加或刪除服務器時,餘數會發生鉅變,將無法獲取與數據保存時相同的服務器,從而影響緩存的命中率,因此緩存重組的代價相當大;
一致性hash算法(Consistent Hashing):首先計算出memcached服務器的的hash值,並將其放入到0~2的32次方的圓上,然後用同樣的方法計算出"鍵"的hash值,並映射到圓上,然後從數據映射的位置開始順時針查找,將數據保存在找到的第一臺服務器上;如果超過2的32次方仍然找不到服務器,則保存在第一臺服務器上;
優點
1,添加或刪除服務器,只有從增刪節點的位置到逆時針的第一臺服務器這個範圍內的鍵受到影響;
2,爲了避免服務器映射點的分佈不均勻,一致性hash算法採用了虛擬節點,爲每個物理服務器分配100-200個虛擬節點放在圓上,虛擬節點映射到物理服務器,每個存放在虛擬節點上的緩存實際上都是存放在物理節點上,這樣就能最大限度的減小分佈不均勻;計算公式"(1-n/(n+m))*100",n是原有服務器臺數,m是增加服務器的臺數;
給予memcached多大內存
1,在32位系統中,每個進程最多隻能用2G內存;
2,-m指定的內存爲memcached保存數據使用的大小,不包括"slab alloctor"自身佔用的內存和爲了保存數據而使用的管理空間,因此memcached實際使用的內存會大於指定內存;
3,由於實際使用的內存會大於指定的內存,因此需要確保分配給memcached內存後,不會引發swap(如服務器4G內存,指定memcached使用3G內存);
安裝memcached
服務器IP地址:192.168.159.130;
操作系統:CentOS 6.4 x86 (已安裝開發工具);
同步時鐘:ntpdate time.windwos.com
創建一個memcached用的系統用戶:useradd -r -u 112 -M -s /sbin/nologin memcached
memcached默認監聽端口:11211 tcp/udp;
安裝過程
1,依賴庫libevent
下載地址:https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent-2.0.21
make
make install
ln -s /usr/local/libevent-2.0.21 /usr/local/libevent
2,編譯安裝memcached
下載地址:http://memcached.org/files/memcached-1.4.20.tar.gz;
tar xf memcached-1.4.20.tar.gz
cd memcached-1.4.20
./configure --prefix=/usr/local/memcached-1.4.20 --with-libevent=/usr/local/libevent-2.0.21
make
make install
ln -s /usr/local/memcached-1.4.20 /usr/local/memcached
3,啓動memcached
/usr/local/memcached/bin/memcached -u memcached -d
4,memcached命令的常用選項
-l <ip_addr> 指定進程監聽的地址;
-d 以服務(daemon)模式運行在後臺;
-u nobody 以指定的用戶身份運行memcached進程;
-m 64m 用於緩存數據的最大內存空間,單位爲MB,默認爲64MB,建議指定的內存大小不應該太大(2G-3G左右);
-c 1024 最大支持的併發連接數,默認爲1024;
-p 11211 指定監聽的TCP端口,默認爲11211;
-U 11211 指定監聽的UDP端口,默認爲11211,0表示關閉UDP端口;
-t 4 用於處理入站請求的最大線程數,僅在memcached編譯時開啓了支持線程纔有效;
-f 1.25 設定Slab Allocator定義預先分配內存空間大小固定的塊時使用的增長因子,默認爲1.25;
-M 當內存空間不夠使用時返回錯誤信息,而不是按LRU算法進行操作;
-n 指定最小的slab chunk大小,單位是字節;
-S 啓用sasl進行用戶認證;
-v 顯示調試信息,-vv或-vvv可以顯示更詳細;
-h 獲取命令幫助;
memcached數據管理命令
存儲類命令
set 設置一個緩存,無論鍵是否存在;
add 新增,當鍵不存在時使用;
replace 替換,替換鍵中的數據;
append 在已有緩存後面附加值;
prepend 在已有緩存前面加值;
獲取數據類命令
get 指定鍵
delete 清除
incr 原有緩存中的數值加1或指定的數值;
decr 原有緩存中的數值減1或指定的數值;
統計類命令
stats和stats items 查看緩存數據的信息;
stats slabs 查看slabs的佔用情況;
stats sizes 查看空間的使用情況;
清理命令: flush_all 清空緩存;
使用telnet測試memcached
telnet 192.168.159.130 11211
示例
add命令:
add keyname flag timeout datasize ketname:鍵名 flag:標記,通常爲0; timeout:超時時長(秒,如果不指定按照LRU計算) datasize:字符的個數;
如:
add mykey 0 10 12
Hello world!
get命令:get keyname
如:
get mykey
VALUE mykey 0 12
Hello world!
END
append命令:append keyname flag timeout datasize
如:
append mykey 0 100 5
hello
quit:退出命令;
在PHP服務器上安裝php的memcache擴展
服務器IP:192.168.159.129
操作系統:CentOS 6.4 x86 (已安裝開發工具);
PHP版本:php-5.4.26(編譯安裝)
軟件下載地址:http://pecl.php.net/get/memcache-2.2.7.tgz;
首先同步系統時鐘:ntpdate time.windows.com
安裝步驟
1 tar xf memcache-2.2.7.tgz
2 cd memcache-2.2.7
3 /usr/local/php-5.4.26/bin/phpize
4 ./configure --with-php-config=/usr/local/php-5.4.26/bin/php-config --enable-memcache
5 make
6 make install
配置php載入模塊
vim /etc/php.ini
extension=/usr/local/php-5.4.26/lib/php/extensions/no-debug-zts-20100525/memcache.so 在extension位置新增該行;
保存退出;
重啓php-fpm服務;
客戶端連接memcached使用的庫
php
memcache
memcached(庫的名稱叫memcached,而不是代表memcached服務器)
perl
cache:memcached
c/c++
libmemcached
memcached的監控工具
memadmin:使用php開發的一個工具,類似於phpMyadmin;
下載地址:http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz;
安裝方式:將tar.gz直接解壓到服務器的網頁文件存放目錄中即可;
libmemcached:命令行的客戶端管理工具;
下載地址:https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz;
安裝過程
1 tar xf libmemcached-1.0.18.tar.gz
2 cd libmemcached-1.0.18
3 ./configure --prefix=/usr/local/libmemcached-1.0.18
4 make
5 make install
添加到系統庫的搜素路徑
1 vim /etc/ld.so.conf.d/libmemcached.conf
2 /usr/local/libmemcached-1.0.18/lib/ 新增此行;
3 保存退出
4 ldconfig
添加到頭文件的搜索路徑
1 ln -s /usr/local/libmemcached-1.0.18/include /usr/include/libmemcached
修改PATH的搜索路勁
1 vim /etc/profile.d/path.sh
2 export PATH=$PATH:/usr/local/libmemcached-1.0.18/bin 新增該行
3 chmod +x /etc/profile.d/path.sh
4 source /etc/profile
常用命令
memcat --servers=192.168.159.130:11211 mykey 查看鍵的值;
memstat --servers=192.168.159.130:11211 查看服務器的狀態;
memping --servers=192.168.159.130:11211 檢測服務器是否在線;
memslap --servers=192.168.159.130:11211 產生一個對memcached服務器的負載,用於測試服務器性能;
注:以上命令可使用"-h"獲取幫助;
聲明:本文爲學習筆記,內容參考多方資料,如涉及版權問題,請告知本人,謝謝!