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  chunk size growth factor(default:1.25)

例如:

使用2时,chunk的大小会以2的倍数增加:

memcached -m 512m -d -u root -c 8192 -f 2 -vv [root@zxq tmp]# slab class   1: chunk size        96 perslab   10922 slab class   2: chunk size       192 perslab    5461 slab class   3: chunk size       384 perslab    2730 slab class   4: chunk size       768 perslab    1365 slab class   5: chunk size      1536 perslab     682 slab class   6: chunk size      3072 perslab     341 slab class   7: chunk size      6144 perslab     170 slab class   8: chunk size     12288 perslab      85 slab class   9: chunk size     24576 perslab      42 slab class  10: chunk size     49152 perslab      21 slab class  11: chunk size     98304 perslab      10 slab class  12: chunk size    196608 perslab       5 slab class  13: chunk size    393216 perslab       2 slab 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   10922 slab class   2: chunk size       120 perslab    8738 slab class   3: chunk size       152 perslab    6898 slab class   4: chunk size       192 perslab    5461 slab class   5: chunk size       240 perslab    4369 slab class   6: chunk size       304 perslab    3449 slab class   7: chunk size       384 perslab    2730 slab class   8: chunk size       480 perslab    2184 slab class   9: chunk size       600 perslab    1747 slab class  10: chunk size       752 perslab    1394 slab class  11: chunk size       944 perslab    1110 slab class  12: chunk size      1184 perslab     885 slab class  13: chunk size      1480 perslab     708 slab class  14: chunk size      1856 perslab     564 slab class  15: chunk size      2320 perslab     451 slab class  16: chunk size      2904 perslab     361 slab class  17: chunk size      3632 perslab     288 slab class  18: chunk size      4544 perslab     230 slab class  19: chunk size      5680 perslab     184 slab class  20: chunk size      7104 perslab     147 slab class  21: chunk size      8880 perslab     118 slab class  22: chunk size     11104 perslab      94 slab class  23: chunk size     13880 perslab      75 slab class  24: chunk size     17352 perslab      60 slab class  25: chunk size     21696 perslab      48 slab class  26: chunk size     27120 perslab      38 slab class  27: chunk size     33904 perslab      30 slab class  28: chunk size     42384 perslab      24 slab class  29: chunk size     52984 perslab      19 slab class  30: chunk size     66232 perslab      15 slab class  31: chunk size     82792 perslab      12 slab class  32: chunk size    103496 perslab      10 slab class  33: chunk size    129376 perslab       8 slab class  34: chunk size    161720 perslab       6 slab class  35: chunk size    202152 perslab       5 slab class  36: chunk size    252696 perslab       4 slab class  37: chunk size    315872 perslab       3 slab class  38: chunk size    394840 perslab       2 slab class  39: chunk size    493552 perslab       2 slab class  40: chunk size    616944 perslab       1 slab class  41: chunk size    771184 perslab       1 slab class  42: chunk size   1048576 perslab       1 failed 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.gz tar zxf libevent-1.4.13-stable.tar.gz  cd libevent-1.4.13-stable ./configure  make make install cd ..

安装memcached:

wget http://memcached.org/files/old/memcached-1.4.13.tar.gz tar zxf memcached-1.4.13.tar.gz  cd memcached-1.4.13 ./configure  make make install cd ..

启动报错处理:

[root@zxq tools]# memcached -m 1m -p 11212 -d -c 8192 memcached: 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.conf ldconfig

2)启动memcached服务:

[root@zxq memcached-1.4.13]# which memcached /usr/local/bin/memcached memcached -m 16m -p 11212 -d -u root -c 8192 lsof -i :11212 COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME memcached 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 memcached tcp        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 memcached root     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)存储和查看数据

语法: \r\n\r

set k01 0 0 10\r\n9999999999\r

     set/add/replace

set              存储此数据,如果建存在,则之前的值将被替换

add             存储此数据,只在服务器未保留此键值对数据时

