<b>memcached原理和实践</b>[Linux安全]
本文“<b>memcached原理和实践</b>[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1.memcached简介
memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开辟的一款软件.目前已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web利用扩大性的重要因素.很多Web利用都将数据保存到RDBMS中,利用服务器从中读取数据并在浏览器中显示.但随着数据量的增大、拜候的集合,就会呈现RDBMS的负担加重、数据库呼应恶化、网站显示耽误等庞大影响.这时就该memcached大显神通了.memcached是高性能的分布式内存缓存服务器.普通的利用目的是,通过缓存数据库查询后果,削减数据库拜候次数,以提高动态Web利用的速度、提高可扩大性.
2.memcached的特点
memcached作为高速运行的分布式缓存服务器,具有以下的特点:
1)协议简单:memcached的服务器客户端通信并不利用复杂的XML等格局,而利用简单的基于文本行的协议.因此,通过telnet也能在memcached上保存数据、获得数据.
2)基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功效封装成统一的接口.即便对服务器的衔接数增添,也能施展O(1)的性能.memcached利用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上施展其高性能.
3)内置内存存储方法:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中.由于数据仅存在于内存中,因此重启memcached、重启操作系统会招致全部数据消逝.别的,内容容量到达指定值之后,就基于LRU(Least Recently Used)算法自动删除不利用的缓存.memcached本身是为缓存而计划的服务器,因此并没有过量考虑数据的永久性问题.
4)memcached不彼此通信的分布式:memcached固然是“分布式”缓存服务器,但服务器端并没有分布式功效.各个memcached不会彼此通信以同享信息.那么,分布式是完好取决于客户端的实现.
——————————————————————————————————————————
3.Slab Allocation机制:整理内存以便反复利用
目前memcached采取Slab Allocator的机制分配、管理内存.Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完好办理内存碎片问题.
1)如上图所示,Slab Allocation将分配的内存分割成各种尺寸的块(chunk,用于缓存记录的内存空间),并把尺寸相同的块分成组(chunk的调集,每个chunk的大小相同).默许一个slab(chunks)的大小是1MB,叫1Page.
2)slab allocator有反复利用已分配的内存的目的.也就是说,分配到的内存不会释放,而是反复操纵.
3)memcached按照收到的数据的大小,挑选最合适数据大小的slab. memcached中保存着slab内闲暇chunk的列表,按照该列表挑选chunk, 然后将数据缓存于此中.如当来了100bytes数据,会挑选最符合的112bytes的chunk(假定slab classes中chunk的大小包含有88bytes、112bytes、144bytes……)
4)Slab Allocator办理了当初的内存碎片问题,但由于分配的是特定长度的内存,因此无法有效操纵分配的内存.比方,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了.
——————————————————————————————————————————
4.memcached的删除机制
1)memcached是缓存,所以数据不会永久保存在服务器上,其实数据不会真正从memcached中消逝.实际上memcached不会释放已分配的内存,记录超时后,客户端就无法再瞥见该记录,其存储空间便可反复利用.
2)Lazy Expiration:memcached内部不会监督记录能否过期,而是在get时查看记录的时间戳,查抄记录能否过期.这种技术被称为lazy(惰性)expiration.因此,memcached不会在过期监督上耗费CPU时间.
3)memcached会优先利用已超时的记录的空间,但即便如此,也会发生追加新记录时空间不足的情形,此时就要利用名为 Least Recently Used(LRU)机制来分配空间. 顾名思义,这是删除“近来最少利用”的记录的机制.因此,当memcached的内存空间不足时(无法从slab class 获得到新的空间时),就从近来未被利用的记录中搜索,并将其空间分配给新的记录.
——————————————————————————————————————————
5.memcached的分布式
1)memcached但服务器端并没有“分布式”功效.分布式是完好由客户端程序库实现的.这种分布式是memcached的最大特点.
2)set(存数据到memcached)时,set(‘key’,data),将’key’传给客户端程序库后,客户端实现的算法就会按照“键”来决意保存数据的memcached服务器.服务器选定后,即号令它保存(’key’,data);
3)get(从memcached取数据)时,get(‘key’),此时客户端把’key’传送给函数库,函数库通过与数据保存时相同的算法,按照“键”挑选服务器.利用的算法相同,就可以选中与保存时相同的服务器,然后发送get号令.只要数据没有因为某些缘由被删除,就可以得到保存的值.
4)以上将差别的键保存到差别的服务器上,就实现了memcached的分布式. memcached服务器增添后,键就会分离,即便一台memcached服务器发生弊端无法衔接,也不会影响其他的缓存,系统仍然能持续运行.
5)Cache::Memcached的分布式算法简单来说,就是“按照服务器台数的余数举行分离”. 求得键的整数哈希值[利用crc32函数,如crc32($key)],再除以服务器台数,按照别的数来挑选服务器.余数计算的办法简单,数据的分离性也相当优异,但也有其缺陷.那就是当增添或移除服务器时,缓存重组的代价相当宏大.
参考文档:http://tech.idv2.com/2008/07/10/memcached-001/
实践篇
1.memcached的安装
1)memcached是基于libevent的事件处理,所以安装memcached时先要安装libevent库.
yum -y install libevent libevent-devel
2)memcached编译安装对比简单,普通都采取编译安装的方法以下:
wget http://memcached.谷歌code.com/files/memcached-1.4.5.tar.gz
tar -zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure
make && make install
——————————————————————————————————————————
2.memcached启动
1)memcached常用参数:(/usr/local/bin/memcached -h)
-p <num> TCP port number to listen on (default: 11211)
-U <num> UDP port number to listen on (default: 11211, 0 is off)
-l <ip_addr> interface to listen on (default: INADDR_ANY, all addresses)
-d run as a daemon
-u <username> assume identity of <username> (only when run as root)
-m <num> max memory to use for items in megabytes (default: 64 MB)
-c <num> max simultaneous connections (default: 1024)
-P <file> save PID in <file>, only used with -d option
-f <factor> chunk size growth factor (default: 1.25)
2)以daemon的方法启动memcached
/usr/local/bin/memcached -u nobody -p 11211 -m 64 -c 128 -d
——————————————————————————————————————————
3.memcached结合mysql、perl的实践
cat memcached_mysql.pl
#!/usr/bin/perl
#Usage: test memcahed with mysql and perl
#Made by yunhaozou@gmail.com,2010/12/20
#
use Cache::Memcached;
use DBI;
use Data::Dumper;
use Digest::MD5 qw(md5_hex);
use strict;
#
my $host = “127.0.0.1″; #db相关信息
my $port = “3306″;
my $db = “zichan_db”;
my $user = “root”;
my $password = “”;
my $dsn = “dbi:mysql:database=$db:hostname=$host:port=$port”;
my $dbh = DBI->connect($dsn,$user,$password) or die “Couldn’t connect to database: ” . DBI->errstr; #衔接db
my $memcached = Cache::Memcached->new({ servers=>["127.0.0.1:11211"],compress_threshold=>10_000}); #衔接memcached
#$memcached = Cache::Memcached->new({ servers=>["127.0.0.1:11211","192.168.2.1:11211"],compress_threshold=>10_000}); #表示衔接两台机的memcached,这样可以实现负载均衡,一个机械挂了,另一个可以持续用
my $zcsql = “select sn,model,cab_no,func,intra_ip,man_addr,contact from equipment where sn=’0917QAR012′;”;
#
my $result = query_result($zcsql);
print Dumper $result;
$dbh->disconnect();
#
sub query_result{
my $query_sql = shift;
my $query_key = md5_hex($query_sql); #把查询sql语句转换为MD5值的key
my $query_result = $memcached->get($query_key);
return $query_result if $query_result; #当在memcaed有缓存时直接返回
$query_result = $dbh->selectrow_hashref($query_sql);
$memcached->set(“$query_key”, $query_result); #当在memcached没有缓存时从数据查询,并缓存memcached
return $query_result;
}
——————————————————————————————————————————
4.平常运维
1)memcached是典型的是耗内存不耗CPU.而普通web进程(如Apache)是CPU敏感,内存不那么敏感的.因此可将memcached直接跑在前台web主机上,作为数据缓存(或数据库衔接池)利用,也就是在web程序与数据库之间多加了一层.
2)尽大概利用memcached分布式布置.但各个模块尽大概做到memcached资源断绝(之前因为社区前端公用memcached,有一次广东综合通信上线了一个页面,因工程师写代码时失误,显式调用了flush memcache,从而每次拜候都清空整个memcached,把整个网站社区前端memcached资源清空,并且过几秒又被清空,这样造成的后果有多严重就不说了,写那代码的哥们有多惨也不说了~~)
3)用telnet测试memcached
telnet 127.0.0.1 11211
Trying 127.0.0.1…
Connected to zou.yunhao (127.0.0.1).
Escape character is ‘^]’.
set key 0 10 6 //10表示过期时间10秒,6表示将要存入数据字节为6(这里result为6)
result
STORED
get key
VALUE key 0 6
result
END
4)memcached性能查看号令stats
telnet 127.0.0.1 11211
stats
STAT pid 18006
STAT uptime 702 //memcached运行的秒数
STAT time 1292904537 //memcached服务器所在主机当前系统的时间,单位是秒.
STAT version 1.4.5
STAT pointer_size 64 //服务器所在主机操作系统的指针大小,普通为32或64
STAT rusage_user 0.003999
STAT rusage_system 0.013997
STAT curr_connections 10 //表示当前的衔接数
STAT total_connections 11 //表示从memcached服务启动到当前时间,系统翻开过的衔接的总数.
STAT connection_structures 11
STAT cmd_get 0 //查询缓存的次数,平均每秒缓存次数cmd_get/uptime
STAT cmd_set 0 //设置key=>value的次数
STAT cmd_flush 0
STAT get_hits 0 //缓存命中的次数,缓存命中率=get_hits/cmd_get*100%
STAT get_misses 0 //cmd_get-get_hits
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 auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7 //memcached服务器从网络读取的总的字节数
STAT bytes_written 0 //memcached服务器发送到网络的总的字节数.
STAT limit_maxbytes 67108864 //memcached服务缓存答应利用的最大字节数
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END
——————————————————————————————————————————
5.监控
1)nagios监控
a. check_memcached
先要安装check_memcached插件
wget http://search.cpan.org/CPAN/authors/id/Z/ZI/ZIGOROU/Nagios-Plugins-Memcached-0.02.tar.gz
tar xzvf Nagios-Plugins-Memcached-0.02.tar.gz
cd Nagios-Plugins-Memcached-0.02
perl Makefile.PL (大概需求其他perl的modules,按照提醒通过cpan安装便可)
make && make install
check_memcached [-H host:port] [-w warnings] [-c critical] [--size-warnng size-warnng] [--size-critical size-critical] [--hit-warning hit-warning] [--hit-critical
hit-critical] [-t timeout]
b. /check_tcp -H host -p 11211 -t 5 -E -s ‘stats\r\nquit\r\n’ -e ‘uptime’ -M crit
2)cacti监控
一台服务器起多个memcached,多端口cacti布置监控.
a. 需求一个 Python memcached Client API
wget ftp://ftp.tummy.com/pub/python-memcached/python-memcached-1.45.tar.gz
tar xzvf python-memcached-1.45.tar.gz
cd python-memcached-1.45
python setup.py install
b. 加模板memcached multiport
wget http://tag1consulting.com/blog/cacti-memcache-multi-port-templates
cp memcached.py <cacti install目录>/scripts/memcachedmultiport.py
c. 增添监控时devices->des && ip->host template挑选memcachedmultiport->Downed Device Detection挑选none->SNMP Version挑选not in use->create graphs->Port to query for memcached statistics填写memcached端口.
3)也可以自定义nagios、cacti监控,通过memcached号令stats取相关数据
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cnbird2008/archive/2011/01/24/6161887.aspx
以上是“<b>memcached原理和实践</b>[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |