Memcachd官网http://memcached.org/
Memcached介绍
Memcached是一个高性能的分布式内存对象缓存系统,基于Key-Value的存储的内存数据库或者说hash表,整合memcached和mysql是未来趋势,目前最新的mysql5.6已提供了innodb引擎对memcached的接口,不过只是开发版本没有GA版(http://www.oschina.net/news/24013/new-features-in-mysql-5-6)
基本特征
1.协议简单
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。如telnet
2.基于libevent的事件处理
Libevent是提供系统异步事件处理机制如(epoll,kqueue
)的 API ,也是 memcachd 安装的前提,一般基 于 libevent 的软件性能比较高,如 nginx3、内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
4、不互相通信的分布式
各个memcached不会互相通信以共享信息,各自存储数据
一、安装配置
1. libevent
Libevent是提供系统异步事件处理机制如(epoll,kqueue)的API,也是memcachd安装的前提,一般基于libevent的软件性能比较高,如nginx
官网:http://libevent.org/目前最新版本libevent-2.0.19
安装
检查系统是否安装libevent的库文件
ldconfig -v|greplibevent
wgethttp://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
(目前最常用1.4x 和2.0.x)
tarzxvf libevent-2.0.19-stable.tar.gz
cd libevent-2.0.19-stable
./configure --prefix=/usr/local/libevent
make &&make install
echo "/usr/local/libevent/lib" >>/etc/ld.so.conf
ldconfig(加载库文件,系统默认不会/usr/local/libevent/lib下的lib库,需要添加lib列表)
ldconfig -v|greplibevent
2、安装memcached
wgethttp://memcached.googlecode.com/files/memcached-1.4.14.tar.gz
tarzxvf memcached-1.4.14.tar.gz
cd memcached-1.4.14
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
make &&make install
二、memcached启动参数
启动服务
/usr/local/memcached/bin/memcached -d -m 32 -l192.168.3.100-p 11211 -u nobody �Cd
启动常用参数
启动方式:
-d 以守护程序(daemon)方式运行
-u root 指定用户,如果当前为 root ,需要使用此参数?
-P /tmp/a.pid保存PID到指定文件
内存设置:
-m 1024 数据内存数量,不包含memcached本身占用,单位
-M 内存不够时禁止LRU,报错
-n 48初始chunk=key+suffix+value+32结构体,默认48字
-f 1.25 增长因子,默认1.25
-L启用大内存页,可以降低内存浪费,改进性能
连接设置:
-l 127.0.0.1 监听的 IP 地址,本机可以不设置此参数
-p 11211 TCP端口,默认为11211,可以不设置
-U 11211UDP端口,默认为11211,0为关闭
并发设置:
-c 1024最大并发连接数,默认1024,最好是200
-t 4线程数,默认4。由于memcached采用NIO,所以更多
-R 20每个event连接最大并发数,默认20
-C禁用CAS命令(可以禁止版本计数,减少开销)
三、memcached stats命令
获取运行状态
echo stats | nc 192.168.3.100 11211
telnet到memcached服务器后有很多的命令可以使用,除了大家熟知的add、get、set、incr、decr、replace、delete等赋值命令外,还有一系列的获取服务器信息的命令,这部分命令都是以stats开头的。
常用的命令
1、stats 2、stats reset 3、stats malloc 4、stats maps 5、stats sizes 6、stats slabs
7、stats items [on|off|dump] 8、stats cachedumpslab_idlimit_num 9、stats detail [on|off|dump]
1、stats :显示服务器信息、统计数据等
参数 |
值 |
描述 |
pid |
15837 |
memcache服务器进程ID |
uptime |
201086 |
服务器已运行秒数 |
time |
1345391337 |
服务器当前Unix时间戳 |
version |
1.4.13 |
memcache版本 |
libevent |
2.0.19-stable |
libevent版本 |
pointer_size |
32 |
操作系统指针大小 |
rusage_user |
0.123981 |
进程累计用户时间 |
rusage_system |
2.110679 |
进程累计系统时间 |
curr_connections |
5 |
当前连接数量 |
total_connections |
230 |
Memcached运行以来连接总数 |
connection_structures |
14 |
Memcached分配的连接结构数量 |
reserved_fds |
20 |
内部使用的FD数 |
cmd_get |
20 |
get命令请求次数 |
cmd_set |
7 |
set命令请求次数 |
cmd_flush |
0 |
flush命令请求次数 |
cmd_touch |
0 |
touch命令请求次数 |
get_hits |
20 |
get命令命中次数 |
get_misses |
0 |
get命令未命中次数 |
delete_misses |
0 |
delete命令未命中次数 |
delete_hits |
0 |
delete命令命中次数 |
incr_misses |
0 |
incr命令未命中次数 |
incr_hits |
0 |
incr命令命中次数 |
decr_misses |
0 |
decr命令未命中次数 |
decr_hits |
0 |
decr命令命中次数 |
cas_misses |
0 |
cas命令未命中次数 |
cas_hits |
0 |
cas命令命中次数 |
cas_badval |
0 |
使用擦拭次数 |
touch_hits |
0 |
touch命令命中次数 |
touch_misses |
0 |
touch命令未命中次数 |
auth_cmds |
0 |
认证命令处理的次数 |
auth_errors |
0 |
认证失败数目 |
bytes_read |
6836 |
读取总字节数 |
bytes_written |
483107 |
发送总字节数 |
limit_maxbytes |
33554432 |
分配的内存总大小(字节) |
accepting_conns |
1 |
接受新的连接 |
listen_disabled_num |
0 |
失效的监听数 |
threads |
4 |
当前线程数 |
conn_yields |
0 |
连接操作主动放弃数目 |
hash_power_level |
16 |
hash表等级 |
hash_bytes |
262144 |
当前hash表大小 |
hash_is_expanding |
0 |
hash表正在扩展 |
expired_unfetched |
0 |
已过期但未获取的对象数目 |
evicted_unfetched |
0 |
已驱逐但未获取的对象数目 |
bytes |
313 |
当前存储占用的字节数 |
curr_items |
6 |
当前存储的数据总数 |
total_items |
6 |
启动以来存储的数据总数 |
evictions |
0 |
LRU释放的对象数目 |
reclaimed |
0 |
已过期的数据条目来存储新数据的数目 |
2、stats reset 清空统计数据
stats reset
RESET
stats
STAT pid 2305
STAT uptime 40596
STAT time 1294906749
STAT version 1.2.6
STAT pointer_size 64
STAT rusage_user 1.671745
STAT rusage_system 2.803573
STAT curr_items 86642
STAT total_items 0
STAT bytes 29865212
STAT curr_connections 14
STAT total_connections 0
STAT connection_structures 16
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 9
STAT bytes_written 14
STAT limit_maxbytes 67108864
STAT threads 4
END
3、stats malloc显示内存分配数据
stats malloc
STAT arena_size 708608
STAT free_chunks 4
STAT fastbin_blocks 0
STAT mmapped_regions 65
STAT mmapped_space 66752512
STAT max_total_alloc 0
STAT fastbin_space 0
STAT total_alloc 614032
STAT total_free 94576
STAT releasable_space 94272
END
4、stats maps是把/proc/self/maps的数据显示出来。如果远程攻击者连接到了memcached的TCP端口(默认11211)并发布了stats maps命令,Memcached就会直接将/proc/self/maps的输出管道传输给客户端。这可能导致泄漏所分配内存区域的地址。
stats maps
00365000-00378000 r-xp 00000000 08:01 149004 /lib/libnsl-2.3.4.so
00378000-00379000 r--p 00012000 08:01 149004 /lib/libnsl-2.3.4.so
00379000-0037a000 rw-p 00013000 08:01 149004 /lib/libnsl-2.3.4.so.
5、stats size
6、stats slabs
详细介绍stats slabs
STAT 1:chunk_size 88
STAT 1:chunks_per_page 11915
STAT 1:total_pages 1
STAT 1:total_chunks 11915
STAT 1:used_chunks 11915
STAT 1:free_chunks 0
STAT 1:free_chunks_end 11914
STAT active_slabs 1
STAT total_malloced 1048520
END
chunk_size:每个chunk(块)使用的空间数量,一个item存储到一个近似大小的chunk中
chunk_per_page:每page存在的chunk数量,slabs是按页(page)分配的,一页一般为1M,每个slab(也即每页)又划分为若干chunk,这里涉及到memcached的内存管理,这里不多解释,可以参考后面的附文。
total_pages:该slabclass分配到的page数量
total_chunks:该slabclass拥有的chunk数量
used_chunks:已经分配给item的chunk数量(不一定已经装填了item)
free_chunks:尚未分配给item的chunk数量,或者由delete释放的chunk
free_chunks_end:slabclass中最后一页的自由块数量,即该slabclass尚有多少自由块可以用来装填item
active_slabs:已分配的slabclass数量
total_malloced:已分配给slab page的内存数量
7、stats items显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)stats detail [on|off|dump]
设置或者显示详细操作记录
参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)
stats items dump
STAT items:1:number 7
STAT items:1:age 23124
STAT items:1:evicted 0
STAT items:1:outofmemory 0........
END
8、stats cachedumpslab_idlimit_num显示某个slab中的前limit_num个key列表,显示格式如下:ITEM key_name [ value_length b; expire_time|access_time s]其中,memcached 1.2.2及以前版本显示的是访问时间(timestamp) 1.2.4以上版本,包括1.2.4显示过期时间(timestamp)
如果是永不过期的key,expire_time会显示为服务器启动的时间
stats cachedump 7 2
ITEM copy_test1 [250 b; 1207795754 s]
ITEM copy_test [248 b; 1207793649 s]stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等
9、stats detail dump ( stats detail [on|off|dump] )
PREFIX copy_test2 get 1 hit 1 set 0 del 0
PREFIX copy_test1 get 1 hit 1 set 0 del 0
PREFIX cpy get 1 hit 0 set 0 del 0
四、memcached常用的客户端软件
官方介绍网页http://code.google.com/p/memcached/wiki/Clients
1、libmemcached为C和C++提供memcached连接的API,是其他语言也可以调用这个api连接,但过于底层但不好调用
目前最新的lobby启动这个库的支持(具体用看lddlobby)
https://launchpad.net/libmemcached/+download
2、memcachephp的API
3、python-memcachedpython的api
4、Cache::Memcachedperl的api
5、Shell用于通过nc命令管理
1、数据存储(假设key为test,value为12345)
printf "set test 0 0 5\r\n12345\r\n" | nc 192.168.3.100 11211
STORED
2、数据取回(假设key为test)
printf "get test\r\n" | nc192.168.3.100 11211
VALUE test 0 5
12345
END
3、数值增加1(假设key为test,并且value为正整数)
printf "incr test 1\r\n" | nc192.168.3.100 11211
12346
4、数值减少3(假设key为test,并且value为正整数)
printf "decr test 3\r\n" | nc192.168.3.100 11211
12343
5、数据删除(假设key为test)
printf "delete test\r\n" | nc 192.168.3.100 11211
DELETED
6、查看Memcached状态
printf "stats\r\n" | nc192.168.3.100 11211
五、memcached扩展软件
repcached
�C为memcached提供复制(replication)功能的patch
�C单master单slave,互为主辅
Flared
�C存储到QDBM。实现了异步复制和fail over等功能
memagent
�C连接多个memd,实现一致性Hash,请求转发
memcachedb
�Csina开发的存储到BerkleyDB
Tokyo Tyrant
�C存储到Tokyo Cabinet。与memcached协议兼容,能通过HTTP访问