首页 memcached全面剖析

memcached全面剖析

举报
开通vip

memcached全面剖析 idv2.com memcached全面剖析 长野雅广、前坂徹著 charlee 译 版本 1.0 1 idv2.com 目 录 译者序..................................................................................................................................................4 第 1章 memcached的基础.............

memcached全面剖析
idv2.com memcached全面剖析 长野雅广、前坂徹著 charlee 译 版本 1.0 1 idv2.com 目 录 译者序..................................................................................................................................................4 第 1章 memcached的基础.................................................................................................................5 1.1  memcached是什么?...............................................................................................................5 1.2  memcached的特征...................................................................................................................6 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 简单.....................................................................................................................................6 基于 libevent的事件处理..........................................................................................................6 内置内存存储方式.....................................................................................................................6 memcached不互相通信的分布式.............................................................................................6 1.3  安装memcached.......................................................................................................................7 memcached的安装.....................................................................................................................7 memcached的启动.....................................................................................................................8 1.4  用客户端连接...........................................................................................................................8 1.5  使用Cache::Memcached..........................................................................................................9 使用Cache::Memcached连接memcached................................................................................9 保存数据...................................................................................................................................10 获取数据...................................................................................................................................10 删除数据...................................................................................................................................10 增一和减一操作.......................................................................................................................10 1.6   总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf .........................................................................................................................................11 第 2章 理解memcached的内存存储..............................................................................................12 2.1  Slab Allocation机制:整理内存以便重复使用...................................................................12 Slab Allocation的主要术语.....................................................................................................13 2.2  在 Slab中缓存记录的原理....................................................................................................13 2.3  Slab Allocator的缺点.............................................................................................................13 2.4  使用Growth Factor进行调优................................................................................................14 2.5  查看memcached的内部状态................................................................................................15 2.6  查看 slabs的使用状况...........................................................................................................16 2.7  总结.........................................................................................................................................17 第 3章 memcached的删除机制和发展方向...................................................................................18 3.1  memcached在数据删除方面有效利用资源.........................................................................18 数据不会真正从memcached中消失......................................................................................18 Lazy Expiration.........................................................................................................................18 3.2  LRU:从缓存中有效删除数据的原理.................................................................................18 3.3  memcached的最新发展方向.................................................................................................18 关于二进制协议.......................................................................................................................19 二进制协议的格式...................................................................................................................19 HEADER中引人注目的地方..................................................................................................20 2 idv2.com 3.4  外部引擎支持........................................................................................................................20 外部引擎支持的必要性...........................................................................................................20 简单API设计的成功的关键...................................................................................................21 重新审视现在的体系...............................................................................................................21 3.5  总结........................................................................................................................................22 第 4章 memcached的分布式算法...................................................................................................23 4.1  memcached的分布式.............................................................................................................23 memcached的分布式是什么意思?.......................................................................................23 4.2  Cache::Memcached的分布式方法........................................................................................25 根据余数计算分散...................................................................................................................25 根据余数计算分散的缺点.......................................................................................................26 4.3  Consistent Hashing.................................................................................................................27 Consistent Hashing的简单说明...............................................................................................27 支持Consistent Hashing的函数库..........................................................................................29 4.4  总结........................................................................................................................................29 第 5章 memcached的应用和兼容程序...........................................................................................30 5.1  mixi案例研究.........................................................................................................................30 服务器配置和数量...................................................................................................................30 memcached进程.......................................................................................................................31 memcached使用方法和客户端...............................................................................................31 5.2  memcached应用经验.............................................................................................................32 通过 daemontools启动.............................................................................................................33 监视...........................................................................................................................................33 memcached的性能...................................................................................................................33 5.3  兼容应用程序........................................................................................................................35 Tokyo Tyrant案例.....................................................................................................................35 5.4  总结........................................................................................................................................36 3 idv2.com 译者序 译者序 如今,越来越多的Web应用程序开始使用memcached这个高速的缓存服务器软件。然而, memcached的基础知识远远未能像其他Web技术那样普及,memcached在国内的大规模应用也鲜为 人知。而日本的mixi(http://mixi.jp)则在这方面走在了前面,不仅大规模使用memcached作为缓 存来加速Web应用,而且自行开发了 Tokyo Cabinit、Tokyo Tyrant等一系列相关的软件。 最近,日本的技术评论社的网站上刊登了mixi的两名工程师长野雅广、前坂徹撰写的一篇连载 《memcached を知り尽くす》。这篇连载语言简洁、通俗易懂,非常适合memcached入门的人阅读。 因此我将它翻译成中文,发表在我的技术 blog(tech.idv2.com)上。然后将翻译结果合并后稍作加 工,形成了这篇 PDF文档,以方便阅读。 本文的原文地址如下,懂日语的朋友可以直接去参考原文: ● http://gihyo.jp/dev/feature/01/memcached/    翻译后的文章地址如下: ● 第 1章:http://tech.idv2.com/2008/07/10/memcached­001/ ● 第 2章:http://tech.idv2.com/2008/07/11/memcached­002/ ● 第 3章:http://tech.idv2.com/2008/07/16/memcached­003/ ● 第 4章:http://tech.idv2.com/2008/07/24/memcached­004/ ● 第 5章:http://tech.idv2.com/2008/07/31/memcached­005/ 本 PDF可以在这个地址下载: ● http://tech.idv2.com/2008/08/17/memcached­pdf/    charlee 2008年 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  安装 memcached memcached的安装比较简单,这里稍加说明。 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 libevent­devel memcached的源代码可以从memcached网站上下载。本文执笔时的最新版本为 1.2.5。Fedora 8虽然 也包含了memcached的 rpm,但版本比较老。因为源代码安装并不困难,这里就不使用 rpm了。 • 下载 memcached:http://www.danga.com/memcached/download.bml memcached安装与一般应用程序相同,configure、make、make install就行了。 $ wget http://www.danga.com/memcached/dist/memcached­1.2.5.tar.gz $ tar zxf memcached­1.2.5.tar.gz $ cd memcached­1.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端口。默认为 11211 ­m 最大内存大小。默认为 64M ­vv 用 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::Memcached Perl的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/Cache­Memcached/ 使用 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 fixed­size 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空间的使用 对于该问题目前还没有完美的解决方案,但在文档中记载了比较有效的解决方案。 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 11915 14 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写的名为memcached­tool的 Perl脚本,可以方便地获
本文档为【memcached全面剖析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_236278
暂无简介~
格式:pdf
大小:929KB
软件:PDF阅读器
页数:36
分类:互联网
上传时间:2012-10-23
浏览量:8