从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件

memcached入门笔记

发布:蔺要红06-02分类: NOSQL


官方网站: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服务特点及原理:

1、C/S模式架构,C语言2000多行
2、异步1/0,使用libevent作为事件通知机制
3、被缓存的数据以key/value键值形式存在的
4、全部数据存放于内存中,无持久性存储的设计,重启数据丢失
5、当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据
6、可以对存储的数据设置过期时间,这样过期后数据自动被清除,服务本身不会监控过期,而是在访问的时候查看key的时间戳判断是否过期
7、memcache会对设定的内存进行分块,再把块分组,然后再提供

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安装(推荐,当yum安装的版本过低,或者公司有需要的时候选择编译安装):
#安装依赖
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内存管理机制特点:
1、提前分配大内存 slab 1MB,再进行小对象填充 chunk
2、避免大量重复的初始化和清理,减轻内存管理器负担。
3、避免频繁 malloc/free内存分配导致的碎片。

 
MC内存管理机制小结:
1、Mc的早期内存管理机制为malloc(动态内存分配)
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实现持久化



 
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站