1.做爲數據庫的前端緩存應用php
完整緩存(易):例如商品分類,以及商品信息,可實現放到內存裏,而後再對外提供數據訪問。這個被稱之爲預熱。用戶訪問時能夠只讀取memcached緩存,不讀取數據庫了。html
熱點緩存(難):須要前端程序配合。只緩存熱點的數據,即緩存常常被訪問的數據。先預熱基礎數據,而後再動態更新。程序先讀取緩存,若是緩存裏沒有對應的數據,程序再去讀取數據庫,而後程序把讀到的數據放入緩存。前端
2.做爲集羣的session會話共享存儲ios
1.當web程序須要訪問後端數據庫獲取數據時會優先訪問Memcached內存緩存,若是緩存中有數據就直接獲取返回前端服務及用戶,若是沒有數據(未命中),再由程序請求後端的數據庫服務器,獲取到對應的數據後,除了返回給前端服務及用戶數據外,還會把數據放到Memcached內存中進行緩存,等待下次被訪問。Memcahced內存始終是數據庫的擋箭牌,從而大大的減輕數據庫的訪問壓力,提升整個網站架構的響應速度,提高了用戶體驗。nginx
2.當程序更新,修改或刪除數據庫中已有的數據時,會同時發送請求通知Memcached已經緩存過的同一個ID內容的舊數據失效,從而保證Memcahce中的數據和數據庫中的數據保持一致。若是是在高併發場合,除了通知Memcached過時的緩存失效外,還會經過相關機制,使得在用戶訪問新數據前,經過程序預先把更新過的數據推送到memcached中緩存起來,這樣能夠減小數據庫的訪問壓力,提高memcached中緩存的命中率。web
3.數據庫插件能夠在寫入更新數據庫後,自動拋給MC緩存起來,自身不Cache算法
1.程序端實現sql
Memcached服務器端中保存着slab class中空閒chunk個數的列表,根據該列表選擇chunk,而後將數據緩存於其中。當有數據存入時,Memcached根據接收到的數據大小,分配一個能存下這個數據的最小內存塊chunk。可是缺點在於因爲分配的chunk大小是固定的,因此會有部分空間被浪費。數據庫
避免浪費的辦法是,預先計算出應用存入的數據大小或把同一業務類型的數據存入一個Memcached服務器中,確保存入的數據大小相對均勻。同時使用-f<factor> chunk size growth factor增加因子來劃分chunk大小,進行調優。各組之間chunk的大小按照factor對應倍數遞增,factor的默認值是1.25。vim
同時slab allocator還有重複使用已分配的chunk的做用。也就是說,分配到的chunk不會釋放,而是重複利用,用新數據替換舊數據。
Memcached主要的刪除機制是LRU(最近最少用)算法,加上item過時失效。當您存數據到memcached中,能夠指定該數據在緩存中能夠呆多久。若是memcached內存不夠用,過時的數據會優先被替換,接着輪到最老的未被使用的數據。在某些狀況下(完整緩存),若是不想用LRU算法,能夠經過-M參數啓動Memcached,這樣memcached內存耗盡也不會刪除,寧願報錯也不刪除。
#安裝memcached前須要安裝libevent yum install libevent-devel nc -y #源碼安裝memcahced cd /server/tools wget http://memcached.org/files/memcached-1.4.24.tar.gz tar xf memcached-1.4.24.tar.gz cd memcached-1.4.24 ./configure --prefix=/application/memcached-1.4.24 make make install ln -s /application/memcached-1.4.24/ /application/memcached #啓動一個Mem實例 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192 # 分配的內存 端口 後臺 用戶 最大併發鏈接數 lsof -i :11211 ps -ef | grep memcached | grep -v grep root 2984 1 0 23:10 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192 #能夠啓動多個Mem實例 /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192 ps -ef | grep memcached | grep -v grep root 2984 1 0 23:10 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192 root 3036 1 0 23:16 ? 00:00:00 /application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192 #加入開機啓動 echo "/application/memcached/bin/memcached -m 16m -p 11211 -d -u root -c 8192" >> /etc/rc.local echo "/application/memcached/bin/memcached -m 16m -p 11212 -d -u root -c 8192" >> /etc/rc.local #測試服務端是否正常 [root@nagios tools]# printf "set key1 0 0 5\r\npeter\r\n" | nc 127.0.0.1 11211 STORED [root@nagios tools]# printf "get key1\r\n" | nc 127.0.0.1 11211 VALUE key1 0 5 peter END [root@nagios tools]# printf "delete key1\r\n" | nc 127.0.0.1 11211 DELETED #客戶端php插件memcache安裝 cd /server/tools/ wget http://pecl.php.net/get/memcache-2.2.7.tgz tar xf memcache-2.2.7.tgz cd memcache-2.2.7 /application/php/bin/phpize ./configure --enable-memcache --with-php-config=/application/php/bin/php-config make make install Installing shared extensions: /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/ ls -l /application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/ total 244 -rwxr-xr-x 1 root root 246696 Sep 1 22:51 memcache.so vim /application/php/lib/php.ini ; http://php.net/extension-dir extension_dir = "/application/php-5.3.27/lib/php/extensions/no-debug-non-zts-20090626/" extension=memcache.so /application/php/sbin/php-fpm -t pkill php-fpm /application/php/sbin/php-fpm ps -ef | grep php-fpm #http://10.0.0.23/test_info.php
#鏈接測試 vim op_mem.php <?php $memcache = new Memcache; $memcache->connect('172.16.1.23',11211) or die ("Could not connect Mc server"); $memcache->set('key','oldboy book'); $get=$memcache->get('key'); echo $get; ?> /application/php/bin/php op_mem.php oldboy book
vim /application/php/lib/php.ini 1458 [Session] 1459 ; Handler used to store/retrieve data. 1460 ; http://php.net/session.save-handler 1461 session.save_handler = memcache #修改session存儲方式 1462 1463 ; Argument passed to save_handler. In the case of files, this is the path 1464 ; where data files are stored. Note: Windows users have to change this 1465 ; variable in order to use PHP's session functions. 1466 ; 1467 ; The path can be defined as: 1468 ; 1469 session.save_path = "tcp://172.16.1.23:11211" #修改session存儲路徑 pkill php-fpm /application/php/sbin/php-fpm #http://10.0.0.23/test_info.php
printf "stats\r\n" | nc 127.0.0.1 11211 #Memcached各類狀態信息 STAT pid 41346 #PID STAT uptime 4759 #服務已運行秒數 STAT time 1505572559 #服務當前UNIX時間戳 STAT version 1.4.24 #Memcached版本 STAT libevent 1.4.13-stable #libevent版本 STAT pointer_size 64 #操做系統指針大小 STAT rusage_user 0.121981 #進程累計用戶時間 STAT rusage_system 0.112982 #進程累計系統時間 STAT curr_connections 10 #當前鏈接數 STAT total_connections 14 #服務運行以來總鏈接數 STAT connection_structures 11 #服務分配的鏈接結構數量 STAT reserved_fds 20 #內部使用的FD數 STAT cmd_get 1 #get請求次數 STAT cmd_set 1 #set請求次數 STAT cmd_flush 0 #flush請求次數 STAT cmd_touch 0 #touch請求次數 STAT get_hits 1 #get命中次數 STAT get_misses 0 #get未命中次數 STAT delete_misses 0 #delete未命中次數 STAT delete_hits 1 #delete命中次數 STAT incr_misses 0 #incr未命中次數 STAT incr_hits 0 #incr命中次數 STAT decr_misses 0 #decr未命中次數 STAT decr_hits 0 #decr命中次數 STAT cas_misses 0 #cas未命中次數 STAT cas_hits 0 #cas命中次數 STAT cas_badval 0 #cas使用擦拭次數 STAT touch_hits 0 #touch命中次數 STAT touch_misses 0 #touch未命中次數 STAT auth_cmds 0 #認證命令處理次數 STAT auth_errors 0 #認證命令失敗次數 STAT bytes_read 53 #讀取總字節數 STAT bytes_written 45 #寫入總字節數 STAT limit_maxbytes 16777216 #分配內存總大小(字節) STAT accepting_conns 1 #接受新的鏈接 STAT listen_disabled_num 0 #失效的監聽數 STAT threads 4 #當前線程數 STAT conn_yields 0 #鏈接操做主動放棄數目 STAT hash_power_level 16 #hash表等級 STAT hash_bytes 524288 #hash表大小 STAT hash_is_expanding 0 #hash表正在擴展 STAT malloc_fails 0 #分配內存失敗的數目 STAT bytes 0 #已過時但未獲取的對象數目 STAT curr_items 0 #當前的對象數目 STAT total_items 1 #當前存儲佔用的字節數 STAT expired_unfetched 0 #已過時但未獲取的對象數目 STAT evicted_unfetched 0 #已驅逐但未獲取的對象數目 STAT evictions 0 #LRU釋放的對象數目 STAT reclaimed 0 STAT crawler_reclaimed 0 STAT crawler_items_checked 0 STAT lrutail_reflocked 0 END [root@nagios ~]# printf "stats settings\r\n" | nc 127.0.0.1 11211 #Memcached設置信息 [root@nagios ~]# printf "stats slabs\r\n" | nc 127.0.0.1 11211 #查看slabs相關信息 [root@nagios ~]# printf "stats items\r\n" | nc 127.0.0.1 11211 #查看items相關信息 [root@nagios ~]# printf "stats sizes\r\n" | nc 127.0.0.1 11211 #查看items的大小和個數 [root@nagios ~]# printf "stats reset\r\n" | nc 127.0.0.1 11211 #清理統計數據 #訪問測試 [root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get STAT cmd_get 1 STAT get_hits 1 STAT get_misses 0 [root@nagios nginx]# printf "get key1\r\n" | nc 127.0.0.1 11211 END [root@nagios nginx]# printf "stats\r\n" | nc 127.0.0.1 11211 | grep get STAT cmd_get 2 STAT get_hits 1 STAT get_misses 1
2.經過Memcached管理工具Memadmin展現
#Memadmin是基於PHP和JQuery的Memcached管理監控工具 cd /server/tools wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz tar xf memadmin-1.0.12.tar.gz mv memadmin /application/nginx/html/www/ #http://10.0.0.88/memadmin
1.監控指標:
端口
命名率
響應時間
模擬用戶存取
2.Nagios插件開發
#模擬用戶進行存取,測試memcached的狀態 vim check_mc.sh [ $# -ne 2 ] && { echo "$0 ip port" exit } #!/bin/bash ServerIP=$1 ServerPort=$2 cmd="nc $ServerIP $ServerPort" printf "delete key\r\n" | $cmd > /dev/null 2>&1 sleep 1 printf "set key 0 0 5\r\npeter\r\n" | $cmd > /dev/null 2>&1 if [ `printf "get key\r\n" | $cmd | grep peter | wc -l` -eq 1 ];then echo "mc is alive." exit 0 else echo "mc is dead." exit 2 fi [root@nagios ~]# sh check_mc.sh 127.0.0.1 11211 mc is alive.