1、memecached介紹

是一個(gè)開源的,高性能的內(nèi)存緩存軟件,通過在事先規(guī)劃好的內(nèi)存空間中臨時(shí)緩存數(shù)據(jù)庫中的各類數(shù)據(jù),以達(dá)到減少業(yè)務(wù)對(duì)數(shù)據(jù)庫的直接高并發(fā)訪問,從而達(dá)到提升數(shù)據(jù)庫的訪問性能,加速動(dòng)態(tài)服務(wù)的能力。
memcache是基于libevent的事件處理,利用這個(gè)庫進(jìn)行異步事件處理。
2、memecached在企業(yè)中的應(yīng)用
1)作為數(shù)據(jù)庫的前端緩存應(yīng)用,完整緩存,熱點(diǎn)緩存
2)作為集群的session會(huì)話共享存儲(chǔ)
3、memecached服務(wù)在企業(yè)業(yè)務(wù)中的工作流程
1)當(dāng)web程序訪問后端數(shù)據(jù)庫時(shí)會(huì)優(yōu)先訪問memcached內(nèi)存緩存,如果緩存命中數(shù)據(jù)就直接獲取數(shù)據(jù)返回給前端用戶,如果沒有命中數(shù)據(jù),再由程序請(qǐng)求后端數(shù)據(jù)庫服務(wù)器,獲取對(duì)應(yīng)數(shù)據(jù)后,返回給前端用戶并將數(shù)據(jù)存放到memcached內(nèi)存中進(jìn)行緩存,等待下次請(qǐng)求訪問。
2)當(dāng)程序更新,修改或刪除數(shù)據(jù)庫中已有的數(shù)據(jù)時(shí),會(huì)同時(shí)發(fā)送請(qǐng)求通知memcached已經(jīng)緩存過的同一個(gè)ID內(nèi)存失效,從而保證memcache中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)一致。
3)數(shù)據(jù)庫插件可以在寫入更新數(shù)據(jù)庫后,自動(dòng)將更新數(shù)據(jù)推送給memcached緩存起來。
4、memcached服務(wù)分布式集群的實(shí)現(xiàn)
memcached集群中,每個(gè)memcache服務(wù)器互不通信,都是個(gè)體的,每個(gè)服務(wù)器只管理自己服務(wù)器的數(shù)據(jù),所有memcached服務(wù)器的緩存的數(shù)據(jù)總和才是數(shù)據(jù)庫中的整個(gè)數(shù)據(jù)。
1)程序端實(shí)現(xiàn):程序加載所有memcached的ip列表,通過對(duì)key做hash(一致性哈希)
2)負(fù)載均衡器:(LVS keplaved)
一致性哈希:保證每個(gè)對(duì)象只請(qǐng)求一個(gè)對(duì)應(yīng)的服務(wù)器,而且當(dāng)節(jié)點(diǎn)宕機(jī)后保證數(shù)據(jù)更新的最小化。
5、memcached服務(wù)特點(diǎn)及工作原理
1)完全基于內(nèi)存的
2)節(jié)點(diǎn)之間相互獨(dú)立
3)基于異步I/O模型,使用libevent作為事件通知機(jī)制
4)緩存數(shù)據(jù)以key/value對(duì)形式存在的
5)c/s模式架構(gòu),c語言編寫,總代碼為2000多行
6)全部數(shù)據(jù)存儲(chǔ)在內(nèi)存中,無持久性存儲(chǔ)設(shè)計(jì),重啟服務(wù)數(shù)據(jù)會(huì)丟失。
7)可以對(duì)存儲(chǔ)數(shù)據(jù)設(shè)置過期時(shí)間,服務(wù)本身不會(huì)監(jiān)控過期,而是訪問的時(shí)候查看key的時(shí)間戳判斷是否過期。
8)memcached內(nèi)存分配機(jī)制是對(duì)特定的內(nèi)存進(jìn)行分塊,再把多個(gè)分塊進(jìn)行分組
6、memcached內(nèi)存管理機(jī)制
malloc的全稱是memory allocaion,中文叫動(dòng)態(tài)內(nèi)存分配,當(dāng)無法知道內(nèi)存具體位置時(shí),想要綁定內(nèi)存空間,就需要用到動(dòng)態(tài)的分配內(nèi)存。
早期的memcached內(nèi)存管理方式是通過malloc分配的內(nèi)存,使用完后回收內(nèi)存會(huì)產(chǎn)生碎片,會(huì)降低操作系統(tǒng)對(duì)內(nèi)存的管理,加重操作系統(tǒng)內(nèi)存管理器的負(fù)擔(dān),會(huì)導(dǎo)致操作系統(tǒng)比memcached進(jìn)程本地還慢,為了解決上述問題,slab allocator內(nèi)存分配機(jī)制就誕生了。
Slab Allocation機(jī)制原理是按照預(yù)先規(guī)定的大小,將分配給memcached的內(nèi)存分割成特定長度的內(nèi)存塊,再把尺寸相同的內(nèi)存塊分成組,這些內(nèi)存塊不會(huì)釋放,可以重復(fù)利用。
memcached服務(wù)器中保存著slab內(nèi)空閑chunk的列表,根據(jù)該列表選擇chunk,然后將數(shù)據(jù)存儲(chǔ)在其中,當(dāng)有數(shù)據(jù)存入時(shí),memcached會(huì)根據(jù)數(shù)據(jù)的大小,選擇最合適的數(shù)據(jù)大小的slab分配一個(gè)能存儲(chǔ)下這個(gè)數(shù)據(jù)的最小內(nèi)存塊(chunk).例如:有100字節(jié)的數(shù)據(jù)就會(huì)分配存入112字節(jié)的一個(gè)內(nèi)存塊中,這樣就會(huì)浪費(fèi)掉12字節(jié)的內(nèi)存空間,這是slab allocation機(jī)制的一個(gè)缺點(diǎn)。
1)slab allocation的主要術(shù)語:
page:分配給slab的內(nèi)存空間,默認(rèn)是1MB,分配給slab之后根據(jù)slab的大小切分成chunk
chunk:用于緩存數(shù)據(jù)的內(nèi)存空間或內(nèi)存塊
slab class:特定大小的多個(gè)chunk的集合或組
2)memcached slab allocation內(nèi)存管理機(jī)制優(yōu)化:
在啟動(dòng)時(shí)指定"-f"參數(shù),能控制內(nèi)存組之間的大小差異,在應(yīng)用中使用memcached時(shí),通常不重新設(shè)置這個(gè)參數(shù),默認(rèn)值為1.25進(jìn)行部署,如果想優(yōu)化memcached對(duì)內(nèi)存的使用,可以考慮重新計(jì)算數(shù)據(jù)的預(yù)期平均長度,調(diào)整這個(gè)參數(shù)來獲取合適的設(shè)置值。
-f <factor> chunk size growth factor(default:1.25)
例如:
使用2時(shí),chunk的大小會(huì)以2的倍數(shù)增加:
memcached -m 512m -d -u root -c 8192 -f 2 -vv [root@zxq tmp]# slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 192 perslab 5461 slab class 3: chunk size 384 perslab 2730 slab class 4: chunk size 768 perslab 1365 slab class 5: chunk size 1536 perslab 682 slab class 6: chunk size 3072 perslab 341 slab class 7: chunk size 6144 perslab 170 slab class 8: chunk size 12288 perslab 85 slab class 9: chunk size 24576 perslab 42 slab class 10: chunk size 49152 perslab 21 slab class 11: chunk size 98304 perslab 10 slab class 12: chunk size 196608 perslab 5 slab class 13: chunk size 393216 perslab 2 slab class 14: chunk size 1048576 perslab 1 <26 server listening (auto-negotiate) <27 server listening (auto-negotiate) <28 send buffer was 124928, now 268435456 <29 send buffer was 124928, now 268435456 <28 server listening (udp) <29 server listening (udp) <28 server listening (udp) <29 server listening (udp) <28 server listening (udp) <29 server listening (udp) <28 server listening (udp) <29 server listening (udp)使用1.25時(shí),chunk間隔會(huì)很小,存儲(chǔ)小文件時(shí)內(nèi)存浪費(fèi)會(huì)減少很多:
[root@zxq tmp]# memcached -m 512m -d -u root -c 8192 -f 1.25 -vv [root@zxq tmp]# slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 slab class 7: chunk size 384 perslab 2730 slab class 8: chunk size 480 perslab 2184 slab class 9: chunk size 600 perslab 1747 slab class 10: chunk size 752 perslab 1394 slab class 11: chunk size 944 perslab 1110 slab class 12: chunk size 1184 perslab 885 slab class 13: chunk size 1480 perslab 708 slab class 14: chunk size 1856 perslab 564 slab class 15: chunk size 2320 perslab 451 slab class 16: chunk size 2904 perslab 361 slab class 17: chunk size 3632 perslab 288 slab class 18: chunk size 4544 perslab 230 slab class 19: chunk size 5680 perslab 184 slab class 20: chunk size 7104 perslab 147 slab class 21: chunk size 8880 perslab 118 slab class 22: chunk size 11104 perslab 94 slab class 23: chunk size 13880 perslab 75 slab class 24: chunk size 17352 perslab 60 slab class 25: chunk size 21696 perslab 48 slab class 26: chunk size 27120 perslab 38 slab class 27: chunk size 33904 perslab 30 slab class 28: chunk size 42384 perslab 24 slab class 29: chunk size 52984 perslab 19 slab class 30: chunk size 66232 perslab 15 slab class 31: chunk size 82792 perslab 12 slab class 32: chunk size 103496 perslab 10 slab class 33: chunk size 129376 perslab 8 slab class 34: chunk size 161720 perslab 6 slab class 35: chunk size 202152 perslab 5 slab class 36: chunk size 252696 perslab 4 slab class 37: chunk size 315872 perslab 3 slab class 38: chunk size 394840 perslab 2 slab class 39: chunk size 493552 perslab 2 slab class 40: chunk size 616944 perslab 1 slab class 41: chunk size 771184 perslab 1 slab class 42: chunk size 1048576 perslab 1 failed to listen on TCP port 11211: Address already in use7、memcached對(duì)象刪除原來與cache機(jī)制
memecached主要的cache機(jī)制是LRU最近最少用的算法,加上item過期失效,當(dāng)存儲(chǔ)數(shù)據(jù)到memcached中,可指定該數(shù)據(jù)在緩存中可以呆多久,如果memcached的內(nèi)存不夠用了,過期的slabs會(huì)優(yōu)先被替換,接著就會(huì)輪到最老的未被使用的slabs。在某些情況下(完整緩存),如果不想使用LRU算法,可以通過"-M"參數(shù)來啟動(dòng)memcached,這樣,memcahced在內(nèi)存耗盡時(shí),會(huì)返回一個(gè)報(bào)錯(cuò)信息。
-M return error on memeory exhausted(rather than removing items)
8、memcached服務(wù)端的安裝
1)服務(wù)端的安裝
memcached下載地址:http://www.danga.com/memcached/
memcached其他下載地址:http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
libevent下載地址:http://monkey.org/~provos/libevent/
網(wǎng)友安裝參考:http://instance.iteye.com/blog/1691705
由于memcache是基于libevent事件庫文件的,所以要先安裝libevetn:
wget https://github.com/downloads/libevent/libevent/libevent-1.4.13-stable.tar.gz tar zxf libevent-1.4.13-stable.tar.gz cd libevent-1.4.13-stable ./configure make make install cd ..安裝memcached:
wget http://memcached.org/files/old/memcached-1.4.13.tar.gz tar zxf memcached-1.4.13.tar.gz cd memcached-1.4.13 ./configure make make install cd ..啟動(dòng)報(bào)錯(cuò)處理:
[root@zxq tools]# memcached -m 1m -p 11212 -d -c 8192 memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 解決方法:就是讓系統(tǒng)能加載到libevent庫文件。 echo "/usr/local/lib" >> /etc/ld.so.conf ldconfig2)啟動(dòng)memcached服務(wù):
[root@zxq memcached-1.4.13]# which memcached /usr/local/bin/memcached memcached -m 16m -p 11212 -d -u root -c 8192 lsof -i :11212 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME memcached 46673 root 26u IPv4 244455 0t0 TCP *:11212 (LISTEN) memcached 46673 root 27u IPv6 244456 0t0 TCP *:11212 (LISTEN) memcached 46673 root 28u IPv4 244459 0t0 UDP *:11212 memcached 46673 root 29u IPv6 244460 0t0 UDP *:11212 netstat -lntup|grep memcached tcp 0 0 0.0.0.0:11212 0.0.0.0:* LISTEN 46673/memcached tcp 0 0 :::11212 :::* LISTEN 46673/memcached udp 0 0 0.0.0.0:11212 0.0.0.0:* 46673/memcached udp 0 0 :::11212 :::* 46673/memcached ps -ef|grep memcached root 46673 1 0 17:15 ? 00:00:00 memcached -m 16m -p 11212 -d -u root -c 81923)memcached相關(guān)啟動(dòng)參數(shù)說明:
-p 指定memcached服務(wù)監(jiān)聽TCP端口號(hào),默認(rèn)為11211
-m 指定memcached服務(wù)可以緩存數(shù)據(jù)的大內(nèi)存,默認(rèn)為64MB
-u 運(yùn)行memcached的用戶
-d 作為守護(hù)進(jìn)程在后臺(tái)運(yùn)行
-c 大的并發(fā)連接數(shù),默認(rèn)是1024,安裝服務(wù)器的并發(fā)訪問量來設(shè)置
-vv 以very vrebose模式啟動(dòng),調(diào)試信息和錯(cuò)誤輸出到控制臺(tái)
-P 設(shè)置保存memcached的PID文件
-l 指定監(jiān)聽的服務(wù)器ip地址
-f 調(diào)優(yōu)因子
-M 不使用LRU算法刪除緩存,當(dāng)內(nèi)存不夠用時(shí)會(huì)報(bào)錯(cuò)
其他選擇,通過memcached -h查看
memcached -m 15m -d -u root -p 11213 -M -c 8192 -P /var/run/memcached.pid -f 1.25 -l 127.0.0.14)存儲(chǔ)和查看數(shù)據(jù)
語法:<command name> <key> <flags> <exptime> <bytes>\r\n<data block>\r
set k01 0 0 10\r\n9999999999\r
<command name> set/add/replace
set 存儲(chǔ)此數(shù)據(jù),如果建存在,則之前的值將被替換
add 存儲(chǔ)此數(shù)據(jù),只在服務(wù)器未保留此鍵值對(duì)數(shù)據(jù)時(shí)
replace 存儲(chǔ)此數(shù)據(jù),只在服務(wù)器曾保留此鍵值的數(shù)據(jù)時(shí)
<key> 是接下來的客戶端所要求存儲(chǔ)的數(shù)據(jù)的鍵值
<flags> 是在取回內(nèi)容時(shí),與數(shù)據(jù)和發(fā)送塊一同保存服務(wù)器上的任意16位無符號(hào)整型(十進(jìn)制)客戶端可以用來作為“位域”來存儲(chǔ)一些特定的信息,它對(duì)服務(wù)器是不透明的。
<exptime> 是終止時(shí)間,如果為0,該項(xiàng)永不過期,雖然它可能被刪除,以便為其他緩存項(xiàng)目騰出位置,如果為非0,到達(dá)終止時(shí)間后,客戶端再無法獲取到該項(xiàng)內(nèi)容。
<bytes> 是隨后的數(shù)據(jù)區(qū)塊的字節(jié)長度,不包括用于分野的"\r\n"它可以是0,但后面會(huì)跟隨一個(gè)空的數(shù)據(jù)塊。
<data block>\r\n <data block>是大段的8位數(shù)據(jù),其長度由前面的命令行中的<bytes>指定
使用printf打印數(shù)據(jù),使用nc連接到memcached
set設(shè)置key為k01,value為999999999,主要指定字符串大小要與后面的數(shù)據(jù)對(duì)應(yīng)上。
[root@zxq lib]# printf "set k01 0 0 10\r\n9999999999\r\n"|nc 127.0.0.1 11212 STOREDget查看key k01的value:
[root@zxq lib]# printf "get k01\r\n"|nc 127.0.0.1 11212 VALUE k01 0 10 9999999999 ENDdelete刪除key k01的鍵值對(duì)數(shù)據(jù):
[root@zxq lib]# printf "delete k01\r\n"|nc 127.0.0.1 11212 DELETEDadd添加鍵值,緩存中不存在值時(shí),如果存在值會(huì)響應(yīng)NOT_STORED
[root@zxq bin]# printf "set key01 0 0 2\r\nab\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "add key01 0 0 2\r\nab\r\n"|nc 127.0.0.1 11213 NOT_STOREDreplace當(dāng)鍵值存在時(shí),replace命令才會(huì)替換緩存中的鍵,如果緩存中不存在鍵,會(huì)報(bào)NOT_STORED錯(cuò)誤響應(yīng):
[root@zxq bin]# printf "replace key01 0 0 2\r\n88\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "replace key02 0 0 2\r\n99\r\n"|nc 127.0.0.1 11213 NOT_STOREDgets與get類似,只是會(huì)返回一個(gè)鍵值對(duì)的標(biāo)識(shí)值
[root@zxq bin]# printf "set key03 0 0 5\r\n55555\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 5 55555 END [root@zxq bin]# printf "get key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 55555 ENDcas用于設(shè)置鍵值對(duì),與set相似的語法,但會(huì)使用gets執(zhí)行后的額外標(biāo)識(shí)值,來更改上次讀取的鍵值對(duì),如果標(biāo)識(shí)值不對(duì)將報(bào)錯(cuò):
[root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 7 88888 END [root@zxq bin]# printf "cas key03 0 0 5 8\r\n99999\r\n"|nc 127.0.0.1 11213 EXISTS [root@zxq bin]# printf "cas key03 0 0 5 7\r\n99999\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 8 99999 END5)stats查看memcached當(dāng)前實(shí)例信息:
[root@zxq tmp]# printf "stats \r\n"|nc 127.0.0.1 11212 STAT pid 46673 進(jìn)程ID STAT uptime 25336 服務(wù)器運(yùn)行秒數(shù) STAT time 1494173893 服務(wù)器當(dāng)前unix時(shí)間戳 STAT version 1.4.13 memcached版本 STAT libevent 1.4.13-stable libevent版本 STAT pointer_size 64 操作系統(tǒng)位數(shù),64位 STAT rusage_user 0.642902 進(jìn)程累計(jì)用戶時(shí)間 STAT rusage_system 0.303953 進(jìn)程累計(jì)系統(tǒng)時(shí)間 STAT curr_connections 10 當(dāng)前打開連接數(shù) STAT total_connections 25 memecached運(yùn)行以來連接總數(shù) STAT connection_structures 11 memcached分配的連接結(jié)構(gòu)數(shù) STAT reserved_fds 20 內(nèi)部使用的FD數(shù) STAT cmd_get 7 執(zhí)行g(shù)et命令總數(shù) STAT cmd_set 3 執(zhí)行set命令總數(shù) STAT cmd_flush 0 執(zhí)行flush_all命令總數(shù) STAT cmd_touch 0 touch命令請(qǐng)求總數(shù) STAT get_hits 3 get命中次數(shù) STAT get_misses 4 get未命中次數(shù) STAT delete_misses 0 delete未命中次數(shù) STAT delete_hits 1 delete命中次數(shù) STAT incr_misses 0 incr未命中次數(shù) STAT incr_hits 0 incr命中次數(shù) STAT decr_misses 0 decr未命中次數(shù) STAT decr_hits 0 decr命中次數(shù) STAT cas_misses 0 cas未命中次數(shù) STAT cas_hits 0 cas命中次數(shù) STAT cas_badval 0 使用擦拭次數(shù) STAT touch_hits 0 touch命中次數(shù) STAT touch_misses 0 touch未命中次數(shù) STAT auth_cmds 0 認(rèn)證命令處理次數(shù) STAT auth_errors 0 認(rèn)證失敗數(shù)目 STAT bytes_read 358 讀取字節(jié)總數(shù) STAT bytes_written 160 寫入字節(jié)總數(shù) STAT limit_maxbytes 16777216 分配的內(nèi)存總數(shù)(字節(jié)) STAT accepting_conns 1 目前接受的連接數(shù) STAT listen_disabled_num 0 失效的監(jiān)聽數(shù) STAT threads 4 線程數(shù) STAT conn_yields 0 連接操作主動(dòng)放棄數(shù)目 STAT hash_power_level 16 hash表等級(jí) STAT hash_bytes 524288 當(dāng)前hash表大小 STAT hash_is_expanding 0 hash表正在擴(kuò)展 STAT expired_unfetched 0 已過期但未獲取大對(duì)象數(shù)目 STAT evicted_unfetched 0 已驅(qū)逐但未獲取大對(duì)象數(shù)目 STAT bytes 166 當(dāng)前存儲(chǔ)占用字節(jié)數(shù) STAT curr_items 2 當(dāng)前存儲(chǔ)的數(shù)據(jù)總個(gè)數(shù) STAT total_items 3 啟動(dòng)以來存儲(chǔ)的數(shù)據(jù)總數(shù) STAT evictions 0 LRU釋放的對(duì)象數(shù)目 STAT reclaimed 0 已過期的數(shù)據(jù)條目來存儲(chǔ)新數(shù)據(jù)的數(shù)目 ENDstats items 查看items行內(nèi)容:
[root@zxq bin]# printf "stats items\r\n"|nc 127.0.0.1 11213 STAT items:1:number 4 該slab中對(duì)象數(shù)(不包含過期對(duì)象) STAT items:1:age 1941 LRU隊(duì)列中最老對(duì)象的過期時(shí)間 STAT items:1:evicted 0 LRU釋放對(duì)象數(shù) STAT items:1:evicted_nonzero 0 設(shè)置了非0時(shí)間的LRU釋放對(duì)象數(shù) STAT items:1:evicted_time 0 最后一次LRU釋放的對(duì)象存在時(shí)間 STAT items:1:outofmemory 0 不能存儲(chǔ)對(duì)象次數(shù) STAT items:1:tailrepairs 0 修復(fù)slabs次數(shù) STAT items:1:reclaimed 0 使用過期對(duì)象空間存儲(chǔ)對(duì)象次數(shù) STAT items:1:expired_unfetched 0 已過期但未獲取的對(duì)象數(shù)目 STAT items:1:evicted_unfetched 0 已驅(qū)逐但未獲取的對(duì)象數(shù)目 ENDstats cachedump slabs_id limit_num,slabs_id是由stats items返回的值,也就是項(xiàng)目組號(hào),limit_num返回的記錄數(shù),0為返回所有記錄,可以兩者結(jié)合遍歷memcache所有記錄數(shù)據(jù):
[root@zxq bin]# printf "stats items\r\n"|nc 127.0.0.1 11213 STAT items:1:number 5 STAT items:1:age 2589 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 0 STAT items:1:expired_unfetched 0 STAT items:1:evicted_unfetched 0 STAT items:2:number 1 STAT items:2:age 3 STAT items:2:evicted 0 STAT items:2:evicted_nonzero 0 STAT items:2:evicted_time 0 STAT items:2:outofmemory 0 STAT items:2:tailrepairs 0 STAT items:2:reclaimed 0 STAT items:2:expired_unfetched 0 STAT items:2:evicted_unfetched 0 END [root@zxq bin]# printf "stats cachedump 1 0\r\n"|nc 127.0.0.1 11213 ITEM key04 [15 b; 1494188606 s] ITEM key03 [5 b; 1494188606 s] ITEM key01 [2 b; 1494188606 s] ITEM userID [5 b; 1494188606 s] ITEM userid [5 b; 1494188606 s] END [root@zxq bin]# printf "stats cachedump 2 0\r\n"|nc 127.0.0.1 11213 ITEM key05 [35 b; 1494188606 s] ENDstats slabs顯示各個(gè)slab的信息,包括chunk的大小,數(shù)目和使用情況等:
printf "stats slabs\r\n"|nc 127.0.0.1 11213 STAT 1:chunk_size 96 chunk大小(byte) STAT 1:chunks_per_page 10922 每個(gè)page的chunk數(shù)量 STAT 1:total_pages 1 page數(shù)量 STAT 1:total_chunks 10922 chunk總數(shù)量(chunks_per_page*total_pages) STAT 1:used_chunks 6 已被分配的chunk數(shù)量 STAT 1:free_chunks 1 過期數(shù)據(jù)空出的chunk數(shù) STAT 1:free_chunks_end 10915 從未被使用過的chunk數(shù) STAT 1:mem_requested 481 請(qǐng)求存儲(chǔ)的字節(jié)數(shù) STAT 1:get_hits 6 get命令命中數(shù) STAT 1:cmd_set 17 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 3 STAT 1:cas_badval 1 cas數(shù)據(jù)類型錯(cuò)誤數(shù) STAT 1:touch_hits 0 touch命令命中數(shù) STAT 2:chunk_size 120 STAT 2:chunks_per_page 8738 STAT 2:total_pages 1 STAT 2:total_chunks 8738 STAT 2:used_chunks 2 STAT 2:free_chunks 0 STAT 2:free_chunks_end 8736 STAT 2:mem_requested 207 STAT 2:get_hits 0 STAT 2:cmd_set 3 STAT 2:delete_hits 0 STAT 2:incr_hits 0 STAT 2:decr_hits 0 STAT 2:cas_hits 0 STAT 2:cas_badval 0 STAT 2:touch_hits 0 STAT active_slabs 2 STAT total_malloced 2097072 ENDstats settings 可以查看一些memcached設(shè)置例如線程數(shù)
[root@zxq bin]# printf "stats settings\r\n"|nc 127.0.0.1 11213 STAT maxbytes 15728640 STAT maxconns 8192 STAT tcpport 11213 STAT udpport 11213 STAT inter 127.0.0.1 STAT verbosity 0 STAT oldest 3537 STAT evictions off STAT domain_socket NULL STAT umask 700 STAT growth_factor 1.25 STAT chunk_size 48 STAT num_threads 4 STAT num_threads_per_udp 4 STAT stat_key_prefix : STAT detail_enabled no STAT reqs_per_event 20 STAT cas_enabled yes STAT tcp_backlog 1024 STAT binding_protocol auto-negotiate STAT auth_enabled_sasl no STAT item_size_max 1048576 STAT maxconns_fast no STAT hashpower_init 0 STAT slab_reassign no STAT slab_automove no ENDstats sizes 查看存在的item大小和個(gè)數(shù)
[root@zxq bin]# printf "stats sizes\r\n"|nc 127.0.0.1 11213 STAT 96 6 STAT 128 2 ENDstats reset 清理統(tǒng)計(jì)數(shù)據(jù)
printf "stats reset\r\n"|nc 127.0.0.1 11213flush_all用于清理存儲(chǔ)中的所有鍵值對(duì):
[root@zxq bin]# printf "flush_all\r\n"|nc 127.0.0.1 11213 OKappend 將數(shù)據(jù)追加到當(dāng)前緩存數(shù)據(jù)的之后,當(dāng)緩存數(shù)據(jù)存在時(shí)才存儲(chǔ)
[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 25 aaaaabbbbbcccccdddddeeeee END [root@zxq bin]# printf "append key07 0 0 5\r\n_@@@#\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 30 aaaaabbbbbcccccdddddeeeee_@@@# ENDprepend 將數(shù)據(jù)追加到當(dāng)前緩存數(shù)據(jù)的之前,當(dāng)緩存數(shù)據(jù)存在時(shí)才存儲(chǔ)
[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 30 aaaaabbbbbcccccdddddeeeee_@@@# END [root@zxq bin]# printf "prepend key07 0 0 5\r\n#####\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 35 #####aaaaabbbbbcccccdddddeeeee_@@@# END也可以使用Telnet連接memcached進(jìn)入交互式操作
9、客戶端的安裝
安裝lamp/LNMP環(huán)境,要求apache或nginx能解析PHP文件,才能繼續(xù)安裝客戶端
安裝memcache的php的客戶端及memcache的擴(kuò)展,下載php擴(kuò)展:http://pecl.php.net/package/memcache選擇要下載的memcache版本。java程序一樣需要客戶端(resion,tomcat),但不會(huì)像php一樣編譯。
在PHP服務(wù)器上安裝memcache客戶端:
wget http://pecl.php.net/get/memcache-2.2.5.tgz tar zxf memcache-2.2.5.tgz cd memcache-2.2.5 /usr/local/php/bin/phpize ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir make make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/ [root@zxq memcache-2.2.5]# ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/安裝完會(huì)在此文件中生成memcache.so文件
-rwxr-xr-x 1 root root 260451 5月 7 17:59 memcache.so -rwxr-xr-x 1 root root 589308 5月 4 20:59 opcache.so修改php.ini配置文件:指定memcache.so文件路徑
echo "extension=memcache.so" >> /usr/local/php/etc/php.ini grep ^extension /usr/local/php/etc/php.ini重啟動(dòng)apache服務(wù)使php的配置生效
[root@zxq ~]# apachectl -t Syntax OK [root@zxq ~]# apachectl graceful如果是nginx則重啟動(dòng)php-fpm服務(wù)
打開phpinfo加載網(wǎng)頁,能看到memcache模塊就算成功了!
建立測(cè)試文件,實(shí)現(xiàn)PHP與memcache交換數(shù)據(jù):
<?php $memcache = new memcache; $memcache->connect('10.0.0.4', 11212) or die ("could not connect"); $memcache->set('key001', '123'); $memcache->set('key002', 'abc'); $get_value001 = $memcache->get('key001'); $get_value002 = $memcache->get('key002'); echo $get_value002."<br>"; echo $get_value001; ?>訪問目錄能讀到123,abc,php程序與memcache交互成功!
10、memcache實(shí)現(xiàn)web集群的session會(huì)話保持
修改所有web節(jié)點(diǎn)的php.ini配置文件指定session文件路徑到memcache服務(wù)器上
vim /usr/local/php/etc/php.ini session.save_handler = memcache #指定session存儲(chǔ)方式 session.save_path = "tcp://10.0.0.4:11212" #指定session保存路徑 memcached -m 15m -d -u root -p 11212 -M -c 8192 -P /var/run/memcached.pid -f 1.25 -l 10.0.0.4集群架構(gòu)多服務(wù)器同步session的多種方式:
1)lb層可以做會(huì)話保持,例如
lvs -p
nginx ip_hash
hapoxy cookie insert
PHP,java都可以用
2)軟件層,可以做session復(fù)制,例如
tomcat,resion,couchbase
3)session共享,例如
memcache或其他工具的nosql工具,PHP常用這個(gè)
4)高并發(fā)場(chǎng)景:例如門戶網(wǎng)站用cookies或cookies配合session把用戶級(jí)會(huì)話信息緩存在用戶本地。
11、監(jiān)控memcache需要監(jiān)控的具體指標(biāo)
1)端口11212
2)命中率:STAT get_hits 3 STAT get_misses 4
3)反應(yīng)時(shí)間:STAT uptime 25336
監(jiān)控腳本:
#!/bin/sh [ $# -ne 2 ]&&{ echo "$0 ip port" exit } export key1=key export wwwServerIp=$1 export wwwServerPort=$2 cmd="nc $wwwServerIp $wwwServerPort" printf "delete $key1\r\n" | $cmd >/dev/null 2>&1 sleep 1 printf "set $key1 0 0 6\r\n123\r\n"|$cmd >/dev/null 2>&1 if [ `printf "get $key1\r\n"|$cmd|grep 123|wc -l` -eq 1 ] then echo "mc is alive." exit 0 else echo "mc is dead." exit 2 fi12、memcached調(diào)優(yōu)
計(jì)算item占用空間:
item總大小=鍵長+值長+后綴長+item結(jié)構(gòu)大小(48字節(jié))+8(cas標(biāo)志占用)
如果item_cas標(biāo)志設(shè)置時(shí),會(huì)有8字節(jié)的數(shù)據(jù)
item結(jié)構(gòu)大小:32位系統(tǒng)32字節(jié);64位系統(tǒng)48字節(jié)
例如:
memcached -u root -p 11212 -vv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 slab class 7: chunk size 384 perslab 2730 slab class 8: chunk size 480 perslab 2184 slab class 9: chunk size 600 perslab 1747 slab class 10: chunk size 752 perslab 1394 slab class 11: chunk size 944 perslab 1110 slab class 12: chunk size 1184 perslab 885 printf "set leng 0 0 40\r\n1111111111222222222211111111112222222222\r\n"|nc 127.0.0.1 11212 STORED計(jì)算leng總長度:48+8+4+40=100
所以leng值就會(huì)選擇slab 2的120字節(jié)里來存儲(chǔ)leng數(shù)據(jù):
[root@zxq htdocs]# printf "stats cachedump 2 0\r\n"|nc 127.0.0.1 11212 ITEM leng [40 b; 1494182061 s] END優(yōu)化方案:先估算將要存儲(chǔ)的數(shù)據(jù)大小值,再通過-f選項(xiàng)調(diào)優(yōu)chunk大小,以最小滿足存儲(chǔ)值大小存儲(chǔ)數(shù)據(jù),已達(dá)到最小內(nèi)存浪費(fèi)。
可使用-M啟動(dòng)memcache,不使用LRU算法刪除數(shù)據(jù),因?yàn)長RU不是全局的,而是針對(duì)slab區(qū)域的。可以使用腳本檢測(cè)stats tiems的值,保證內(nèi)存空閑,清除過久未訪問的數(shù)據(jù)。
13、zabbix監(jiān)控實(shí)例:
緩存命中率 = get_hits/cmd_get * 100% ;get_misses的數(shù)字加上get_hits應(yīng)該等于cmd_get
1)配置自動(dòng)發(fā)現(xiàn)腳本
cat memdiscover.sh #!/bin/sh #function:discovery memcache items memcache_discovery () { Memitems=(`/usr/bin/printf "stats\r\n"|nc 127.0.0.1 11212|awk '{print $2}'`) length=${#Memitems[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#ITEMNAME}\":\"${Memitems[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n" }2)配置監(jiān)控腳本
cat memcached-status.conf #!/bin/sh #this is memcached ststus scripts #date 2017-05-08 function status (){ ip=127.0.0.1 port=11212 /usr/bin/printf "stats\r\n"|nc $ip $port } status | grep -w $1 | awk '{print $3}'3)配置web頁面
configureation => Templates => Create template
Template name:memcache_discovery
Groups In groups:nosql
configureation => Templates => memcache_discovery => Discovery => create discovery rule
name:memcache.stats
type:zabbix agent
key:memcache.stats
update interval:30
Fitters:{$ITEMANME}
configureation => Templates => memcache_discovery => item prototypes => create item prototype
name:mem.stat on $1
type:zabbix agent
key:mem.stats[{#ITEMNAME}]
configureation => Templates => memcache_discovery => Graph prototypes => create graph prototype
name:memcache on {#ITEMNAME}
items:Add prototype ==》 memcache_discovery:mem.stats on {#ITEMNAME}
$zabbix_get -s 127.0.0.1 -k mem.stats[get_hits]
61992
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站名稱:memcache配置-創(chuàng)新互聯(lián)
文章分享:http://www.chinadenli.net/article38/djcopp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、面包屑導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站導(dǎo)航、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容