官方网站:https://memcached.org/downloads
可视化管理工具:https://mirrors.linyaohong.com/src/memcached/memadmin-1.0.12.tar.gz
http://www.junopen.com/memadmin/
Memcached是什么?
Memcached是一款开源的、高性能的纯内存缓存服务软件、Mem就是内存的意思,cache缓存的意思,d是daemon的意思。
Memcache整个项目的名字,Memcache服务分为客户端和服务端两部分
Memcached 服务端
Memcache 客户端
使用Memcached好处:
当用户请求memcached没有的数据时,再请求数据库可以降低数据库压力
Memcached服务特点及原理:
Memcache删除机制:1、C/S模式架构,C语言2000多行
2、异步1/0,使用libevent作为事件通知机制
3、被缓存的数据以key/value键值形式存在的
4、全部数据存放于内存中,无持久性存储的设计,重启数据丢失
5、当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据
6、可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,而是在访问的时候查看key的时间戳判断是否过期
7、memcache会对设定的内存进行分块,再把块分组,然后再提供
1、不主动检测item对象是否过期,而是在get时才会检查item对象是否过期以及是否应该删除
2、当删除item对象时,一般不释放内存空间,二十做标记删除,将指针放入slot回收插槽,下次分配的时候直接使用
3、当内存空间满的时候,才会根据LRU算法把最近最少使用的item对象删除
4、数据存入可以设定过期时间,但是数据过期后不会被立即删除,而是在get时才会检查item对象是否过期以及是否应该删除
5、如果不希望系统使用LRU算法清除数据,可以用使用-M参数
Memcached服务分布式集群如何实现?
特殊说明: memcached集群和web服务集群是不一样的,所有memcached的数据总和才是数据库的数据,每台memcached都是部分数据
1、程序端实现:程序加载所有memcached的ip列表,通过对key做hash(一致性哈希)
2、负载均衡器:通过对key做hash(一致性哈希)
Memcached在特殊的大并发高访问量的场合的优化。
1、提高 Memcached访问命中率是优化最关键的指标
例如:每次新增数据到数据库的同时就将数据写入或者复制到 Memcached里一份,然后从业务逻辑上让程序优先读缓存,没有数据再查数据库。
2、提高内存利用率,减少内存浪费
减少chunk内存空间浪费,调优方法为,根据业务数据的大小,利用-n参数设定 chunk 的初始值,及通过-f参数factor增长因子设置chunk的大小尽可能接近业务数据的大小
减少slab的浪费,设定slab的大小为 chunk整数倍
采用一致性哈希分布式缓存集群架构
当网站后端的数据库数据量很大时,单台 Memcached就无法存放绝大部分的数据库内数据,导致Memcached服务命中很低,此时,可以采用一致性哈希分布式缓存集群架构,提升网站的命中率,一致性哈希可以由程序实现或者支持一致性哈希算法的负载均衡器实现。
#安装依赖
yum install libevent libevent-devel nc telnet -y
#安装memcached
yum -y install memcached
#启动
memcached -m 64m -p 11211 -d -u root -c 8192
memcached -m 64m -p 11212 -d -u root -c 8192
#启动时指定监听IP和pid文件
memcached -m 64m -p 11213 -d -l 10.10.10.20 -u root -c 8192 -P /var/run/11213.pid
#启动时显示日志
-v -vv -vvv 三个等级
memcached -m 64m -p 11213 -d -l 10.10.10.21 -u root -c 8192 -P /var/run/11213.pid -vv >> /tmp/memcached.log 2>&1
#关闭memcached
kill -9 `cat /var/run/11214.pid `
一定要 把启动命令 加入rc.local 开机自启动
多实例不同方式启动效果
[root@zabbix memcached-1.5.16]# netstat -lntup|grep mem
tcp 0 0 0.0.0.0:11212 0.0.0.0:* LISTEN 5946/memcached
tcp 0 0 0.0.0.0:11213 0.0.0.0:* LISTEN 5966/memcached
tcp 0 0 0.0.0.0:11214 0.0.0.0:* LISTEN 6007/memcached
tcp 0 0 172.31.66.141:11215 0.0.0.0:* LISTEN 6252/memcached
tcp6 0 0 :::11212 :::* LISTEN 5946/memcached
tcp6 0 0 :::11213 :::* LISTEN 5966/memcached
tcp6 0 0 :::11214 :::* LISTEN 6007/memcached
编译安装:
wget https://memcached.org/files/memcached-1.5.16.tar.gz
tar zxf memcached-1.5.16.tar.gz
cd memcached-1.5.16
./configure
make && make install
启动参数详解:
-P(大写) 监听的IP,默认为0.0.0.0
-p(小写) 监听的端口
-l 连接的IP地址, 默认是本机
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f #块大小增长因子,默认是1.25 -f <factor> chunk size growth factor (default: 1.25)
-n 最小分配空间,key+value+flags默认是48
memcached基本操作
set |
设置一个key
|
get | 获取一个key |
delete | 删除一个key |
replace | 更新一个key |
[root@zabbix memcached-1.5.16]# telnet 127.0.0.1 11212 #用telnet连接
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set user03 0 0 10 #设置一个key flag:0 过期时间:0 长度10
linyaohong
STORED
get user03 #获取一个kye
VALUE user03 0 10
linyaohong
END
delete user03 #删除一个key
DELETED
quit #退出
Connection closed by foreign host.
#stas
查看状态
printf操作memecached(可以用来监控memcached)
[root@zabbix memcached-1.5.16]# printf "set key1 0 0 7\r\nyaohong\r\n"|nc 127.0.0.1 11212 #新建一个key
STORED
[root@zabbix memcached-1.5.16]# printf "get key1\r\n"|nc 127.0.0.1 11212 #查看key
VALUE key1 0 7
yaohong
END
[root@zabbix memcached-1.5.16]# printf "replace key1 0 0 7\r\nAAAAAAA\r\n"|nc 127.0.0.1 11212 #修改key
STORED
[root@zabbix memcached-1.5.16]# printf "get key1\r\n"|nc 127.0.0.1 11212 #再次查看key
VALUE key1 0 7
AAAAAAA
END
[root@zabbix memcached-1.5.16]# printf "delete key1\r\n"|nc 127.0.0.1 11212 #删除key
DELETED
#查看memcached状态
printf "stats settings\r\n"|nc 127.0.0.1 11212
printf "stats slabs\r\n"|nc 127.0.0.1 11212
printf "stats sizes\r\n"|nc 127.0.0.1 11212
printf "stats\r\n"|nc 127.0.0.1 11211
cmd_get
get命令(获取)总请求次数
cmd_set
set命令(保存)总请求次数
get_hits
总命中次数
get_misses
总未命中次数
evictions
为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read
总读取字节数(请求字节数)
bytes_written
总发送字节数(结果字节数)
limit_maxbytes
分配给memcache的内存大小(字节)
threads
当前线程数
#缓存命中率 = get_hits/cmd_get * 100%
stats 统计 Memcached的各种信息stats settings 查看一些 memcached的设置信息,例如:线程数
stats slabs 查看 slabs相关情况,例如: chunksize长度。
stats items 查看 Items相关情况。
stats sizes 查看Item个数和大小
stats reset 清理统计数据
检查memcached监控脚本
#!/bin/bash
export MemcachedIp=$1
export MemcachedPort=$2
export NcCmd="nc $MemcachedIp $MemcachedPort"
export MD5=3fe396c01f03425cb52e2da8186eb090d
USAGE(){
echo "$0 MemcachedIP MemcachedPort"
exit 3
}
[ $# -ne 2 ] && USAGE
printf "set $MD5 0 0 7\r\nyaohong\r\n"|$NcCmd >/dev/null 2>&1
if [ $? -eq 0 ];then
if [ `printf "get $MD5\r\n"|$NcCmd|grep yaohong|wc -l` -eq 1 ];then
echo "Memcached status is ok"
printf "delete $MD5\r\n"|$NcCmd >/dev/null 2>&1
exit 0
else
echo "Memcached status is error"
exit 2
fi
else
echo "Coult no connect Mc server"
exit 2
fi
[root@web02 ~]# ./mc.sh 127.0.0.1 11213
Memcached status is ok
[root@web02 ~]# ./mc.sh 127.0.0.1 11211
Coult no connect Mc server
php文件测试memecached
<?php
$memcache = newMemcache;
$memcache->connect('127.0.0.1',11211) or die ("Could not connect MC server");
$memcache->set('key','lin yaohong');
//$memcache->replace('key','Lin Yao Hong');
//$memcache->delete('key');
$get = $memcache->get('key');
echo $get;
?>
PHP安装memcache扩展
memcache下载:https://pecl.php.net/package/memcache
tar -zxvf memcache-2.2.7.tgz
cd memcache-2.2.7
/www/server/php/55/bin/phpize
./configure --enable-memcache --with-php-config=/www/server/php/55/bin/php-config
make && make install
.................................................................................................................
#出现代表安装成功:Installing shared extensions: /www/server/php/55/lib/php/extensions/no-debug-non-zts-20121212/
[root@web01 etc]# vim php.ini
#加入下面两行
extension_dir = "/www/server/php/55/lib/php/extensions/no-debug-non-zts-20121212/" #可以不用加,php默认会找到此目录,
extension=memcache.so
最后通过phpinfo测试是否安装成功。php配置memcache的 session共享:
修改php.ini
session.save_handler = memecache
session.save_path = "/tcp://127.0.0.1 11211"
Memcached利用 Slab allocation机制来分配和管理内存的。
提前将大内存分配大小为1MB的若干个slab,然后针对每个slab再进行小对象填充 chunk,避免大量重复的初始化和清理,减轻了内存管理器的负担。
Slab allocation内存分配机制原理是按照预先规定的大小,将分配给 Memcached服务的内存预先分割成特定长度的内存块( chunk),再把尺寸相同的内存块( chunk)分成组(chunks slab class),这些内存块不会释放,可以重复利用。
Memcached服务器中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中,当有数据存入时, Memcached根据接收到的数据大小,选择最适合数据大小的slab分配一个能存下这个数据的最小内存块( chunk)。
例如:有100字节的一个数据,就会被分配存入下面112字节的一个内存块中,这样会有12字节被浪费掉,这部分空间不能被使用了,这也是 Slab allocator机制的一个缺点。
slab:动态创建的实际内存区,即分配给Slab的内存空间,默认是1MB。分配给S1ab之后根据slab的大小切分成chunk,slab默认大小为1048576byte(1MB),大于1MB的数据会忽略
chunk:数据区块,固定大小, chunk初始大小,1.4中是48 bytes
slab内存管理机制特点:
2、避免大量重复的初始化和清理,减轻内存管理器负担。
3、避免频繁 malloc/free内存分配导致的碎片。
2、malloc(动态内存分配)产生内存碎片,导致操作系统性能急剧下降。
3、Slab内存分配机制就产生了,可以解决内存碎片的问题。
4、Memcached服务的内存预先分割成特定长度的内存块,称为 Chunk,用于缓存数据的内存空间或内存块,相当于磁盘的 block,只不过磁盘的每一个block都是相等的,而chunk只有同一个slab Class内才是相等的
5、Slab class:特定大小(1M)的包含多个chunk的集合或组,一个 Memcached包含多个 Slab class,每个Slab class包含多个相同大小的chunk
6、Slab机制也有缺点,例如, Chunk的空间会浪费(通过调优因子以及大小接近的数据放入一个MC实例)。
[root@web02 ~]# memcached -f 2 -vvv -u root
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
#--------------------------chunk 更均匀-----------------------------------------------
[root@web02 ~]# memcached -f 1.25 -vvv -u root
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
扩展知识:memcachedb,加入Berkeley DB实现持久化