memcache配置
1、memecached介绍
是一个开源的,高性能的内存缓存软件,通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速动态服务的能力。
memcache是基于libevent的事件处理,利用这个库进行异步事件处理。
2、memecached在企业中的应用
1)作为数据库的前端缓存应用,完整缓存,热点缓存
2)作为集群的session会话共享存储
3、memecached服务在企业业务中的工作流程
1)当web程序访问后端数据库时会优先访问memcached内存缓存,如果缓存命中数据就直接获取数据返回给前端用户,如果没有命中数据,再由程序请求后端数据库服务器,获取对应数据后,返回给前端用户并将数据存放到memcached内存中进行缓存,等待下次请求访问。
2)当程序更新,修改或删除数据库中已有的数据时,会同时发送请求通知memcached已经缓存过的同一个ID内存失效,从而保证memcache中的数据和数据库中的数据一致。
3)数据库插件可以在写入更新数据库后,自动将更新数据推送给memcached缓存起来。
4、memcached服务分布式集群的实现
memcached集群中,每个memcache服务器互不通信,都是个体的,每个服务器只管理自己服务器的数据,所有memcached服务器的缓存的数据总和才是数据库中的整个数据。
1)程序端实现:程序加载所有memcached的ip列表,通过对key做hash(一致性哈希)
2)负载均衡器:(LVS keplaved)
一致性哈希:保证每个对象只请求一个对应的服务器,而且当节点宕机后保证数据更新的最小化。
5、memcached服务特点及工作原理
1)完全基于内存的
2)节点之间相互独立
3)基于异步I/O模型,使用libevent作为事件通知机制
4)缓存数据以key/value对形式存在的
5)c/s模式架构,c语言编写,总代码为2000多行
6)全部数据存储在内存中,无持久性存储设计,重启服务数据会丢失。
7)可以对存储数据设置过期时间,服务本身不会监控过期,而是访问的时候查看key的时间戳判断是否过期。
8)memcached内存分配机制是对特定的内存进行分块,再把多个分块进行分组
6、memcached内存管理机制
malloc的全称是memory allocaion,中文叫动态内存分配,当无法知道内存具体位置时,想要绑定内存空间,就需要用到动态的分配内存。
早期的memcached内存管理方式是通过malloc分配的内存,使用完后回收内存会产生碎片,会降低操作系统对内存的管理,加重操作系统内存管理器的负担,会导致操作系统比memcached进程本地还慢,为了解决上述问题,slab allocator内存分配机制就诞生了。
Slab Allocation机制原理是按照预先规定的大小,将分配给memcached的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。
memcached服务器中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据存储在其中,当有数据存入时,memcached会根据数据的大小,选择最合适的数据大小的slab分配一个能存储下这个数据的最小内存块(chunk).例如:有100字节的数据就会分配存入112字节的一个内存块中,这样就会浪费掉12字节的内存空间,这是slab allocation机制的一个缺点。
1)slab allocation的主要术语:
page:分配给slab的内存空间,默认是1MB,分配给slab之后根据slab的大小切分成chunk
chunk:用于缓存数据的内存空间或内存块
slab class:特定大小的多个chunk的集合或组
2)memcached slab allocation内存管理机制优化:
在启动时指定"-f"参数,能控制内存组之间的大小差异,在应用中使用memcached时,通常不重新设置这个参数,默认值为1.25进行部署,如果想优化memcached对内存的使用,可以考虑重新计算数据的预期平均长度,调整这个参数来获取合适的设置值。
-f
例如:
使用2时,chunk的大小会以2的倍数增加:
memcached -m 512m -d -u root -c 8192 -f 2 -vv[root@zxq tmp]# slab class 1: chunk size 96 perslab 10922slab class 2: chunk size 192 perslab 5461slab class 3: chunk size 384 perslab 2730slab class 4: chunk size 768 perslab 1365slab class 5: chunk size 1536 perslab 682slab class 6: chunk size 3072 perslab 341slab class 7: chunk size 6144 perslab 170slab class 8: chunk size 12288 perslab 85slab class 9: chunk size 24576 perslab 42slab class 10: chunk size 49152 perslab 21slab class 11: chunk size 98304 perslab 10slab class 12: chunk size 196608 perslab 5slab class 13: chunk size 393216 perslab 2slab class 14: chunk size 1048576 perslab 1<26 server listening (auto-negotiate)<27 server listening (auto-negotiate)<28 send buffer was 124928, now 268435456<29 send buffer was 124928, now 268435456<28 server listening (udp)<29 server listening (udp)<28 server listening (udp)<29 server listening (udp)<28 server listening (udp)<29 server listening (udp)<28 server listening (udp)<29 server listening (udp)
使用1.25时,chunk间隔会很小,存储小文件时内存浪费会减少很多:
[root@zxq tmp]# memcached -m 512m -d -u root -c 8192 -f 1.25 -vv[root@zxq tmp]# slab class 1: chunk size 96 perslab 10922slab class 2: chunk size 120 perslab 8738slab class 3: chunk size 152 perslab 6898slab class 4: chunk size 192 perslab 5461slab class 5: chunk size 240 perslab 4369slab class 6: chunk size 304 perslab 3449slab class 7: chunk size 384 perslab 2730slab class 8: chunk size 480 perslab 2184slab class 9: chunk size 600 perslab 1747slab class 10: chunk size 752 perslab 1394slab class 11: chunk size 944 perslab 1110slab class 12: chunk size 1184 perslab 885slab class 13: chunk size 1480 perslab 708slab class 14: chunk size 1856 perslab 564slab class 15: chunk size 2320 perslab 451slab class 16: chunk size 2904 perslab 361slab class 17: chunk size 3632 perslab 288slab class 18: chunk size 4544 perslab 230slab class 19: chunk size 5680 perslab 184slab class 20: chunk size 7104 perslab 147slab class 21: chunk size 8880 perslab 118slab class 22: chunk size 11104 perslab 94slab class 23: chunk size 13880 perslab 75slab class 24: chunk size 17352 perslab 60slab class 25: chunk size 21696 perslab 48slab class 26: chunk size 27120 perslab 38slab class 27: chunk size 33904 perslab 30slab class 28: chunk size 42384 perslab 24slab class 29: chunk size 52984 perslab 19slab class 30: chunk size 66232 perslab 15slab class 31: chunk size 82792 perslab 12slab class 32: chunk size 103496 perslab 10slab class 33: chunk size 129376 perslab 8slab class 34: chunk size 161720 perslab 6slab class 35: chunk size 202152 perslab 5slab class 36: chunk size 252696 perslab 4slab class 37: chunk size 315872 perslab 3slab class 38: chunk size 394840 perslab 2slab class 39: chunk size 493552 perslab 2slab class 40: chunk size 616944 perslab 1slab class 41: chunk size 771184 perslab 1slab class 42: chunk size 1048576 perslab 1failed to listen on TCP port 11211: Address already in use
7、memcached对象删除原来与cache机制
memecached主要的cache机制是LRU最近最少用的算法,加上item过期失效,当存储数据到memcached中,可指定该数据在缓存中可以呆多久,如果memcached的内存不够用了,过期的slabs会优先被替换,接着就会轮到最老的未被使用的slabs。在某些情况下(完整缓存),如果不想使用LRU算法,可以通过"-M"参数来启动memcached,这样,memcahced在内存耗尽时,会返回一个报错信息。
-M return error on memeory exhausted(rather than removing items)
8、memcached服务端的安装
1)服务端的安装
memcached下载地址:http://www.danga.com/memcached/
memcached其他下载地址:http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
libevent下载地址:http://monkey.org/~provos/libevent/
网友安装参考:http://instance.iteye.com/blog/1691705
由于memcache是基于libevent事件库文件的,所以要先安装libevetn:
wget https://github.com/downloads/libevent/libevent/libevent-1.4.13-stable.tar.gztar zxf libevent-1.4.13-stable.tar.gz cd libevent-1.4.13-stable./configure makemake installcd ..
安装memcached:
wget http://memcached.org/files/old/memcached-1.4.13.tar.gztar zxf memcached-1.4.13.tar.gz cd memcached-1.4.13./configure makemake installcd ..
启动报错处理:
[root@zxq tools]# memcached -m 1m -p 11212 -d -c 8192memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory解决方法:就是让系统能加载到libevent库文件。echo "/usr/local/lib" >> /etc/ld.so.confldconfig
2)启动memcached服务:
[root@zxq memcached-1.4.13]# which memcached/usr/local/bin/memcachedmemcached -m 16m -p 11212 -d -u root -c 8192lsof -i :11212COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmemcached 46673 root 26u IPv4 244455 0t0 TCP *:11212 (LISTEN)memcached 46673 root 27u IPv6 244456 0t0 TCP *:11212 (LISTEN)memcached 46673 root 28u IPv4 244459 0t0 UDP *:11212 memcached 46673 root 29u IPv6 244460 0t0 UDP *:11212 netstat -lntup|grep memcachedtcp 0 0 0.0.0.0:11212 0.0.0.0:* LISTEN 46673/memcached tcp 0 0 :::11212 :::* LISTEN 46673/memcached udp 0 0 0.0.0.0:11212 0.0.0.0:* 46673/memcached udp 0 0 :::11212 :::* 46673/memcached ps -ef|grep memcachedroot 46673 1 0 17:15 ? 00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192
3)memcached相关启动参数说明:
-p 指定memcached服务监听TCP端口号,默认为11211
-m 指定memcached服务可以缓存数据的最大内存,默认为64MB
-u 运行memcached的用户
-d 作为守护进程在后台运行
-c 最大的并发连接数,默认是1024,安装服务器的并发访问量来设置
-vv 以very vrebose模式启动,调试信息和错误输出到控制台
-P 设置保存memcached的PID文件
-l 指定监听的服务器ip地址
-f 调优因子
-M 不使用LRU算法删除缓存,当内存不够用时会报错
其他选择,通过memcached -h查看
memcached -m 15m -d -u root -p 11213 -M -c 8192 -P /var/run/memcached.pid -f 1.25 -l 127.0.0.1
4)存储和查看数据
语法:
set k01 0 0 10\r\n9999999999\r\n
set 存储此数据,如果建存在,则之前的值将被替换
add 存储此数据,只在服务器未保留此键值对数据时
replace 存储此数据,只在服务器曾保留此键值的数据时
\r\n 是大段的8位数据,其长度由前面的命令行中的
使用printf打印数据,使用nc连接到memcached
set设置key为k01,value为999999999,主要指定字符串大小要与后面的数据对应上。
[root@zxq lib]# printf "set k01 0 0 10\r\n9999999999\r\n"|nc 127.0.0.1 11212STORED
get查看key k01的value:
[root@zxq lib]# printf "get k01\r\n"|nc 127.0.0.1 11212VALUE k01 0 109999999999END
delete删除key k01的键值对数据:
[root@zxq lib]# printf "delete k01\r\n"|nc 127.0.0.1 11212DELETED
add添加键值,缓存中不存在值时,如果存在值会响应NOT_STORED
[root@zxq bin]# printf "set key01 0 0 2\r\nab\r\n"|nc 127.0.0.1 11213STORED[root@zxq bin]# printf "add key01 0 0 2\r\nab\r\n"|nc 127.0.0.1 11213NOT_STORED
replace当键值存在时,replace命令才会替换缓存中的键,如果缓存中不存在键,会报NOT_STORED错误响应:
[root@zxq bin]# printf "replace key01 0 0 2\r\n88\r\n"|nc 127.0.0.1 11213STORED[root@zxq bin]# printf "replace key02 0 0 2\r\n99\r\n"|nc 127.0.0.1 11213NOT_STORED
gets与get类似,只是会返回一个键值对的标识值
[root@zxq bin]# printf "set key03 0 0 5\r\n55555\r\n"|nc 127.0.0.1 11213STORED[root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213VALUE key03 0 5 555555END[root@zxq bin]# printf "get key03\r\n"|nc 127.0.0.1 11213VALUE key03 0 555555END
cas用于设置键值对,与set相似的语法,但会使用gets执行后的额外标识值,来更改上次读取的键值对,如果标识值不对将报错:
[root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213VALUE key03 0 5 788888END[root@zxq bin]# printf "cas key03 0 0 5 8\r\n99999\r\n"|nc 127.0.0.1 11213EXISTS[root@zxq bin]# printf "cas key03 0 0 5 7\r\n99999\r\n"|nc 127.0.0.1 11213STORED[root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213VALUE key03 0 5 899999END
5)stats查看memcached当前实例信息:
[root@zxq tmp]# printf "stats \r\n"|nc 127.0.0.1 11212STAT pid 46673 进程IDSTAT uptime 25336 服务器运行秒数STAT time 1494173893 服务器当前unix时间戳STAT version 1.4.13 memcached版本STAT libevent 1.4.13-stable libevent版本STAT pointer_size 64 操作系统位数,64位STAT rusage_user 0.642902 进程累计用户时间STAT rusage_system 0.303953 进程累计系统时间STAT curr_connections 10 当前打开连接数STAT total_connections 25 memecached运行以来连接总数STAT connection_structures 11 memcached分配的连接结构数STAT reserved_fds 20 内部使用的FD数STAT cmd_get 7 执行get命令总数STAT cmd_set 3 执行set命令总数STAT cmd_flush 0 执行flush_all命令总数STAT cmd_touch 0 touch命令请求总数STAT get_hits 3 get命中次数STAT get_misses 4 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 使用擦拭次数STAT touch_hits 0 touch命中次数STAT touch_misses 0 touch未命中次数STAT auth_cmds 0 认证命令处理次数STAT auth_errors 0 认证失败数目STAT bytes_read 358 读取字节总数STAT bytes_written 160 写入字节总数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 expired_unfetched 0 已过期但未获取大对象数目STAT evicted_unfetched 0 已驱逐但未获取大对象数目STAT bytes 166 当前存储占用字节数STAT curr_items 2 当前存储的数据总个数STAT total_items 3 启动以来存储的数据总数STAT evictions 0 LRU释放的对象数目STAT reclaimed 0 已过期的数据条目来存储新数据的数目END
stats items 查看items行内容:
[root@zxq bin]# printf "stats items\r\n"|nc 127.0.0.1 11213STAT items:1:number 4 该slab中对象数(不包含过期对象)STAT items:1:age 1941 LRU队列中最老对象的过期时间STAT items:1:evicted 0 LRU释放对象数STAT items:1:evicted_nonzero 0 设置了非0时间的LRU释放对象数STAT items:1:evicted_time 0 最后一次LRU释放的对象存在时间STAT items:1:outofmemory 0 不能存储对象次数STAT items:1:tailrepairs 0 修复slabs次数STAT items:1:reclaimed 0 使用过期对象空间存储对象次数STAT items:1:expired_unfetched 0 已过期但未获取的对象数目STAT items:1:evicted_unfetched 0 已驱逐但未获取的对象数目END
stats cachedump slabs_id limit_num,slabs_id是由stats items返回的值,也就是项目组号,limit_num返回的记录数,0为返回所有记录,可以两者结合遍历memcache所有记录数据:
[root@zxq bin]# printf "stats items\r\n"|nc 127.0.0.1 11213STAT items:1:number 5STAT items:1:age 2589STAT items:1:evicted 0STAT items:1:evicted_nonzero 0STAT items:1:evicted_time 0STAT items:1:outofmemory 0STAT items:1:tailrepairs 0STAT items:1:reclaimed 0STAT items:1:expired_unfetched 0STAT items:1:evicted_unfetched 0STAT items:2:number 1STAT items:2:age 3STAT items:2:evicted 0STAT items:2:evicted_nonzero 0STAT items:2:evicted_time 0STAT items:2:outofmemory 0STAT items:2:tailrepairs 0STAT items:2:reclaimed 0STAT items:2:expired_unfetched 0STAT items:2:evicted_unfetched 0END[root@zxq bin]# printf "stats cachedump 1 0\r\n"|nc 127.0.0.1 11213ITEM key04 [15 b; 1494188606 s]ITEM key03 [5 b; 1494188606 s]ITEM key01 [2 b; 1494188606 s]ITEM userID [5 b; 1494188606 s]ITEM userid [5 b; 1494188606 s]END[root@zxq bin]# printf "stats cachedump 2 0\r\n"|nc 127.0.0.1 11213ITEM key05 [35 b; 1494188606 s]END
stats slabs显示各个slab的信息,包括chunk的大小,数目和使用情况等:
printf "stats slabs\r\n"|nc 127.0.0.1 11213STAT 1:chunk_size 96 chunk大小(byte)STAT 1:chunks_per_page 10922 每个page的chunk数量STAT 1:total_pages 1 page数量STAT 1:total_chunks 10922 chunk总数量(chunks_per_page*total_pages) STAT 1:used_chunks 6 已被分配的chunk数量STAT 1:free_chunks 1 过期数据空出的chunk数STAT 1:free_chunks_end 10915 从未被使用过的chunk数STAT 1:mem_requested 481 请求存储的字节数STAT 1:get_hits 6 get命令命中数STAT 1:cmd_set 17STAT 1:delete_hits 0STAT 1:incr_hits 0STAT 1:decr_hits 0STAT 1:cas_hits 3STAT 1:cas_badval 1 cas数据类型错误数STAT 1:touch_hits 0 touch命令命中数STAT 2:chunk_size 120STAT 2:chunks_per_page 8738STAT 2:total_pages 1STAT 2:total_chunks 8738STAT 2:used_chunks 2STAT 2:free_chunks 0STAT 2:free_chunks_end 8736STAT 2:mem_requested 207STAT 2:get_hits 0STAT 2:cmd_set 3STAT 2:delete_hits 0STAT 2:incr_hits 0STAT 2:decr_hits 0STAT 2:cas_hits 0STAT 2:cas_badval 0STAT 2:touch_hits 0STAT active_slabs 2STAT total_malloced 2097072END
stats settings 可以查看一些memcached设置例如线程数
[root@zxq bin]# printf "stats settings\r\n"|nc 127.0.0.1 11213STAT maxbytes 15728640STAT maxconns 8192STAT tcpport 11213STAT udpport 11213STAT inter 127.0.0.1STAT verbosity 0STAT oldest 3537STAT evictions offSTAT domain_socket NULLSTAT umask 700STAT growth_factor 1.25STAT chunk_size 48STAT num_threads 4STAT num_threads_per_udp 4STAT stat_key_prefix :STAT detail_enabled noSTAT reqs_per_event 20STAT cas_enabled yesSTAT tcp_backlog 1024STAT binding_protocol auto-negotiateSTAT auth_enabled_sasl noSTAT item_size_max 1048576STAT maxconns_fast noSTAT hashpower_init 0STAT slab_reassign noSTAT slab_automove noEND
stats sizes 查看存在的item大小和个数
[root@zxq bin]# printf "stats sizes\r\n"|nc 127.0.0.1 11213STAT 96 6STAT 128 2END
stats reset 清理统计数据
printf "stats reset\r\n"|nc 127.0.0.1 11213
flush_all用于清理存储中的所有键值对:
[root@zxq bin]# printf "flush_all\r\n"|nc 127.0.0.1 11213OK
append 将数据追加到当前缓存数据的之后,当缓存数据存在时才存储
[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213VALUE key07 0 25aaaaabbbbbcccccdddddeeeeeEND[root@zxq bin]# printf "append key07 0 0 5\r\n_@@@#\r\n"|nc 127.0.0.1 11213STORED[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213VALUE key07 0 30aaaaabbbbbcccccdddddeeeee_@@@#END
prepend 将数据追加到当前缓存数据的之前,当缓存数据存在时才存储
[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213VALUE key07 0 30aaaaabbbbbcccccdddddeeeee_@@@#END[root@zxq bin]# printf "prepend key07 0 0 5\r\n#####\r\n"|nc 127.0.0.1 11213STORED[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213VALUE key07 0 35#####aaaaabbbbbcccccdddddeeeee_@@@#END
也可以使用Telnet连接memcached进入交互式操作
9、客户端的安装
安装lamp/LNMP环境,要求apache或nginx能解析PHP文件,才能继续安装客户端
安装memcache的php的客户端及memcache的扩展,下载php扩展:http://pecl.php.net/package/memcache选择要下载的memcache版本。java程序一样需要客户端(resion,tomcat),但不会像php一样编译。
在PHP服务器上安装memcache客户端:
wget http://pecl.php.net/get/memcache-2.2.5.tgztar zxf memcache-2.2.5.tgz cd memcache-2.2.5/usr/local/php/bin/phpize ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dirmakemake installInstalling shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/[root@zxq memcache-2.2.5]# ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
安装完会在此文件中生成memcache.so文件
-rwxr-xr-x 1 root root 260451 5月 7 17:59 memcache.so-rwxr-xr-x 1 root root 589308 5月 4 20:59 opcache.so
修改php.ini配置文件:指定memcache.so文件路径
echo "extension=memcache.so" >> /usr/local/php/etc/php.ini grep ^extension /usr/local/php/etc/php.ini
重启动apache服务使php的配置生效
[root@zxq ~]# apachectl -tSyntax OK[root@zxq ~]# apachectl graceful
如果是nginx则重启动php-fpm服务
打开phpinfo加载网页,能看到memcache模块就算成功了!
建立测试文件,实现PHP与memcache交换数据:
connect('10.0.0.4', 11212) or die ("could not connect");$memcache->set('key001', '123');$memcache->set('key002', 'abc');$get_value001 = $memcache->get('key001');$get_value002 = $memcache->get('key002');echo $get_value002."
";echo $get_value001;?>
访问目录能读到123,abc,php程序与memcache交互成功!
10、memcache实现web集群的session会话保持
修改所有web节点的php.ini配置文件指定session文件路径到memcache服务器上
vim /usr/local/php/etc/php.inisession.save_handler = memcache #指定session存储方式session.save_path = "tcp://10.0.0.4:11212" #指定session保存路径memcached -m 15m -d -u root -p 11212 -M -c 8192 -P /var/run/memcached.pid -f 1.25 -l 10.0.0.4
集群架构多服务器同步session的多种方式:
1)lb层可以做会话保持,例如
lvs -p
nginx ip_hash
hapoxy cookie insert
PHP,java都可以用
2)软件层,可以做session复制,例如
tomcat,resion,couchbase
3)session共享,例如
memcache或其他工具的nosql工具,PHP常用这个
4)高并发场景:例如门户网站用cookies或cookies配合session把用户级会话信息缓存在用户本地。
11、监控memcache需要监控的具体指标
1)端口11212
2)命中率:STAT get_hits 3 STAT get_misses 4
3)反应时间:STAT uptime 25336
监控脚本:
#!/bin/sh[ $# -ne 2 ]&&{ echo "$0 ip port" exit}export key1=keyexport wwwServerIp=$1export wwwServerPort=$2cmd="nc $wwwServerIp $wwwServerPort"printf "delete $key1\r\n" | $cmd >/dev/null 2>&1sleep 1printf "set $key1 0 0 6\r\n123\r\n"|$cmd >/dev/null 2>&1if [ `printf "get $key1\r\n"|$cmd|grep 123|wc -l` -eq 1 ] then echo "mc is alive." exit 0else echo "mc is dead." exit 2fi
12、memcached调优
计算item占用空间:
item总大小=键长+值长+后缀长+item结构大小(48字节)+8(cas标志占用)
如果item_cas标志设置时,会有8字节的数据
item结构大小:32位系统32字节;64位系统48字节
例如:
memcached -u root -p 11212 -vvslab class 1: chunk size 96 perslab 10922slab class 2: chunk size 120 perslab 8738slab class 3: chunk size 152 perslab 6898slab class 4: chunk size 192 perslab 5461slab class 5: chunk size 240 perslab 4369slab class 6: chunk size 304 perslab 3449slab class 7: chunk size 384 perslab 2730slab class 8: chunk size 480 perslab 2184slab class 9: chunk size 600 perslab 1747slab class 10: chunk size 752 perslab 1394slab class 11: chunk size 944 perslab 1110slab class 12: chunk size 1184 perslab 885printf "set leng 0 0 40\r\n1111111111222222222211111111112222222222\r\n"|nc 127.0.0.1 11212STORED
计算leng总长度:48+8+4+40=100
所以leng值就会选择slab 2的120字节里来存储leng数据:
[root@zxq htdocs]# printf "stats cachedump 2 0\r\n"|nc 127.0.0.1 11212ITEM leng [40 b; 1494182061 s]END
优化方案:先估算将要存储的数据大小值,再通过-f选项调优chunk大小,以最小满足存储值大小存储数据,已达到最小内存浪费。
可使用-M启动memcache,不使用LRU算法删除数据,因为LRU不是全局的,而是针对slab区域的。可以使用脚本检测stats tiems的值,保证内存空闲,清除过久未访问的数据。
13、zabbix监控实例:
缓存命中率 = get_hits/cmd_get * 100% ;get_misses的数字加上get_hits应该等于cmd_get
1)配置自动发现脚本
cat memdiscover.sh #!/bin/sh#function:discovery memcache itemsmemcache_discovery () { Memitems=(`/usr/bin/printf "stats\r\n"|nc 127.0.0.1 11212|awk '{print $2}'`) length=${#Memitems[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#ITEMNAME}\":\"${Memitems[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi doneprintf "\n\t]\n" printf "}\n"}
2)配置监控脚本
cat memcached-status.conf #!/bin/sh#this is memcached ststus scripts#date 2017-05-08function status (){ip=127.0.0.1port=11212/usr/bin/printf "stats\r\n"|nc $ip $port}status | grep -w $1 | awk '{print $3}'
3)配置web页面
configureation => Templates => Create template
Template name:memcache_discovery
Groups In groups:nosql
configureation => Templates => memcache_discovery => Discovery => create discovery rule
name:memcache.stats
type:zabbix agent
key:memcache.stats
update interval:30
Fitters:{$ITEMANME}
configureation => Templates => memcache_discovery => item prototypes => create item prototype
name:mem.stat on $1
type:zabbix agent
key:mem.stats[{#ITEMNAME}]
configureation => Templates => memcache_discovery => Graph prototypes => create graph prototype
name:memcache on {#ITEMNAME}
items:Add prototype ==》 memcache_discovery:mem.stats on {#ITEMNAME}
$zabbix_get -s 127.0.0.1 -k mem.stats[get_hits]
61992