您的位置:首页 > 数据库 > Memcache

Memcached:高性能分布式对象缓存系统

2014-04-10 13:26 666 查看
1 Memcached简介
1. Memcached是高性能分布式对象缓存系统,官方主页http://memcached.org/,主页上对它的介绍是:为来自数据库调用、API调用、或者页面渲染的结果的小块任意数据(字符串、对象)的一个内存中的键值存储。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。
这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

2. Memcached的基本工作原理
如下为memcached的工作流程示意图,



首次访问:从RDBMS中取得数据保存在memcached;第二次后:从memcached中取得数据显示页面。类似squid在web网页缓存中的作用。

3. Memcached的特征
memcached作为高速运行的分布式缓存服务器,具有以下的特点。
协议简单
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据。

基于libevent的事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

memcached互不通信的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。分布式的实现取决于客户端。如下为memcached分布式实现示意图,





4. 缓存与数据库的同步
比较保险的做法是:查询的时候(读)从缓存中取,add、updae、delete的时候(写)同时操作缓存与DB。当然你也可以定时同步缓存与DB的数据,不同的业务应该有不同的选择。

2 Memcached安装、启动
2.1 安装前准备
memcached依赖于libevent库,在安装前需保证libevent库已经安装
yum install libevent libevent-devel

2.2 安装
可以从官网下载到最新版本的memcached,直接下载请戳http://www.memcached.org/files/memcached-1.4.17.tar.gz,解压、编译安装:
tar zxvf memcached-1.4.17.tar.gz ; cd memcached-1.4.17
./configure --prefix=/usr/local/memcached
make
make install

2.3 启动
启动前防火墙设置:关闭iptables或者添加以下内容到iptables中:
-A INPUT -m state NEW -m tcp -p tcp --dport 11211 -j ACCEPT
-A INPUT -m state NEW -m udp -p udp --dport 11211 -j ACCEPT

/usr/local/memcached/bin/memcached -u root -p 11211 -m 512m -vv
slab class 1: chunk size 80 perslab 13107
slab class 2: chunk size 104 perslab 10082
slab class 3: chunk size 136 perslab 7710
slab class 4: chunk size 176 perslab 5957
slab class 5: chunk size 224 perslab 4681
slab class 6: chunk size 280 perslab 3744
slab class 7: chunk size 352 perslab 2978
slab class 8: chunk size 440 perslab 2383
slab class 9: chunk size 552 perslab 1899
slab class 10: chunk size 696 perslab 1506
slab class 11: chunk size 872 perslab 1202
slab class 12: chunk size 1096 perslab 956
slab class 13: chunk size 1376 perslab 762
slab class 14: chunk size 1720 perslab 609
slab class 15: chunk size 2152 perslab 487
slab class 16: chunk size 2696 perslab 388
slab class 17: chunk size 3376 perslab 310
slab class 18: chunk size 4224 perslab 248
slab class 19: chunk size 5280 perslab 198
slab class 20: chunk size 6600 perslab 158
slab class 21: chunk size 8256 perslab 127
slab class 22: chunk size 10320 perslab 101
slab class 23: chunk size 12904 perslab 81
slab class 24: chunk size 16136 perslab 64
slab class 25: chunk size 20176 perslab 51
slab class 26: chunk size 25224 perslab 41
slab class 27: chunk size 31536 perslab 33
slab class 28: chunk size 39424 perslab 26
slab class 29: chunk size 49280 perslab 21
slab class 30: chunk size 61600 perslab 17
slab class 31: chunk size 77000 perslab 13
slab class 32: chunk size 96256 perslab 10
slab class 33: chunk size 120320 perslab 8
slab class 34: chunk size 150400 perslab 6
slab class 35: chunk size 188000 perslab 5
slab class 36: chunk size 235000 perslab 4
slab class 37: chunk size 293752 perslab 3
slab class 38: chunk size 367192 perslab 2
slab class 39: chunk size 458992 perslab 2
slab class 40: chunk size 573744 perslab 1
slab class 41: chunk size 717184 perslab 1
slab class 42: chunk size 1048576 perslab 1
<26 server listening (auto-negotiate)
<27 server listening (auto-negotiate)
<28 send buffer was 112640, now 268435456
<29 send buffer was 112640, now 268435456
<28 server listening (udp)
<28 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)

memcached常用参数说明:
-d:启动一个守护进程.
-m:分配给Memcache使用的内存数量,单位是MB
-u:运行Memcache的用户
-l:监听的服务器IP地址
-p:设置Memcache监听的端口,默认为11211
-c:最大运行的并发连接数,默认是1024,可按照服务器的负载量来设定.
-P:设置保存Memcache的pid文件
-vv:详细的输出信息显示

2.4 制作memcached启动脚本
cat memcached.sh:
#!/bin/bash
# Description: start|stop|restart the Memcached services.
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
. /etc/rc.d/init.d/functions

memcached="/usr/local/bin/memcached"
[ -e $memcached ] || exit 1

start()
{
echo "Start memcached:"
daemon $memcached -d -m 521m -u root -l localhost -p 11211 -c 1500 -P /tmp/memcached.pid
}

stop()
{
echo "Stop memcached:"
#kill -9 `ps aux | grep memcached | awk '{print $2}'`
killproc memcached
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 3
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
添加可执行权限:chmod +x memcached.sh
拷贝到/etc/rc.d/init.d/目录下:cp memcached.sh /etc/rc.d/init.d/memcached
将memcached加入系统启动项:

主要功能:
服务器参数监控:STATS、SETTINGS、ITEMS、SLABS、SIZES实时刷新

服务器性能监控:GET、DELETE、INCR、DECR、CAS等常用操作命中率实时监控

支持数据遍历,方便对存储内容进行监视

支持条件查询,筛选出满足条件的KEY或VALUE

数组、JSON等序列化字符反序列显示

兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外)

支持服务器连接池,多服务器管理切换方便简洁

具体配置安装和使用不再赘述,可自行查看相关文档,lol

5 总结
本文就Memcached原理、安装、分布式安装和监控等一一较为详细的介绍,关于高阶的Memcached内部实现原理,还有待研究和学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息