Memcached简介
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
特征
memcached作为高速运行的分布式缓存服务器,具有以下的特点。
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
Memcached在企业中架构应用的位置
第一个作为数据库的内容缓存
第二个作为集群节点会话共享
那么架构上讲可以分为三层前端用户层 中间应用程序层,后面就是数据存储层,那么当数据通过互联网到达机房之后会先找负载均衡器,负载均衡器请求web服务器,假如是浏览一篇博文,那么web服务器先找内存缓存,如果内存缓存没有,那么会把请求转发到数据库,从数据库读完之后,再把数据放到内存一份,第二个用户再访问的时候就先访问缓存,就不会找数据库了,那么数据库的压力就降下来了,这就是内存缓存的作用。
CDN服务 ,就是一个分布式缓存系统,当用户请求图片的时候会先找CDN,CDN有就直接给用户访问了,大幅度的减轻网站压力,同时节省带宽。
缓存带来的问题:
客户发一张帖子到数据库里边也缓存到缓存memcached里边,别人访问就访问缓存了,发帖子的人发现我这个内容需要修改下,是先更新数据库,
不是先改缓存,其它用户访问就访问到缓存了,还是老的数据,有一个数据一致性的问题,所以程序员们这样设计,它在更新数据库的时候,它同时发送一个请求告诉memcached,对应的帖子过期了,那么memcached会把过期的数据删除,,会有这么一个机制,那么对于前端包括CDN,我们在更新图片的时候,告诉CND把旧的删除,但是对于图片来讲很少有更改的操作,它的更改是更改文件名操作上传,对于CDN来讲是不同的数据。
session保持不管是nginx还是apache只要用php,默认情况下会放在/tmp目录下,是在php.ini中指定的。
对于不同的服务器来讲,每个web服务器都放在自己的tmp下,早期会把会话保持到tmpfs文件系统里。
那么在php.ini里边可以用IP加端口指定会话保持
在企业工作当中memcached缓存重启数据全丢,假如数据丢了,数据库压力暴大
假如缓存每秒8000并发,数据库并发1000,一下压到数据库,数据库压力大就会down机,数据库刚要启又down
这种情况叫雪崩效应,这种情况下通常把负载均衡下的web用防火墙禁止对外访问。或者停掉
之后把memcached开启来,通过程序初始化把memcached缓存好,然后慢慢的把web打开。
lvs或者haproxy 做cache的负载均衡
假设缓存把数据a.jpg存储在cache1上,当用户访问a.JPG,如果访问
到cache2上去了,那cache2上没有就找数据库了,那数据库压力不就大嘛,
那缓存有没有了,有,只不过在cache1上,如果缓存把数据b.jpg存储在cache2上
那用户访问被请求到cache1上,那cache1上没有,那也只能找数据库,那这就是一个问题
那在前边负载算法就要指定url算法或者hash了,只要是这张图片只要是这个路径就存储到指定地点。
web集群是每个服务器内容一样的,不一样的放在后端NFS里边了 ,所以web集群可以wrr算法。
memcached应用安装
1. memcached服务端安装 tar xf libevent-1.4.13-stable.tar.gz cd libevent-1.4.13-stable ./configure make make install tar xf memcached-1.4.13.tar.gz cd memcached-1.4.13 ./configure make make install cd .. [root@TCS tools]# echo "/usr/local/lib" >> /etc/ld.so.conf #配置ld.so.conf路径防止启动出错 [root@TCS tools]# ldconfig [root@TCS tools]# which memcached /usr/local/bin/memcached [root@TCS tools]# /usr/local/bin/memcached -h #memcached相关参数
2.memcached启动 [root@TCS tools]# memcached -p 11211 -u root -m 16m -c 10240 -d # -p指定端口,-u 用户,-m 内存大小,-c 最大并发连接数,-d 后台运行 #其它参数: -P 设置保持Memcache的pid文件 -vv 以very vrebose模式启动,调试信息和错误输出到控制台 [root@TCS tools]# lsof -i :11211 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME memcached 13875 root 26u IPv4 20953 0t0 TCP *:memcache (LISTEN) memcached 13875 root 27u IPv6 20954 0t0 TCP *:memcache (LISTEN) memcached 13875 root 28u IPv4 20957 0t0 UDP *:memcache memcached 13875 root 29u IPv6 20958 0t0 UDP *:memcache #memcached的多实例 [root@TCS tools]# memcached -p 11212 -u root -m 16m -c 10240 -d [root@TCS tools]# netstat -lnt|grep 1121 tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:11212 0.0.0.0:* LISTEN tcp 0 0 :::11211 :::* LISTEN tcp 0 0 :::11212 :::* LISTEN 3. 开机自启动 放到/etc/rc.local中 memcached -p 11212 -u root -m 16m -c 10240 -d 4.写入数据检查结果 a.通过nc写入 [root@TCS tools]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 127.0.0.1 11211 #增加 ,命令的字节是10,后面就要10个字符,否则添加不成功。 STORED [root@TCS tools]# printf "get key008\r\n"|nc 127.0.0.1 11211 #查询 VALUE key008 0 10 oldboy0987 END [root@TCS tools]# printf "delete key008\r\n"|nc 127.0.0.1 11211 #删除 DELETED [root@TCS tools]# printf "get key008\r\n"|nc 127.0.0.1 11211 #查询 END b.通过telnet写数据 [root@TCS tools]# telnet 192.168.179.134 11211 Trying 192.168.179.134... Connected to 192.168.179.134. Escape character is '^]'. set key 0 0 10 #写数据 zhousq STORED get key #查询 VALUE key 0 10 zhousq END delete key #删除 DELETED get key END #CTRL+] 退回,然后qujit退出 #建议用第一种,有时telnet会很慢 通过stats可以查看写入数据的状态信息 [root@TCS tools]# printf "stats\r\n"|nc 127.0.0.1 11211 STAT pid 14254 STAT uptime 312 STAT time 1461179190 STAT version 1.4.13 STAT libevent 1.4.13-stable STAT pointer_size 64 STAT rusage_user 0.000000 STAT rusage_system 0.015997 STAT curr_connections 10 STAT total_connections 14 STAT connection_structures 11 STAT reserved_fds 20 STAT cmd_get 1 STAT cmd_set 0 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 0 #查询 命中的数量 STAT get_misses 1 #丢失数量 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 31 STAT bytes_written 1039 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 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT bytes 0 STAT curr_items 0 #往数据库插一条数据就有一条记录 STAT total_items 0 #当前没有记录,因为删除了 STAT evictions 0 STAT reclaimed 0 END 5. 重启数据丢失
(通过简单shell可以让memcache变为持久化存储)
6. memcache客户端安装 tar xf memcache-2.2.5.tgz cd memcache-2.2.5 /application/php/bin/phpize ./configure --with-php-config=/application/php/bin/php-config make make install ls /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/ 7. 测试 [root@TCS www]# cat test.php <?php $mem = new Memcache; $mem->connect("192.168.179.134", 11211) or die("Could not connect"); $version = $mem->getVersion(); echo "Server's version: ".$version."<br/>\n"; $mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)<br/>\n"; $get_result = $mem->get('testkey'); echo "$get_result is from memcached server."; ?> #浏览器访问 http://192.168.179.134/test.php 返回结果如下。说明已经测试OK Server's version: 1.4.13 Store data in the cache (data will expire in 600 seconds) Hello World is from memcached server. 8.session共享会话存储.在php.ini文件中改为相对应选项 session.save_handler memcache session.save_path tcp://192.168.179.134:11211 把所有web服务器的php.ini改成一样的地址,这样就保持了会话保持 集群架构多服务器同步session的多种方式: 1.lb层可以做会话保持:例如: lvs -p nginx ip_hash hapoxy cookie insert PHP JAVA都可以用 2.软件层,可以做session复制,例如: tomcat ,resin,couchbase 3,session共享,例如: memcached或者其它工具的nosql工具,php常用这个。 4.高并发场景:例如门户网站用cookies或cookies配合session把用户级会话信息缓存在用户本地; 9.memcache 图形管理工具 [root@TCS tools]# tar xf memadmin-1.0.12.tar.gz [root@TCS tools]# mv memadmin /var/html/www/ [root@TCS tools]# /application/apache/bin/apachectl graceful http://192.168.179.134/memadmin/ 默认用户密码 admin:admin 10.内存管理机制的调优
指定1.25组间差距比因子为2时小得多,更适合缓存几百字节的记录。 [root@TCS tools]# memcached -m 512m -d -u root -c 8192 -f 2 -vv [root@TCS tools]# 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 [root@TCS tools]# memcached -m 512m -d -u root -c 8192 -f 1.25 -vv [root@TCS tools]# 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 11.memcachedb和TTSERVER持久化存储,兼容memcached协议。 12.memcached监控 check_me_sh #!/bin/sh [ $# -ne 2 ]&&{ echo "$0 ip port" exit } export oldboy=key export wwwServerIp=$1 export wwwServerPort=$2 cmd="nc $wwwServerIp $wwwServerPort" printf "delete $oldboy\r\n" | $cmd >/dev/null 2>&1 sleep 1 printf "set $oldboy 0 0 6\r\noldboy\r\n"|$cmd >/dev/null 2>&1 if [ `printf "get $oldboy\r\n"|$cmd|grep oldboy|wc -l` -eq 1 ] then echo "mc is alive." exit 0 else echo "mc is dead." exit 2 fi