建站服務(wù)器
1、memecached介紹
成都創(chuàng)新互聯(lián)長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為未央企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,未央網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。是一個(gè)開(kāi)源的,高性能的內(nèi)存緩存軟件,通過(guò)在事先規(guī)劃好的內(nèi)存空間中臨時(shí)緩存數(shù)據(jù)庫(kù)中的各類數(shù)據(jù),以達(dá)到減少業(yè)務(wù)對(duì)數(shù)據(jù)庫(kù)的直接高并發(fā)訪問(wèn),從而達(dá)到提升數(shù)據(jù)庫(kù)的訪問(wèn)性能,加速動(dòng)態(tài)服務(wù)的能力。
memcache是基于libevent的事件處理,利用這個(gè)庫(kù)進(jìn)行異步事件處理。
2、memecached在企業(yè)中的應(yīng)用
1)作為數(shù)據(jù)庫(kù)的前端緩存應(yīng)用,完整緩存,熱點(diǎn)緩存
2)作為集群的session會(huì)話共享存儲(chǔ)
3、memecached服務(wù)在企業(yè)業(yè)務(wù)中的工作流程
1)當(dāng)web程序訪問(wèn)后端數(shù)據(jù)庫(kù)時(shí)會(huì)優(yōu)先訪問(wèn)memcached內(nèi)存緩存,如果緩存命中數(shù)據(jù)就直接獲取數(shù)據(jù)返回給前端用戶,如果沒(méi)有命中數(shù)據(jù),再由程序請(qǐng)求后端數(shù)據(jù)庫(kù)服務(wù)器,獲取對(duì)應(yīng)數(shù)據(jù)后,返回給前端用戶并將數(shù)據(jù)存放到memcached內(nèi)存中進(jìn)行緩存,等待下次請(qǐng)求訪問(wèn)。
2)當(dāng)程序更新,修改或刪除數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)時(shí),會(huì)同時(shí)發(fā)送請(qǐng)求通知memcached已經(jīng)緩存過(guò)的同一個(gè)ID內(nèi)存失效,從而保證memcache中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致。
3)數(shù)據(jù)庫(kù)插件可以在寫入更新數(shù)據(jù)庫(kù)后,自動(dòng)將更新數(shù)據(jù)推送給memcached緩存起來(lái)。
4、memcached服務(wù)分布式集群的實(shí)現(xiàn)
memcached集群中,每個(gè)memcache服務(wù)器互不通信,都是個(gè)體的,每個(gè)服務(wù)器只管理自己服務(wù)器的數(shù)據(jù),所有memcached服務(wù)器的緩存的數(shù)據(jù)總和才是數(shù)據(jù)庫(kù)中的整個(gè)數(shù)據(jù)。
1)程序端實(shí)現(xiàn):程序加載所有memcached的ip列表,通過(guò)對(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語(yǔ)言編寫,總代碼為2000多行
6)全部數(shù)據(jù)存儲(chǔ)在內(nèi)存中,無(wú)持久性存儲(chǔ)設(shè)計(jì),重啟服務(wù)數(shù)據(jù)會(huì)丟失。
7)可以對(duì)存儲(chǔ)數(shù)據(jù)設(shè)置過(guò)期時(shí)間,服務(wù)本身不會(huì)監(jiān)控過(guò)期,而是訪問(wèn)的時(shí)候查看key的時(shí)間戳判斷是否過(guò)期。
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)無(wú)法知道內(nèi)存具體位置時(shí),想要綁定內(nèi)存空間,就需要用到動(dòng)態(tài)的分配內(nèi)存。
早期的memcached內(nèi)存管理方式是通過(guò)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)程本地還慢,為了解決上述問(wèn)題,slab allocator內(nèi)存分配機(jī)制就誕生了。
Slab Allocation機(jī)制原理是按照預(yù)先規(guī)定的大小,將分配給memcached的內(nèi)存分割成特定長(zhǎng)度的內(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ù)語(yǔ):
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ù)期平均長(zhǎng)度,調(diào)整這個(gè)參數(shù)來(lái)獲取合適的設(shè)置值。
-f
例如:
使用2時(shí),chunk的大小會(huì)以2的倍數(shù)增加:
memcached-m512m-d-uroot-c8192-f2-vv [root@zxqtmp]#slabclass1:chunksize96perslab10922 slabclass2:chunksize192perslab5461 slabclass3:chunksize384perslab2730 slabclass4:chunksize768perslab1365 slabclass5:chunksize1536perslab682 slabclass6:chunksize3072perslab341 slabclass7:chunksize6144perslab170 slabclass8:chunksize12288perslab85 slabclass9:chunksize24576perslab42 slabclass10:chunksize49152perslab21 slabclass11:chunksize98304perslab10 slabclass12:chunksize196608perslab5 slabclass13:chunksize393216perslab2 slabclass14:chunksize1048576perslab1 <26serverlistening(auto-negotiate) <27serverlistening(auto-negotiate) <28sendbufferwas124928,now268435456 <29sendbufferwas124928,now268435456 <28serverlistening(udp) <29serverlistening(udp) <28serverlistening(udp) <29serverlistening(udp) <28serverlistening(udp) <29serverlistening(udp) <28serverlistening(udp) <29serverlistening(udp)
使用1.25時(shí),chunk間隔會(huì)很小,存儲(chǔ)小文件時(shí)內(nèi)存浪費(fèi)會(huì)減少很多:
[root@zxqtmp]#memcached-m512m-d-uroot-c8192-f1.25-vv [root@zxqtmp]#slabclass1:chunksize96perslab10922 slabclass2:chunksize120perslab8738 slabclass3:chunksize152perslab6898 slabclass4:chunksize192perslab5461 slabclass5:chunksize240perslab4369 slabclass6:chunksize304perslab3449 slabclass7:chunksize384perslab2730 slabclass8:chunksize480perslab2184 slabclass9:chunksize600perslab1747 slabclass10:chunksize752perslab1394 slabclass11:chunksize944perslab1110 slabclass12:chunksize1184perslab885 slabclass13:chunksize1480perslab708 slabclass14:chunksize1856perslab564 slabclass15:chunksize2320perslab451 slabclass16:chunksize2904perslab361 slabclass17:chunksize3632perslab288 slabclass18:chunksize4544perslab230 slabclass19:chunksize5680perslab184 slabclass20:chunksize7104perslab147 slabclass21:chunksize8880perslab118 slabclass22:chunksize11104perslab94 slabclass23:chunksize13880perslab75 slabclass24:chunksize17352perslab60 slabclass25:chunksize21696perslab48 slabclass26:chunksize27120perslab38 slabclass27:chunksize33904perslab30 slabclass28:chunksize42384perslab24 slabclass29:chunksize52984perslab19 slabclass30:chunksize66232perslab15 slabclass31:chunksize82792perslab12 slabclass32:chunksize103496perslab10 slabclass33:chunksize129376perslab8 slabclass34:chunksize161720perslab6 slabclass35:chunksize202152perslab5 slabclass36:chunksize252696perslab4 slabclass37:chunksize315872perslab3 slabclass38:chunksize394840perslab2 slabclass39:chunksize493552perslab2 slabclass40:chunksize616944perslab1 slabclass41:chunksize771184perslab1 slabclass42:chunksize1048576perslab1 failedtolistenonTCPport11211:Addressalreadyinuse
7、memcached對(duì)象刪除原來(lái)與cache機(jī)制
memecached主要的cache機(jī)制是LRU最近最少用的算法,加上item過(guò)期失效,當(dāng)存儲(chǔ)數(shù)據(jù)到memcached中,可指定該數(shù)據(jù)在緩存中可以呆多久,如果memcached的內(nèi)存不夠用了,過(guò)期的slabs會(huì)優(yōu)先被替換,接著就會(huì)輪到最老的未被使用的slabs。在某些情況下(完整緩存),如果不想使用LRU算法,可以通過(guò)-M參數(shù)來(lái)啟動(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事件庫(kù)文件的,所以要先安裝libevetn:
wgethttps://github.com/downloads/libevent/libevent/libevent-1.4.13-stable.tar.gz tarzxflibevent-1.4.13-stable.tar.gz cdlibevent-1.4.13-stable ./configure make makeinstall cd..
安裝memcached:
wgethttp://memcached.org/files/old/memcached-1.4.13.tar.gz tarzxfmemcached-1.4.13.tar.gz cdmemcached-1.4.13 ./configure make makeinstall cd..
啟動(dòng)報(bào)錯(cuò)處理:
[root@zxqtools]#memcached-m1m-p11212-d-c8192 memcached:errorwhileloadingsharedlibraries:libevent-1.4.so.2:cannotopensharedobjectfile:Nosuchfileordirectory 解決方法:就是讓系統(tǒng)能加載到libevent庫(kù)文件。 echo/usr/local/lib>>/etc/ld.so.conf ldconfig
2)啟動(dòng)memcached服務(wù):
[root@zxqmemcached-1.4.13]#whichmemcached /usr/local/bin/memcached memcached-m16m-p11212-d-uroot-c8192 lsof-i:11212 COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAME memcached46673root26uIPv42444550t0TCP*:11212(LISTEN) memcached46673root27uIPv62444560t0TCP*:11212(LISTEN) memcached46673root28uIPv42444590t0UDP*:11212 memcached46673root29uIPv62444600t0UDP*:11212 netstat-lntup|grepmemcached tcp000.0.0.0:112120.0.0.0:*LISTEN46673/memcached tcp00:::11212:::*LISTEN46673/memcached udp000.0.0.0:112120.0.0.0:*46673/memcached udp00:::11212:::*46673/memcached ps-ef|grepmemcached root466731017:15?00:00:00memcached-m16m-p11212-d-uroot-c8192
3)memcached相關(guān)啟動(dòng)參數(shù)說(shuō)明:
-p 指定memcached服務(wù)監(jiān)聽(tīng)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ā)訪問(wèn)量來(lái)設(shè)置
-vv 以very vrebose模式啟動(dòng),調(diào)試信息和錯(cuò)誤輸出到控制臺(tái)
-P 設(shè)置保存memcached的PID文件
-l 指定監(jiān)聽(tīng)的服務(wù)器ip地址
-f 調(diào)優(yōu)因子
-M 不使用LRU算法刪除緩存,當(dāng)內(nèi)存不夠用時(shí)會(huì)報(bào)錯(cuò)
其他選擇,通過(guò)memcached -h查看
memcached-m15m-d-uroot-p11213-M-c8192-P/var/run/memcached.pid-f1.25-l127.0.0.1
4)存儲(chǔ)和查看數(shù)據(jù)
語(yǔ)法:
set k01 0 0 10\\r\\n9999999999\\r\
set 存儲(chǔ)此數(shù)據(jù),如果建存在,則之前的值將被替換
add 存儲(chǔ)此數(shù)據(jù),只在服務(wù)器未保留此鍵值對(duì)數(shù)據(jù)時(shí)
replace 存儲(chǔ)此數(shù)據(jù),只在服務(wù)器曾保留此鍵值的數(shù)據(jù)時(shí)
\\r\\n 是大段的8位數(shù)據(jù),其長(zhǎng)度由前面的命令行中的
使用printf打印數(shù)據(jù),使用nc連接到memcached
set設(shè)置key為k01,value為999999999,主要指定字符串大小要與后面的數(shù)據(jù)對(duì)應(yīng)上。
[root@zxqlib]#printfsetk010010\\r\\n9999999999\\r\\n|nc127.0.0.111212 STORED
get查看key k01的value:
[root@zxqlib]#printfgetk01\\r\\n|nc127.0.0.111212 VALUEk01010 9999999999 END
delete刪除key k01的鍵值對(duì)數(shù)據(jù):
[root@zxqlib]#printfdeletek01\\r\\n|nc127.0.0.111212 DELETED
add添加鍵值,緩存中不存在值時(shí),如果存在值會(huì)響應(yīng)NOT_STORED
[root@zxqbin]#printfsetkey01002\\r\\nab\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfaddkey01002\\r\\nab\\r\\n|nc127.0.0.111213 NOT_STORED
replace當(dāng)鍵值存在時(shí),replace命令才會(huì)替換緩存中的鍵,如果緩存中不存在鍵,會(huì)報(bào)NOT_STORED錯(cuò)誤響應(yīng):
[root@zxqbin]#printfreplacekey01002\\r\\n88\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfreplacekey02002\\r\\n99\\r\\n|nc127.0.0.111213 NOT_STORED
gets與get類似,只是會(huì)返回一個(gè)鍵值對(duì)的標(biāo)識(shí)值
[root@zxqbin]#printfsetkey03005\\r\\n55555\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetskey03\\r\\n|nc127.0.0.111213 VALUEkey03055 55555 END [root@zxqbin]#printfgetkey03\\r\\n|nc127.0.0.111213 VALUEkey0305 55555 END
cas用于設(shè)置鍵值對(duì),與set相似的語(yǔ)法,但會(huì)使用gets執(zhí)行后的額外標(biāo)識(shí)值,來(lái)更改上次讀取的鍵值對(duì),如果標(biāo)識(shí)值不對(duì)將報(bào)錯(cuò):
[root@zxqbin]#printfgetskey03\\r\\n|nc127.0.0.111213 VALUEkey03057 88888 END [root@zxqbin]#printfcaskey030058\\r\\n99999\\r\\n|nc127.0.0.111213 EXISTS [root@zxqbin]#printfcaskey030057\\r\\n99999\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetskey03\\r\\n|nc127.0.0.111213 VALUEkey03058 99999 END
5)stats查看memcached當(dāng)前實(shí)例信息:
[root@zxqtmp]#printfstats\\r\\n|nc127.0.0.111212 STATpid46673進(jìn)程ID STATuptime25336服務(wù)器運(yùn)行秒數(shù) STATtime1494173893服務(wù)器當(dāng)前unix時(shí)間戳 STATversion1.4.13memcached版本 STATlibevent1.4.13-stablelibevent版本 STATpointer_size64操作系統(tǒng)位數(shù),64位 STATrusage_user0.642902進(jìn)程累計(jì)用戶時(shí)間 STATrusage_system0.303953進(jìn)程累計(jì)系統(tǒng)時(shí)間 STATcurr_connections10當(dāng)前打開(kāi)連接數(shù) STATtotal_connections25memecached運(yùn)行以來(lái)連接總數(shù) STATconnection_structures11memcached分配的連接結(jié)構(gòu)數(shù) STATreserved_fds20內(nèi)部使用的FD數(shù) STATcmd_get7執(zhí)行g(shù)et命令總數(shù) STATcmd_set3執(zhí)行set命令總數(shù) STATcmd_flush0執(zhí)行flush_all命令總數(shù) STATcmd_touch0touch命令請(qǐng)求總數(shù) STATget_hits3get命中次數(shù) STATget_misses4get未命中次數(shù) STATdelete_misses0delete未命中次數(shù) STATdelete_hits1delete命中次數(shù) STATincr_misses0incr未命中次數(shù) STATincr_hits0incr命中次數(shù) STATdecr_misses0decr未命中次數(shù) STATdecr_hits0decr命中次數(shù) STATcas_misses0cas未命中次數(shù) STATcas_hits0cas命中次數(shù) STATcas_badval0使用擦拭次數(shù) STATtouch_hits0touch命中次數(shù) STATtouch_misses0touch未命中次數(shù) STATauth_cmds0認(rèn)證命令處理次數(shù) STATauth_errors0認(rèn)證失敗數(shù)目 STATbytes_read358讀取字節(jié)總數(shù) STATbytes_written160寫入字節(jié)總數(shù) STATlimit_maxbytes16777216分配的內(nèi)存總數(shù)(字節(jié)) STATaccepting_conns1目前接受的連接數(shù) STATlisten_disabled_num0失效的監(jiān)聽(tīng)數(shù) STATthreads4線程數(shù) STATconn_yields0連接操作主動(dòng)放棄數(shù)目 STAThash_power_level16hash表等級(jí) STAThash_bytes524288當(dāng)前hash表大小 STAThash_is_expanding0hash表正在擴(kuò)展 STATexpired_unfetched0已過(guò)期但未獲取大對(duì)象數(shù)目 STATevicted_unfetched0已驅(qū)逐但未獲取大對(duì)象數(shù)目 STATbytes166當(dāng)前存儲(chǔ)占用字節(jié)數(shù) STATcurr_items2當(dāng)前存儲(chǔ)的數(shù)據(jù)總個(gè)數(shù) STATtotal_items3啟動(dòng)以來(lái)存儲(chǔ)的數(shù)據(jù)總數(shù) STATevictions0LRU釋放的對(duì)象數(shù)目 STATreclaimed0已過(guò)期的數(shù)據(jù)條目來(lái)存儲(chǔ)新數(shù)據(jù)的數(shù)目 END
stats items 查看items行內(nèi)容:
[root@zxqbin]#printfstatsitems\\r\\n|nc127.0.0.111213 STATitems:1:number4該slab中對(duì)象數(shù)(不包含過(guò)期對(duì)象) STATitems:1:age1941LRU隊(duì)列中最老對(duì)象的過(guò)期時(shí)間 STATitems:1:evicted0LRU釋放對(duì)象數(shù) STATitems:1:evicted_nonzero0設(shè)置了非0時(shí)間的LRU釋放對(duì)象數(shù) STATitems:1:evicted_time0最后一次LRU釋放的對(duì)象存在時(shí)間 STATitems:1:outofmemory0不能存儲(chǔ)對(duì)象次數(shù) STATitems:1:tailrepairs0修復(fù)slabs次數(shù) STATitems:1:reclaimed0使用過(guò)期對(duì)象空間存儲(chǔ)對(duì)象次數(shù) STATitems:1:expired_unfetched0已過(guò)期但未獲取的對(duì)象數(shù)目 STATitems:1:evicted_unfetched0已驅(qū)逐但未獲取的對(duì)象數(shù)目 END
stats cachedump slabs_id limit_num,slabs_id是由stats items返回的值,也就是項(xiàng)目組號(hào),limit_num返回的記錄數(shù),0為返回所有記錄,可以兩者結(jié)合遍歷memcache所有記錄數(shù)據(jù):
[root@zxqbin]#printfstatsitems\\r\\n|nc127.0.0.111213 STATitems:1:number5 STATitems:1:age2589 STATitems:1:evicted0 STATitems:1:evicted_nonzero0 STATitems:1:evicted_time0 STATitems:1:outofmemory0 STATitems:1:tailrepairs0 STATitems:1:reclaimed0 STATitems:1:expired_unfetched0 STATitems:1:evicted_unfetched0 STATitems:2:number1 STATitems:2:age3 STATitems:2:evicted0 STATitems:2:evicted_nonzero0 STATitems:2:evicted_time0 STATitems:2:outofmemory0 STATitems:2:tailrepairs0 STATitems:2:reclaimed0 STATitems:2:expired_unfetched0 STATitems:2:evicted_unfetched0 END [root@zxqbin]#printfstatscachedump10\\r\\n|nc127.0.0.111213 ITEMkey04[15b;1494188606s] ITEMkey03[5b;1494188606s] ITEMkey01[2b;1494188606s] ITEMuserID[5b;1494188606s] ITEMuserid[5b;1494188606s] END [root@zxqbin]#printfstatscachedump20\\r\\n|nc127.0.0.111213 ITEMkey05[35b;1494188606s] END
stats slabs顯示各個(gè)slab的信息,包括chunk的大小,數(shù)目和使用情況等:
printfstatsslabs\\r\\n|nc127.0.0.111213 STAT1:chunk_size96chunk大?。╞yte) STAT1:chunks_per_page10922每個(gè)page的chunk數(shù)量 STAT1:total_pages1page數(shù)量 STAT1:total_chunks10922chunk總數(shù)量(chunks_per_page*total_pages) STAT1:used_chunks6已被分配的chunk數(shù)量 STAT1:free_chunks1過(guò)期數(shù)據(jù)空出的chunk數(shù) STAT1:free_chunks_end10915從未被使用過(guò)的chunk數(shù) STAT1:mem_requested481請(qǐng)求存儲(chǔ)的字節(jié)數(shù) STAT1:get_hits6get命令命中數(shù) STAT1:cmd_set17 STAT1:delete_hits0 STAT1:incr_hits0 STAT1:decr_hits0 STAT1:cas_hits3 STAT1:cas_badval1cas數(shù)據(jù)類型錯(cuò)誤數(shù) STAT1:touch_hits0touch命令命中數(shù) STAT2:chunk_size120 STAT2:chunks_per_page8738 STAT2:total_pages1 STAT2:total_chunks8738 STAT2:used_chunks2 STAT2:free_chunks0 STAT2:free_chunks_end8736 STAT2:mem_requested207 STAT2:get_hits0 STAT2:cmd_set3 STAT2:delete_hits0 STAT2:incr_hits0 STAT2:decr_hits0 STAT2:cas_hits0 STAT2:cas_badval0 STAT2:touch_hits0 STATactive_slabs2 STATtotal_malloced2097072 END
stats settings 可以查看一些memcached設(shè)置例如線程數(shù)
[root@zxqbin]#printfstatssettings\\r\\n|nc127.0.0.111213 STATmaxbytes15728640 STATmaxconns8192 STATtcpport11213 STATudpport11213 STATinter127.0.0.1 STATverbosity0 STAToldest3537 STATevictionsoff STATdomain_socketNULL STATumask700 STATgrowth_factor1.25 STATchunk_size48 STATnum_threads4 STATnum_threads_per_udp4 STATstat_key_prefix: STATdetail_enabledno STATreqs_per_event20 STATcas_enabledyes STATtcp_backlog1024 STATbinding_protocolauto-negotiate STATauth_enabled_saslno STATitem_size_max1048576 STATmaxconns_fastno STAThashpower_init0 STATslab_reassignno STATslab_automoveno END
stats sizes 查看存在的item大小和個(gè)數(shù)
[root@zxqbin]#printfstatssizes\\r\\n|nc127.0.0.111213 STAT966 STAT1282 END
stats reset 清理統(tǒng)計(jì)數(shù)據(jù)
printfstatsreset\\r\\n|nc127.0.0.111213
flush_all用于清理存儲(chǔ)中的所有鍵值對(duì):
[root@zxqbin]#printfflush_all\\r\\n|nc127.0.0.111213 OK
append 將數(shù)據(jù)追加到當(dāng)前緩存數(shù)據(jù)的之后,當(dāng)緩存數(shù)據(jù)存在時(shí)才存儲(chǔ)
[root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07025 aaaaabbbbbcccccdddddeeeee END [root@zxqbin]#printfappendkey07005\\r\\n_@@@#\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07030 aaaaabbbbbcccccdddddeeeee_@@@# END
prepend 將數(shù)據(jù)追加到當(dāng)前緩存數(shù)據(jù)的之前,當(dāng)緩存數(shù)據(jù)存在時(shí)才存儲(chǔ)
[root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07030 aaaaabbbbbcccccdddddeeeee_@@@# END [root@zxqbin]#printfprependkey07005\\r\\n#####\\r\\n|nc127.0.0.111213 STORED [root@zxqbin]#printfgetkey07\\r\\n|nc127.0.0.111213 VALUEkey07035 #####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客戶端:
wgethttp://pecl.php.net/get/memcache-2.2.5.tgz tarzxfmemcache-2.2.5.tgz cdmemcache-2.2.5 /usr/local/php/bin/phpize ./configure--enable-memcache--with-php-config=/usr/local/php/bin/php-config--with-zlib-dir make makeinstall Installingsharedextensions:/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/ [root@zxqmemcache-2.2.5]#ll/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
安裝完會(huì)在此文件中生成memcache.so文件
-rwxr-xr-x1rootroot2604515月717:59memcache.so -rwxr-xr-x1rootroot5893085月420:59opcache.so
修改php.ini配置文件:指定memcache.so文件路徑
echoextension=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 SyntaxOK [root@zxq~]#apachectlgraceful
如果是nginx則重啟動(dòng)php-fpm服務(wù)
打開(kāi)phpinfo加載網(wǎng)頁(yè),能看到memcache模塊就算成功了!
建立測(cè)試文件,實(shí)現(xiàn)PHP與memcache交換數(shù)據(jù):
connect(\'10.0.0.4\',11212)ordie(couldnotconnect); $memcache->set(\'key001\',\'123\'); $memcache->set(\'key002\',\'abc\'); $get_value001=$memcache->get(\'key001\'); $get_value002=$memcache->get(\'key002\'); echo$get_value002.
; echo$get_value001; ?>
訪問(wèn)目錄能讀到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-m15m-d-uroot-p11212-M-c8192-P/var/run/memcached.pid-f1.25-l10.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 [$#-ne2]&&{ echo$0ipport exit } exportkey1=key exportwwwServerIp=$1 exportwwwServerPort=$2 cmd=nc$wwwServerIp$wwwServerPort printfdelete$key1\\r\\n|$cmd>/dev/null2>&1 sleep1 printfset$key1006\\r\\n123\\r\\n|$cmd>/dev/null2>&1 if[`printfget$key1\\r\\n|$cmd|grep123|wc-l`-eq1] then echomcisalive. exit0 else echomcisdead. exit2 fi
12、memcached調(diào)優(yōu)
計(jì)算item占用空間:
item總大小=鍵長(zhǎng)+值長(zhǎng)+后綴長(zhǎng)+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)大?。?2位系統(tǒng)32字節(jié);64位系統(tǒng)48字節(jié)
例如:
memcached-uroot-p11212-vv slabclass1:chunksize96perslab10922 slabclass2:chunksize120perslab8738 slabclass3:chunksize152perslab6898 slabclass4:chunksize192perslab5461 slabclass5:chunksize240perslab4369 slabclass6:chunksize304perslab3449 slabclass7:chunksize384perslab2730 slabclass8:chunksize480perslab2184 slabclass9:chunksize600perslab1747 slabclass10:chunksize752perslab1394 slabclass11:chunksize944perslab1110 slabclass12:chunksize1184perslab885 printfsetleng0040\\r\\n1111111111222222222211111111112222222222\\r\\n|nc127.0.0.111212 STORED
計(jì)算leng總長(zhǎng)度:48+8+4+40=100
所以leng值就會(huì)選擇slab 2的120字節(jié)里來(lái)存儲(chǔ)leng數(shù)據(jù):
[root@zxqhtdocs]#printfstatscachedump20\\r\\n|nc127.0.0.111212 ITEMleng[40b;1494182061s] END
優(yōu)化方案:先估算將要存儲(chǔ)的數(shù)據(jù)大小值,再通過(guò)-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)長(zhǎng)RU不是全局的,而是針對(duì)slab區(qū)域的。可以使用腳本檢測(cè)stats tiems的值,保證內(nèi)存空閑,清除過(guò)久未訪問(wèn)的數(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)腳本
catmemdiscover.sh #!/bin/sh #function:discoverymemcacheitems memcache_discovery(){ Memitems=(`/usr/bin/printfstats\\r\\n|nc127.0.0.111212|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)控腳本
catmemcached-status.conf #!/bin/sh #thisismemcachedststusscripts #date2017-05-08 functionstatus(){ ip=127.0.0.1 port=11212 /usr/bin/printfstats\\r\\n|nc$ip$port } status|grep-w$1|awk\'{print$3}\'
3)配置web頁(yè)面
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