安裝memcached


簡介

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用直觀化的圖表方式實現:

參考資料

  1. 《memcached全面剖析》
  2. 《nosql數據庫入門》
  3. memcached協議


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM