idv2.com memcached全面剖析长野雅广、前坂徹著charlee 译版本 1.01
idv2.com 目 录译者序..................................................................................................................................................4第 1章 memcached的基础.................................................................................................................51.1 memcached是什么?...............................................................................................................51.2 memcached的特征...................................................................................................................6
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
简单.....................................................................................................................................6基于 libevent的事件处理..........................................................................................................6内置内存存储方式.....................................................................................................................6memcached不互相通信的分布式.............................................................................................61.3 安装memcached.......................................................................................................................7memcached的安装.....................................................................................................................7memcached的启动.....................................................................................................................81.4 用客户端连接...........................................................................................................................81.5 使用Cache::Memcached..........................................................................................................9使用Cache::Memcached连接memcached................................................................................9保存数据...................................................................................................................................10获取数据...................................................................................................................................10删除数据...................................................................................................................................10增一和减一操作.......................................................................................................................101.6 总结.........................................................................................................................................11第 2章 理解memcached的内存存储..............................................................................................122.1 Slab Allocation机制:整理内存以便重复使用...................................................................12Slab Allocation的主要术语.....................................................................................................132.2 在 Slab中缓存记录的原理....................................................................................................132.3 Slab Allocator的缺点.............................................................................................................132.4 使用Growth Factor进行调优................................................................................................142.5 查看memcached的内部状态................................................................................................152.6 查看 slabs的使用状况...........................................................................................................162.7 总结.........................................................................................................................................17第 3章 memcached的删除机制和发展方向...................................................................................183.1 memcached在数据删除方面有效利用资源.........................................................................18数据不会真正从memcached中消失......................................................................................18Lazy Expiration.........................................................................................................................183.2 LRU:从缓存中有效删除数据的原理.................................................................................183.3 memcached的最新发展方向.................................................................................................18关于二进制协议.......................................................................................................................19二进制协议的格式...................................................................................................................19HEADER中引人注目的地方..................................................................................................202
idv2.com3.4 外部引擎支持........................................................................................................................20外部引擎支持的必要性...........................................................................................................20简单API设计的成功的关键...................................................................................................21重新审视现在的体系...............................................................................................................213.5 总结........................................................................................................................................22第 4章 memcached的分布式算法...................................................................................................234.1 memcached的分布式.............................................................................................................23memcached的分布式是什么意思?.......................................................................................234.2 Cache::Memcached的分布式
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
........................................................................................25根据余数计算分散...................................................................................................................25根据余数计算分散的缺点.......................................................................................................264.3 Consistent Hashing.................................................................................................................27Consistent Hashing的简单说明...............................................................................................27支持Consistent Hashing的函数库..........................................................................................294.4 总结........................................................................................................................................29第 5章 memcached的应用和兼容程序...........................................................................................305.1 mixi案例研究.........................................................................................................................30服务器配置和数量...................................................................................................................30memcached进程.......................................................................................................................31memcached使用方法和客户端...............................................................................................315.2 memcached应用经验.............................................................................................................32通过 daemontools启动.............................................................................................................33监视...........................................................................................................................................33memcached的性能...................................................................................................................335.3 兼容应用程序........................................................................................................................35Tokyo Tyrant案例.....................................................................................................................355.4 总结........................................................................................................................................363
idv2.com 译者序译者序如今,越来越多的Web应用程序开始使用memcached这个高速的缓存服务器软件。然而,memcached的基础知识远远未能像其他Web技术那样普及,memcached在国内的大规模应用也鲜为人知。而日本的mixi(http://mixi.jp)则在这方面走在了前面,不仅大规模使用memcached作为缓存来加速Web应用,而且自行开发了 Tokyo Cabinit、Tokyo Tyrant等一系列相关的软件。最近,日本的技术评论社的网站上刊登了mixi的两名工程师长野雅广、前坂徹撰写的一篇连载《memcached を知り尽くす》。这篇连载语言简洁、通俗易懂,非常适合memcached入门的人阅读。因此我将它翻译成中文,发
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
在我的技术 blog(tech.idv2.com)上。然后将翻译结果合并后稍作加工,形成了这篇 PDF文档,以方便阅读。本文的原文地址如下,懂日语的朋友可以直接去参考原文:
● http://gihyo.jp/dev/feature/01/memcached/
翻译后的文章地址如下:
● 第 1章:http://tech.idv2.com/2008/07/10/memcached001/
● 第 2章:http://tech.idv2.com/2008/07/11/memcached002/
● 第 3章:http://tech.idv2.com/2008/07/16/memcached003/
● 第 4章:http://tech.idv2.com/2008/07/24/memcached004/
● 第 5章:http://tech.idv2.com/2008/07/31/memcached005/本 PDF可以在这个地址下载:
● http://tech.idv2.com/2008/08/17/memcachedpdf/ charlee2008年 8月 17日4
idv2.com 第 1章 memcached的基础第 1章 memcached的基础
我是mixi 株式会社 开发部系统运营组的长野。日常负责程序的运营。从今天开始,将针对最近在Web应用的可扩展性领域的热门话
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
memcached,与我公司开发部研究开发组的前坂一起,说明其内部结构和使用。1.1 memcached是什么?memcached 是以 LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在
已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大
影响。这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
图 1.1:一般情况下memcached的用途5
idv2.com 第 1章 memcached的基础1.2 memcached的特征memcached作为高速运行的分布式缓存服务器,具有以下的特点。
• 协议简单
• 基于 libevent的事件处理
• 内置内存存储方式
• memcached不互相通信的分布式协议简单memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过 telnet也能在memcached上保存数据、取得数据。下面是例子。
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)协议文档位于memcached的源代码内,也可以参考以下的URL。
• http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt 基于 libevent的事件处理libevent是个程序库,它将 Linux的 epoll、BSD类操作系统的 kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个 libevent库,因此能在 Linux、BSD、Solaris等操作系统上发挥其高性能。关于事件处理这里就不再详细介绍,可以
参考Dan Kegel的 The C10K Problem。
• l ibevent : http://www.monkey.org/~provos/libevent/
• The C10K Problem : http://www.kegel.com/c10k.html内置内存存储方式为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指
定值之后,就基于 LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。关于内存存储的详细信息,请参考本文的第 2 章 以后前坂介绍的内容。memcached不互相通信的分布式memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。本文也将介绍memcached的分布式。 6
idv2.com 第 1章 memcached的基础
图 1.2:memcached的分布式接下来简单介绍一下memcached的使用方法。1.3 安装 memcachedmemcached的安装比较简单,这里稍加说明。memcached支持许多平台。
• Linux
• FreeBSD
• Solaris (memcached 1.2.5以上版本)
• Mac OS X
另外也能安装在Windows上。这里使用 Fedora Core 8进行说明。memcached的安装
运行memcached需要本文开头介绍的 libevent库。Fedora 8中有现成的 rpm包,通过 yum命令安装
即可。
$ sudo yum install libevent libeventdevelmemcached的源代码可以从memcached网站上下载。本文执笔时的最新版本为 1.2.5。Fedora 8虽然也包含了memcached的 rpm,但版本比较老。因为源代码安装并不困难,这里就不使用 rpm了。
• 下载 memcached:http://www.danga.com/memcached/download.bmlmemcached安装与一般应用程序相同,configure、make、make install就行了。
$ wget http://www.danga.com/memcached/dist/memcached1.2.5.tar.gz
$ tar zxf memcached1.2.5.tar.gz
$ cd memcached1.2.5
$ ./configure
$ make 7
idv2.com 第 1章 memcached的基础
$ sudo make install
默认情况下memcached安装到/usr/local/bin下。memcached的启动从终端输入以下命令,启动memcached。
$ /usr/local/bin/memcached p 11211 m 64m vv
slab class 1: chunk size 88 perslab 11915
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
中间省略
slab class 38: chunk size 391224 perslab 2
slab class 39: chunk size 489032 perslab 2
<23 server listening
<24 send buffer was 110592, now 268435456
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)这里显示了调试信息。这样就在前台启动了memcached,监听 TCP端口 11211最大内存使用量为64M。调试信息的内容大部分是关于存储的信息,下一章将具体说明。作为 daemon后台启动时,只需
$ /usr/local/bin/memcached p 11211 m 64m d这里使用的memcached启动选项的内容如下。
选项 说明p 使用的 TCP端口。默认为 11211m 最大内存大小。默认为 64Mvv 用 very vrebose模式启动,调试信息和错误输出到控制台d 作为 daemon在后台启动上面四个是常用的启动选项,其他还有很多,通过
$ /usr/local/bin/memcached h
命令可以显示。许多选项可以改变memcached的各种行为,推荐读一读。1.4 用客户端连接
许多语言都实现了连接memcached的客户端,其中以 Perl、PHP为主。仅仅memcached网站上列出的语言就有
• Perl
• PHP
• Python
• Ruby
• C# 8
idv2.com 第 1章 memcached的基础
• C/C++
• Lua等等。
• memcached 客户端 API:http://www.danga.com/memcached/apis.bml这里介绍通过mixi正在使用的 Perl库链接memcached的方法。1.5 使用 Cache::MemcachedPerl的memcached客户端有
• Cache::Memcached
• Cache::Memcached::Fast
• Cache::Memcached::libmemcached等几个CPAN模块。这里介绍的Cache::Memcached是memcached的作者Brad Fitzpatric的作品,应
该算是memcached的客户端中应用最为广泛的模块了。
• Cache::Memcached search.cpan.org: http://search.cpan.org/dist/CacheMemcached/使用 Cache::Memcached连接 memcached
下面的源代码为通过Cache::Memcached连接刚才启动的memcached的例子。
#!/usr/bin/perl
use strict;
use warnings;
use Cache::Memcached;
my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached>new({
servers => ["127.0.0.1:11211"],
compress_threshold => 10_000
});
$memcached>add($key, $value, $expires);
my $ret = $memcached>get($key);
print "$ret\n";在这里,为Cache::Memcached指定了memcached服务器的 IP地址和一个选项,以生成实例。Cache::Memcached常用的选项如下所示。
选项 说明servers 用数组指定memcached服务器和端口compress_threshold 数据压缩时使用的值namespace 指定添加到键的前缀
另外,Cache::Memcached通过 Storable模块可以将 Perl的复杂数据序列化之后再保存,因此散列、数组、对象等都可以直接保存到memcached中。9
idv2.com 第 1章 memcached的基础保存数据向memcached保存数据的方法有
• add
• replace
• set
它们的使用方法都相同:
my $add = $memcached>add( '键', '值', '期限' );
my $replace = $memcached>replace( '键', '值', '期限' );
my $set = $memcached>set( '键', '值', '期限' );向memcached保存数据时可以指定期限(秒)。不指定期限时,memcached按照 LRU算法保存数据。这三个方法的区别如下:
选项 说明add 仅当存储空间中不存在键相同的数据时才保存replace 仅当存储空间中存在键相同的数据时才保存set 与 add和 replace不同,无论何时都保存获取数据获取数据可以使用 get和 get_multi方法。
my $val = $memcached>get('键');
my $val = $memcached>get_multi('键 1', '键 2', '键 3', '键 4', '键 5');一次取得多条数据时使用 get_multi。get_multi可以非同步地同时取得多个键值,其速度要比循环调用 get快数十倍。删除数据删除数据使用 delete方法,不过它有个独特的功能。
$memcached>delete('键', '阻塞时间(秒)');删除第一个参数指定的键的数据。第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。
此功能可以用于防止缓存数据的不完整。但是要注意,set 函数忽视该阻塞,照常保存数据。增一和减一操作
可以将memcached上特定的键值作为计数器使用。
my $ret = $memcached>incr('键');
$memcached>add('键', 0) unless defined $ret;增一和减一是原子操作,但未设置初始值时,不会自动赋成 0。因此,应当进行错误检查,必要时加入初始化操作。而且,服务器端也不会对超过 232时的行为进行检查。10
idv2.com 第 1章 memcached的基础1.6 总结这次简单介绍了memcached,以及它的安装方法、Perl客户端Cache::Memcached的用法。只要知道,memcached的使用方法十分简单就足够了。
下一章由前坂来说明memcached的内部结构。了解memcached的内部构造,就能知道如何使用memcached才能使Web应用的速度更上一层楼。欢迎继续阅读下一章。11
idv2.com 第 2章 理解memcached的内存存储第 2章 理解 memcached的内存存储
我是mixi 株式会社 研究开发组的前坂徹。上一章的文章介绍了memcached是分布式的高速缓存服务器。本次将介绍memcached的内部构造的实现方式,以及内存的管理方式。另外,memcached的内部构造导致的弱点也将加以说明。2.1 Slab Allocation机制:整理内存以便重复使用最近的memcached默认情况下采用了名为 Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和 free来进行的。但是,这种方式会导致内存
碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还
慢。Slab Allocator就是为解决该问题而诞生的。
下面来看看 Slab Allocator的原理。下面是memcached文档中的 slab allocator的目标:the primary goal of the slabs subsystem in memcached was to eliminate memory fragmentation issues totally by using fixedsize memory chunks coming from a few predetermined size classes.也就是说,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。Slab Allocation的原理相当简单。将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)(图 2.1)。
图 2.1:Slab Allocation的构造图而且,slab allocator还有重复使用已分配的内存的目的。也就是说,分配到的内存不会释放,而是12
idv2.com 第 2章 理解memcached的内存存储重复利用。Slab Allocation的主要术语
Page分配给 Slab的内存空间,默认是 1MB。分配给 Slab之后根据 slab的大小切分成 chunk。
Chunk用于缓存记录的内存空间。
Slab Class特定大小的 chunk的组。2.2 在 Slab中缓存记录的原理
下面说明memcached如何针对客户端发送的数据选择 slab并缓存到 chunk中。memcached根据收到的数据的大小,选择最适合数据大小的 slab(图 2.2)。memcached中保存着slab内空闲 chunk的列表,根据该列表选择 chunk,然后将数据缓存于其中。
图 2.2:选择存储记录的组的方法
实际上,Slab Allocator也是有利也有弊。下面介绍一下它的缺点。2.3 Slab Allocator的缺点Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将 100字节的数据缓存到 128字节的 chunk中,剩余的 28字节就浪费了(图 2.3)。13
idv2.com 第 2章 理解memcached的内存存储
图 2.3:chunk空间的使用
对于该问题目前还没有完美的解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,但在文档中记载了比较有效的解决方案。The most efficient way to reduce the waste is to use a list of size classes that closely matches (if that's at all possible) common sizes of objects that the clients of this particular installation of memcached are likely to store.
就是说,如果预先知道客户端发送的数据的公用大小,或者仅缓存大小相同的数据的情况下,只要使用适合数据大小的组的列表,就可以减少浪费。
但是很遗憾,现在还不能进行任何调优,只能期待以后的版本了。但是,我们可以调节 slab class的大小的差别。接下来说明 growth factor选项。2.4 使用 Growth Factor进行调优memcached在启动时指定Growth Factor因子(通过f选项),就可以在某种程度上控制 slab之间的
差异。默认值为 1.25。但是,在该选项出现之前,这个因子曾经固定为 2,称为“powers of 2”策略。
让我们用以前的设置,以 verbose模式启动memcached试试看:
$ memcached f 2 vv
下面是启动后的 verbose输出:
slab class 1: chunk size 128 perslab 8192
slab class 2: chunk size 256 perslab 4096
slab class 3: chunk size 512 perslab 2048
slab class 4: chunk size 1024 perslab 1024
slab class 5: chunk size 2048 perslab 512
slab class 6: chunk size 4096 perslab 256
slab class 7: chunk size 8192 perslab 128
slab class 8: chunk size 16384 perslab 64
slab class 9: chunk size 32768 perslab 32
slab class 10: chunk size 65536 perslab 16
slab class 11: chunk size 131072 perslab 8
slab class 12: chunk size 262144 perslab 4
slab class 13: chunk size 524288 perslab 2
可见,从 128字节的组开始,组的大小依次增大为原来的 2倍。 这样设置的问题是,slab之间的差
别比较大,有些情况下就相当浪费内存。 因此,为尽量减少内存浪费,两年前追加了 growth factor这个选项。来看看现在的默认设置(f=1.25)时的输出(篇幅所限,这里只写到第 10组):
slab class 1: chunk size 88 perslab 1191514
idv2.com 第 2章 理解memcached的内存存储
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
slab class 4: chunk size 184 perslab 5698
slab class 5: chunk size 232 perslab 4519
slab class 6: chunk size 296 perslab 3542
slab class 7: chunk size 376 perslab 2788
slab class 8: chunk size 472 perslab 2221
slab class 9: chunk size 592 perslab 1771
slab class 10: chunk size 744 perslab 1409
可见,组间差距比因子为 2时小得多,更适合缓存几百字节的记录。从上面的输出结果来看,可能会觉得有些计算误差,这些误差是为了保持字节数的对齐而故意设置的。
将memcached引入产品,或是直接使用默认值进行部署时,最好是重新计算一下数据的预期平均长
度,调整 growth factor,以获得最恰当的设置。内存是珍贵的资源,浪费就太可惜了。接下来介绍一下如何使用memcached的 stats命令查看 slabs的利用率等各种各样的信息。2.5 查看 memcached的内部状态memcached有个名为 stats的命令,使用它可以获得各种各样的信息。执行命令的方法很多,用telnet最为简单:
$ telnet 主机名 端口号连接到memcached之后,输入 stats再按回车,即可获得包括资源利用率在内的各种信息。此外,
输入"stats slabs"或"stats items"还可以获得关于缓存记录的信息。结束程序请输入 quit。这些命令的详细信息可以参考memcached软件包内的 protocol.txt文档。
$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 481
STAT uptime 16574
STAT time 1213687612
STAT version 1.2.5
STAT pointer_size 32
STAT rusage_user 0.102297
STAT rusage_system 0.214317
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 6
STAT total_connections 8
STAT connection_structures 7
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 20
STAT bytes_written 465
STAT limit_maxbytes 67108864
STAT threads 4
END 15
idv2.com 第 2章 理解memcached的内存存储
quit
另外,如果安装了 libmemcached这个面向C/C++语言的客户端库,就会安装memstat这个命令。使用方法很简单,可以用更少的步骤获得与 telnet相同的信息,还能一次性从多台服务器获得信息。
$ memstat servers=server1,server2,server3,...libmemcached可以从下面的地址获得:
• http://tangent.org/552/libmemcached.html 2.6 查看 slabs的使用状况使用memcached的创造着Brad写的名为memcachedtool的 Perl脚本,可以方便地获得 slab的使用
情况(它将memcached的返回值整理成容易阅读的格式)。可以从下面的地址获得脚本:
• http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcachedtool 使用方法也极其简单:
$ memcachedtool 主机名:端口 选项查看 slabs使用状况时无需指定选项,因此用下面的命令即可:
$ memcachedtool 主机名:端口获得的信息如下所示:
# Item_Size Max_age 1MB_pages Count Full?
1 104 B 1394292 s 1215 12249628 yes
2 136 B 1456795 s 52 400919 yes
3 176 B