replace        存储此数据,只在服务器曾保留此键值的数据时

    是接下来的客户端所要求存储的数据的键值

   是在取回内容时,与数据和发送块一同保存服务器上的任意16位无符号整型(十进制)客户端可以用来作为“位域”来存储一些特定的信息,它对服务器是不透明的。

 是终止时间,如果为0,该项永不过期,虽然它可能被删除,以便为其他缓存项目腾出位置,如果为非0,到达终止时间后,客户端再无法获取到该项内容。

   是随后的数据区块的字节长度,不包括用于分野的"\r\n"它可以是0,但后面会跟随一个空的数据块。

\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 11212 STORED

get查看key k01的value:

[root@zxq lib]# printf "get k01\r\n"|nc 127.0.0.1 11212 VALUE k01 0 10 9999999999 END

delete删除key k01的键值对数据:

[root@zxq lib]# printf "delete k01\r\n"|nc 127.0.0.1 11212 DELETED

add添加键值,缓存中不存在值时,如果存在值会响应NOT_STORED

[root@zxq bin]# printf "set key01 0 0 2\r\nab\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "add key01 0 0 2\r\nab\r\n"|nc 127.0.0.1 11213 NOT_STORED

replace当键值存在时,replace命令才会替换缓存中的键,如果缓存中不存在键,会报NOT_STORED错误响应:

[root@zxq bin]# printf "replace key01 0 0 2\r\n88\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "replace key02 0 0 2\r\n99\r\n"|nc 127.0.0.1 11213 NOT_STORED

gets与get类似,只是会返回一个键值对的标识值

[root@zxq bin]# printf "set key03 0 0 5\r\n55555\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 5 55555 END [root@zxq bin]# printf "get key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 55555 END

cas用于设置键值对,与set相似的语法,但会使用gets执行后的额外标识值,来更改上次读取的键值对,如果标识值不对将报错:

[root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 7 88888 END [root@zxq bin]# printf "cas key03 0 0 5 8\r\n99999\r\n"|nc 127.0.0.1 11213 EXISTS [root@zxq bin]# printf "cas key03 0 0 5 7\r\n99999\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "gets key03\r\n"|nc 127.0.0.1 11213 VALUE key03 0 5 8 99999 END

5)stats查看memcached当前实例信息:

[root@zxq tmp]# printf "stats \r\n"|nc 127.0.0.1 11212 STAT pid 46673              进程ID STAT 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 11213 STAT 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 11213 STAT items:1:number 5 STAT items:1:age 2589 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 0 STAT items:1:expired_unfetched 0 STAT items:1:evicted_unfetched 0 STAT items:2:number 1 STAT items:2:age 3 STAT items:2:evicted 0 STAT items:2:evicted_nonzero 0 STAT items:2:evicted_time 0 STAT items:2:outofmemory 0 STAT items:2:tailrepairs 0 STAT items:2:reclaimed 0 STAT items:2:expired_unfetched 0 STAT items:2:evicted_unfetched 0 END [root@zxq bin]# printf "stats cachedump 1 0\r\n"|nc 127.0.0.1 11213 ITEM 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 11213 ITEM key05 [35 b; 1494188606 s] END

stats slabs显示各个slab的信息,包括chunk的大小,数目和使用情况等:

printf "stats slabs\r\n"|nc 127.0.0.1 11213 STAT 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 17 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 3 STAT 1:cas_badval 1            cas数据类型错误数 STAT 1:touch_hits 0            touch命令命中数 STAT 2:chunk_size 120 STAT 2:chunks_per_page 8738 STAT 2:total_pages 1 STAT 2:total_chunks 8738 STAT 2:used_chunks 2 STAT 2:free_chunks 0 STAT 2:free_chunks_end 8736 STAT 2:mem_requested 207 STAT 2:get_hits 0 STAT 2:cmd_set 3 STAT 2:delete_hits 0 STAT 2:incr_hits 0 STAT 2:decr_hits 0 STAT 2:cas_hits 0 STAT 2:cas_badval 0 STAT 2:touch_hits 0 STAT active_slabs 2 STAT total_malloced 2097072 END

