安装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用直观化的图表方式实现:
参考资料
- 《memcached全面剖析》
- 《nosql数据库入门》
- memcached协议