簡介
memcached是免費和開放源代碼的高性能分布式內存對象緩存系統,旨在通過減輕數據庫負載來加速動態Web應用程序。其有以下特點:
- 基於簡單的文本行協議
- 全部數據按照k/v形式存放在內存中,無持久化,重啟服務數據會丟失
- 基於libevent異步I/O模型的事件通知機制。libevent是個程序庫,它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的接口。即使對服務器的連接數增加,也能發揮O(1)的性能。memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統上發揮其高性能
- 節點之間相互獨立,實現分布式需要依賴客戶端
其一般作為后端數據庫的緩存層來減少數據庫的壓力:
安裝memcached
#先安裝依賴軟件 $ yum install gcc libevent libevent-devel #源碼安裝memcached $ cd /usr/local/src $ wget http://memcached.org/files/memcached-1.5.2.tar.gz $ tar -zxvf memcached-1.5.2.tar.gz $ cd memcached-1.5.2 $ ./configure --prefix=/usr/local/memcached && make && sudo make install
啟動
$ /usr/local/memcached/bin/memcached -d -u root -l 192.168.56.10 -p 32054 -m 10 -c 100 -P /tmp/memcached_32054.pid #選項說明,這里只列出比較重要的選項,具體選項說明使用memcached -h來查閱 -p TCP端口,默認為11211,可以不設置 -U UDP端口,默認為11211,0為關閉 -l 監聽的ip地址 -d 守護進程(daemon) -u 指定用戶,如果當前為 root ,需要使用此參數指定用戶 -m 最大內存,單位MB。默認64MB,32位操作系統,每個進程最多只能使用2GB,64位無限制 -M 禁止LRU策略,內存耗盡時返回錯誤,而不是刪除數據 -c 最大連接數,默認是1024 -vv 查看日志 -P memcache的pid文件,結束memcache進程:kill `cat /tmp/memcached_32054.pid` -f 增長因子,默認1.25 -n 初始chunk=key+suffix+value+32結構體,默認48字節 -L 啟用大內存頁,可以降低內存浪費,改進性能 -t 線程數,默認4。由於memcached采用NIO,所以更多線程沒有太多作用 -R 每個event連接最大並發數,默認20 -C 禁用CAS命令(可以禁止版本計數,減少開銷) -I 每次申請內存的頁的大小(page),默認1M,最小1k,最大128M -F 禁用flush_all
查看進程
$ ps -aux | grep memcached root 1359 0.0 0.3 413804 3132 ? Ssl 13:51 0:00 /usr/local/memcached/bin/memcached -d -u root -p 32054 -m 10 -c 100 root 1372 0.0 0.0 112660 972 pts/0 R+ 13:51 0:00 grep --color=auto memcached
基本命令
命令格式:
<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n
cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n
<command name> 有這么幾個: "set", "add", "replace", "append", "prepend"
<flags>是服務器隨數據一起存儲的任意16位無符號整數(用十進制表示),並在檢索項目時返回。 對於memcached的php客戶端來說flags=0表示不壓縮
$ telnet localhost 32054 Trying ::1... Connected to localhost. Escape character is '^]'. stats #查看memcache狀態 ... END set name 0 0 3 hioooo CLIENT_ERROR bad data chunk #超過3個字節存不下 ERROR #設置1個數字 set count 0 0 1 1 STORED #遞增 incr count 1 2 incr count 6 8 #遞減 decr count 1 7 #設置一個字符串 set myname 0 0 3 pig STORED #獲取 get myname VALUE myname 0 3 pig END #不存在則添加 add height 0 0 4 1.75 STORED add myname 0 0 3 zhu NOT_STORED #這兒因為myname已經存在,所以返回失敗 #替換 replace height 0 0 4 1.60 STORED #向已存在的緩存后面追加內容 append myname 0 0 3 fly STORED #向已存在的緩存前面追加內容 prepend myname 0 0 3 pig STORED #gets & cas 控制並發寫,gets獲得一個id,cas保存的時候帶上這個id,如果發現id沒變,保存之,並且更新id,如果變了說明數據已經被更新了,保存失敗 gets myname VALUE myname 0 6 6 pigfly END cas myname 0 0 3 6 zhu STORED get myname VALUE myname 0 3 zhu #設置緩存並且設定過期時間 #有效期可以是UNIX時間戳(從1970年1月1日開始的秒鍾數),也可以是距離當前的秒數,對於后者而言,不能超過60*60*24*30(30天) #下面把有效期設置為100天的秒數的后果就是馬上就失效了,完全get不到
#至於設置為100天后的UNIX時間戳是不是能在100天后過期就不知道了,有人測試過記得告訴我~ set phone 0 8640000 11 13847292929 STORED get phone END #向已存在的數據設置過期時間 touch myname 10 #刪除 delete myname DELETED get myname END #清空所有緩存 flush_all OK get myname END get myname count END
狀態信息
STAT pid 1359 #memcache服務器的進程ID STAT uptime 6630 #服務器已經運行的秒數 STAT time 1508917290 #服務器當前的unix時間戳 STAT version 1.5.2 #memcache版本 STAT libevent 2.0.21-stable #libevent版本 STAT pointer_size 64 #當前操作系統的指針大小(32位系統一般是32bit,64就是64位操作系統) STAT rusage_user #0.835764 seconds the cpu has devoted to the process as the user, cpu投入到進程的累計用戶時間 STAT rusage_system 0.685101 #seconds the cpu has devoted to the process as the system, 進程的累計系統時間 STAT max_connections 100 #最大連接數 STAT curr_connections 10 #當前連接數 STAT total_connections 12 #啟動以來總的連接數 STAT rejected_connections 0 #拒絕連接數 STAT connection_structures 11 #已分配的連接結構數 STAT reserved_fds 20 #Number of misc fds used internally STAT cmd_get 2 #get(獲取)次數 STAT cmd_set 4 #set(保存)次數 STAT cmd_flush 0 #flush(清空)次數 STAT cmd_touch 0 #更新過期時間次數 STAT get_hits 2 #獲取命中次數 STAT get_misses 0 #獲取失敗次數 STAT get_expired 0 #獲取已過期數據的次數 STAT get_flushed 0 #獲取已被清空的數據的次數 STAT delete_misses 0 #刪除失敗次數 STAT delete_hits 0 #刪除成功次數 STAT incr_misses 0 #遞增失敗次數 STAT incr_hits 0 #遞增成功次數 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 133 #讀取字節數 STAT bytes_written 159 #寫入字節數 STAT limit_maxbytes 10485760 #分配給memcache的內存大小(字節) STAT accepting_conns 1 #Whether or not server is accepting conns(服務器是否接受連接) STAT listen_disabled_num 0 STAT time_in_listen_disabled_us 0 STAT threads 4 #當前線程數 STAT conn_yields 0 #連接操作主動放棄數目 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT slab_reassign_rescues 0 STAT slab_reassign_chunk_rescues 0 STAT slab_reassign_evictions_nomem 0 STAT slab_reassign_inline_reclaim 0 STAT slab_reassign_busy_items 0 STAT slab_reassign_busy_deletes 0 STAT slab_reassign_running 0 STAT slabs_moved 0 STAT lru_crawler_running 0 STAT lru_crawler_starts 3825 STAT lru_maintainer_juggles 12722 STAT malloc_fails 0 STAT log_worker_dropped 0 STAT log_worker_written 0 STAT log_watcher_skipped 0 STAT log_watcher_sent 0 STAT bytes 130 #當前存儲占用的字節數 STAT curr_items 2 #當前存儲的數據總數 STAT total_items 2 #啟動以來存儲的數據總數 STAT slab_global_page_pool 0 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT evicted_active 0 STAT evictions 0 #為獲取空閑內存而刪除的items數(分配給memcache的內存用滿后需要刪除舊的items來得到空間分配給新的items) STAT reclaimed 0 #已過期的數據條目來存儲新數據的數目 STAT crawler_reclaimed 0 STAT crawler_items_checked 10 STAT lrutail_reflocked 0 STAT moves_to_cold 2 STAT moves_to_warm 0 STAT moves_within_lru 0 STAT direct_reclaims 0 STAT lru_bumps_dropped 0
安全
服務器一般有兩個網卡,一個指向內網,一個指向外網。由於memcached沒有密碼驗證,如果直接暴露在外網,數據就會隨意被他人利用,我們可以有兩種方法來限制連接:
1.內網訪問,啟動memcached的時候加上-l參數,讓memcached監聽內網ip
$ memcached -d -m 1024 -u root -l 192.168.56.10 -p 32054 -c 1024
2.設置防火牆規則
$ iptables -F $ iptables -P INPUT DROP $ iptables -A INPUT -p tcp -s 192.168.56.10 --dport 32054 -j ACCEPT $ iptables -A INPUT -p udp -s 192.168.56.10 --dport 32054 -j ACCEPT
自動重啟&監控
memcached有時候會出現進程死掉的情況,這時候只要重啟,又可以正常使用。所以我們可以有個監控memcached進程的腳本來實現當memcached進程死掉以后自動重啟memcached,可以采用daemondtools,腳本如下:
#!/bin/sh
if [ f
/etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi
exec 2>&1
exec /usr/bin/memcached p
$PORT u
$USER m
$CACHESIZE c
$MAXCONN
$OPTIONS
通過STATS命令可以自己實現腳本來達到監控的目的,php客戶端方面有人寫了個memcache.php,還可以采用nagios+rrdtool用直觀化的圖表方式實現:
參考資料
- 《memcached全面剖析》
- 《nosql數據庫入門》
- memcached協議