stats settings 可以查看一些memcached设置例如线程数

[root@zxq bin]# printf "stats settings\r\n"|nc 127.0.0.1 11213 STAT maxbytes 15728640 STAT maxconns 8192 STAT tcpport 11213 STAT udpport 11213 STAT inter 127.0.0.1 STAT verbosity 0 STAT oldest 3537 STAT evictions off STAT domain_socket NULL STAT umask 700 STAT growth_factor 1.25 STAT chunk_size 48 STAT num_threads 4 STAT num_threads_per_udp 4 STAT stat_key_prefix : STAT detail_enabled no STAT reqs_per_event 20 STAT cas_enabled yes STAT tcp_backlog 1024 STAT binding_protocol auto-negotiate STAT auth_enabled_sasl no STAT item_size_max 1048576 STAT maxconns_fast no STAT hashpower_init 0 STAT slab_reassign no STAT slab_automove no END

stats sizes  查看存在的item大小和个数

[root@zxq bin]# printf "stats sizes\r\n"|nc 127.0.0.1 11213 STAT 96 6 STAT 128 2 END

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 11213 OK

append 将数据追加到当前缓存数据的之后,当缓存数据存在时才存储

[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 25 aaaaabbbbbcccccdddddeeeee END [root@zxq bin]# printf "append key07 0 0 5\r\n_@@@#\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 30 aaaaabbbbbcccccdddddeeeee_@@@# END

prepend 将数据追加到当前缓存数据的之前,当缓存数据存在时才存储

[root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE key07 0 30 aaaaabbbbbcccccdddddeeeee_@@@# END [root@zxq bin]# printf "prepend key07 0 0 5\r\n#####\r\n"|nc 127.0.0.1 11213 STORED [root@zxq bin]# printf "get key07\r\n"|nc 127.0.0.1 11213 VALUE 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.tgz tar 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-dir make make install Installing 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 -t Syntax 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.ini session.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=key export wwwServerIp=$1 export wwwServerPort=$2 cmd="nc $wwwServerIp $wwwServerPort" printf "delete $key1\r\n" | $cmd >/dev/null 2>&1 sleep 1 printf "set $key1 0 0 6\r\n123\r\n"|$cmd >/dev/null 2>&1 if [ `printf "get $key1\r\n"|$cmd|grep 123|wc -l` -eq 1 ]   then       echo "mc is alive."       exit 0 else       echo "mc is dead."       exit 2 fi

12、memcached调优

计算item占用空间:

item总大小=键长+值长+后缀长+item结构大小(48字节)+8(cas标志占用)

如果item_cas标志设置时,会有8字节的数据

item结构大小:32位系统32字节;64位系统48字节

例如:

memcached -u root -p 11212 -vv slab class   1: chunk size        96 perslab   10922 slab class   2: chunk size       120 perslab    8738 slab class   3: chunk size       152 perslab    6898 slab class   4: chunk size       192 perslab    5461 slab class   5: chunk size       240 perslab    4369 slab class   6: chunk size       304 perslab    3449 slab class   7: chunk size       384 perslab    2730 slab class   8: chunk size       480 perslab    2184 slab class   9: chunk size       600 perslab    1747 slab class  10: chunk size       752 perslab    1394 slab class  11: chunk size       944 perslab    1110 slab class  12: chunk size      1184 perslab     885 printf "set leng 0 0 40\r\n1111111111222222222211111111112222222222\r\n"|nc 127.0.0.1 11212 STORED

计算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 11212 ITEM 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 items memcache_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       done printf "\n\t]\n"  printf "}\n" }

2)配置监控脚本

cat memcached-status.conf  #!/bin/sh #this is memcached ststus scripts #date 2017-05-08 function status (){ ip=127.0.0.1 port=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

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:memcache配置-创新互联
网站链接:http://hbruida.cn/article/djcopp.html