Memcache :
Memcached是一个开源、高性能的内存缓存软件;
Memcache的作用:
Memcached通过在事先规划好在内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。
Memcache服务在不同企业集群架构中的应用场景:
(1)作为数据库前端缓存应用
a 完整缓存(易),静态缓存 例如:商品分类,商品信息可事先放到内存里,然后再对外提供数据访问,这种方式称为 预热,用户访问时可以只读取Memcached缓存,不读取数据库。 b 预热缓存(难)特殊说明: 如果碰到电商秒杀等高并发的业务,一定要事先预热,或者其它方法实现。例如:
秒杀只是获取资格(js、 node.js处理),把瞬间的大并发平滑的接住通过一段时
间解决掉而不是瞬间秒杀到手商品。
****需要前端web程序配合,只缓存热点的数据,即缓存经常被访问的数据***。
①先把数据库的基础数据预热到MC里,然后在动态跟新。先读取缓存访问时先读取mc数据。如果缓存里没有对应的数据,由程序在去读取数据库,然后把读到的数据放入缓存储存。
②如果数据更新,同时出发MC 缓存跟新,防止给用户过期数据;c 对于持久化缓存存储系统:
例如redis,可以替代一部分数据库的存储,一些简单的数据业务,投票、统计、好友关注、商
品分类等,但是它将来做集群时也有一定的问题。
(2) 作为集群的session汇话共享存储;
Memcached服务特点及原理
a 、C/S模式的架构;c语言编写的,总共2000行代码;
b 、异步I/O模型,使用libevent作为事件通知机制;c 、被缓存的数据以key/value的键值形式存在的;#d 、全部数据存放于内存中,无持久性存储的设计,重启Memcached服务,Memcached内存中的数据即丢失;#
c 、当内存汇总缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据;d、可以对存储数据设置过期时间,这样过期后数据自动清楚,服务本身不会监控过期,而是在访问的时
候查看key的时间戳判读是否过期。
e、Memcached会对设定的内存进行分块(类似磁盘的block),块大小可能不相同,再把相同大小的块分组,然后在存储数据提供服务。
Memcached内存管理机制深入剖析
malloc 全称: memory allocation 中文:动态内存分配;当无法知道内存具体位置的时候想,想要绑定真正的内存空间,就需要用到动态的分配内存。
早期的Memcached内存管理方式是通过malloc分配的内存,使用完后通过free来回收内存呢,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。加重操作系统内存管理器的负担。 现在的Memcached利用Slab Allocation机制来分配和管理内存,Slab Allocation 内存分配机制原理是按照预先规定的大小,将分配给Memcached服务的内存预先分割成特定长度的内存块(chunk),再把尺寸相同的内存块chunk分成组(chunks slab class),这些内存块不会释放,可以重复利用。 Memcached 服务器端中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存与其中,当有数据存入是,Memcached根据收到数据的大小,选择最适合数据大小的slab, 分配一个能存小这个数据最小的内存块chunk。slab allocator解决了当初内存碎片问题,但新的机制也带来了新的问题,由于分配的是特定长度的内存,因此无法有效利用分配的内存(缺陷:容易浪费内存)
避免浪费内存的方法是,预先计算出应用存入数据的大小, 或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据相对均匀,可以减少内存的浪费。
memcached在启动指定Growth Fcator因子(通过f选项)-f ,就可以在某种程度上控制slab 之间的差异,默认值是1.25<factor>,原来默认值是2
以verbose模式启动memcached
##memcached -f 2 vv
下面是是启动的输出:
可见,从128字节的组开始,组的大小依次增大为原来的2倍,这样设置的问题是slab之间的差别比较大,有些情况下就相对浪费内存,因此,尽量减少内存浪费
当默认值(f=1.25)时的输出
(一个chunk只能存一个对象)
术语#Chunk:用于缓存数据的内存空间或内存块。
#Slab Class:特定大小的多个chunk的集合或组。Memcached对象删除原理与cache机制
Memcached 主要的cache机制是LRU机制(最近最少用)算法,加上item过期失效,当你存储数据到Memcache中,可以指定该数据在缓存中呆多久,如果Memcache的内存不够用了,过期的slabs会被替换
,接着就轮到最老的未被使用slabs。在某些情况下(完整缓存),如果不想使用LRU算法,那么可以通过使用-M 参数启动Memcache,这样Memcache在内存耗尽时,会返回一个错误信息。-M return error on memory exhausted (rether than removing items)
Memcached常见的参数:
-m指定分配的内存 ,根据需求,可以自己计算。百度好像不超过4G
-p指定tcp端口号 ,默认11211
-d 后台运行
-u指定Memcached运行的用户
-c 指定并发连接数,默认是1024,按照服务器访问量设定
-l 指定监听服务器的ip地址
-vv 以veryvrebose模式启动,调试信息和控制信息输出到后台
-f 调优因子
Memcached服务端安装
网友资料: 附件(Memchache)
软件地址:
Memcached下载地址:http://www.danga.com/memcached/libevent下载地址:安装环境: uname -rm
2.6.32-431.el6.x86_64 x86_64wget安装Memcached前需要先安装libeven事件通知机制。
http://www.monkey.org/~provos/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 installcd ../(也可以yum直接安装)
安装Memcachedwget http://www.memcached.org/files/memcached-1.4.21.tar.gz
tar zxf memcached-1.4.13.tar.gz
cd memcached-1.4.13 ./configure make make install cd ../注意: Memcache 是客户端。
Memcached的启动:memcached -m 10m -u root -p 11213 -d -c 100
当然你也可以更改端口启动多个memcached :memcached -m 10m -u root -p 11211 -d -c 100
查看命令:lsof -i:11211
如遇到报错:
memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
报错解决:find 查找 libevent-1.4.so.2后路径添加到/etc/ld.so.conf
echo "/usr/local/lib" >>/etc/ld.so.conf
ldconfigMemcache中添加数据:
键值对 key1-》values1
a 通过nc 写入 (如果没有nc,yum安装)
范例:printf "set key008 0 0 3\r\nnnn\r\n" |nc 127.0.0.1 11211
注意:printf “<command name><key><flag><exptime><bytes>\r\n”
command name 可以是set(存储此数据),add(存储此数据,只在服务器*未保留此键值数据时)
b 取数据:printf "get key008\r\n" |nc 127.0.0.1 11211
VALUE key008 0 3
nnn ENDc 删除数据: printf "delete key008\r\n" |nc 127.0.0.1 11211
DELETEDMemcache客户端的安装
wget
tar zxf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/ 是否生产文件memcache.so
vi /application/php/lib/php.ini
819 ; extension_dir = "./"
extension_dir ="/application/php5.3.27/lib/php/extensions/no-debug-zts-20090626/"
#注意此处不要有空格#
且添加: extension = memcache.so
/application/apache/bin/apachectl -k restart
在网站目录下创建index.php的测试页面,
浏览器访问后出现
表示成功。
编写php测试脚本
vi mem.php
<?php
$memcache = new Memcache; $memcache->connect('10.10.69.11', 11211) or die ("Could not connect"); $memcache->set('001', 'konglingchao'); $get_value = $memcache->get('001'); echo $get_value;?>通过php程序访问
/application/php/bin/php mem.php konglingchao
通过文本界面访问:
Memcache 如何实现session共享存储
vi /application/php/lib/php.ini
修改1461 session.save_handler = files
为:session.save_handler = memcache
#session默认是以文件形式存储的
修改 1469 ; session.save_path = "N;/path"
为:session.save_path = "tcp://10.10.69.11:11211"
#注意tcp://连接服务地址地址
查看:
egrep -n "memcache$|11211" /application/php/lib/php.ini
1461:session.save_handler = memcache1469: session.save_path = "tcp://10.10.69.11:11211"搞定!!!!
优点:memcached 是内存缓存,在读写速度上会比普通files时快很多;
可以解决多个服务器公用seesion的难题;
缺点:session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是难题。
也可以用其它的持久化存储系统sessons,例如:redis,ttserver
高性能并发场景,cookies的效率比session好很多。
集群架构服务器同步session的多种方式:
lvs 负载均衡ipvsadm命令用-p指定汇话保持时间
lvs 负载均衡keepalived 服务就是用persistent_timeout 300实现汇话保持
nginx 方向代理负载均衡 ,通过nginx_hash调度算法实现。
haproxy反向代理负载均衡 url_hash 、cookie insert
php,java 程序架构都可以实现上述的汇话保持软件层session 复制: java应用服务器tomcat ,resin 这类软件用couchbase、memcached做复制php环境用memcached或者其他nosql工具 做session 汇话共享 高并发场景,例如门户网站用cookies 或cookies 配和session 把用户级汇话信息缓存在用户本地。
监控Memcached服务的状态信息获取
通过使用stats 命令查看状态:
printf "stats \r\n"|nc 127.0.0.1 11211
范例:
printf "stats \r\n"|nc 127.0.0.1 11211 | grep get
STAT cmd_get 9 STAT get_hits 6 #命中STAT get_misses 3 #未命中printf "get key\r\n"|nc 127.0.0.1 11211
ENDprintf "stats \r\n"|nc 127.0.0.1 11211 | grep get STAT cmd_get 10STAT get_hits 6STAT get_misses 4#如果未命中过多,会对数据库造成一定的压力。
监控Memcached的管理工具:memadmin-1.0.12.tar.gz
memadmin-1.0.12.tar.gz :php写的监控工具,虽然短小,但是很精悍!
把memadmin-1.0.12.tar.gz解压到:/var/html/www/memadmin
浏览器直接访问:
网友资料: 附件也有
如图:
或者自己写监控脚本模拟用户监控
范例:curl .check mem.php 根据返回结果监控
#!/bin/sh
b=`printf "stats\r\n"|nc 10.0.0.7 11211|grep cmd_get|awk '{print $NF+0}'`a=`printf "stats\r\n"|nc 10.0.0.7 11211|grep get_hit|awk '{print $NF+0}'`percentage=$(printf "%d%%" $((a*100/b)))echo $percentagememcached 命令:
telnet 127.0.0.1 11211 连接后
stats slabs 查看slabs 相关情况
stats items 查看items相关情况
stats sizes 查看存在item个数和大小
stats reset 清理统计数据。
补充
redis 是什么?作用?和memcaced的区别!
Memcachedb和TTserver持久化存储工具,原理;(兼容memcache协议)