??xml version="1.0" encoding="utf-8" standalone="yes"?>日本中文一区二区三区亚洲,欧洲亚洲综合一区二区三区,亚洲国产熟亚洲女视频http://www.tkk7.com/sway/category/35221.htmlzh-cnWed, 15 Oct 2008 04:44:34 GMTWed, 15 Oct 2008 04:44:34 GMT60memcache分析调试http://www.tkk7.com/sway/articles/234409.htmlswayswayWed, 15 Oct 2008 04:28:00 GMThttp://www.tkk7.com/sway/articles/234409.htmlhttp://www.tkk7.com/sway/comments/234409.htmlhttp://www.tkk7.com/sway/articles/234409.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234409.htmlhttp://www.tkk7.com/sway/services/trackbacks/234409.html阅读全文

sway 2008-10-15 12:28 发表评论
]]>
memcache通信协议(转自博客?http://www.tkk7.com/sway/articles/234406.htmlswayswayWed, 15 Oct 2008 03:55:00 GMThttp://www.tkk7.com/sway/articles/234406.htmlhttp://www.tkk7.com/sway/comments/234406.htmlhttp://www.tkk7.com/sway/articles/234406.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234406.htmlhttp://www.tkk7.com/sway/services/trackbacks/234406.html协议
关键?Keys
命oCommands
时旉 Expiration times
错误信息 Error strings
存储命o Storage commands
d命o Retrieval command
删除 Deletion
增加/减少 Increment/Decrement
l计 Statistics
多用途统?nbsp;General-purpose statistics
其他命o Other commands
UDP协议 UDP protocol

协议

       memcached的客L通过TCPq接与服务器通信Q?/span>UDP协议的接口也可以使用Q详l说明请参?/span>”UDP 协议部分Q。一个给定的q行中的memcached服务器在某个Q可配置的)端口上监听连接;客户端连接该端口Q发送命令给服务器,d反馈Q最后关闭连接?/span>

       没有必要发送一个专门的命oȝ束会话。客L可以在不需要该q接的时候就关闭它。注意:我们鼓励客户端缓存它们与服务器的q接Q而不是每ơ要存储或读取数据的时候再ơ重新徏立与服务器的q接?/span>memcache同时打开很多q接不会Ҏ能造成到大的媄响,q是因ؓmemcache在设计之处,p设计成即使打开了很多连接(数百或者需要时上千个连接)也可以高效的q行。缓存连接可以节省与服务器徏?/span>TCPq接的时间开销Q于此相比,在服务器Dؓ建立一个新的连接所做准备的开销可以忽略不计Q?/span>

       memcache通信协议有两U类型的数据Q文本行和非l构化数 据。文本行用来发送从客户端到服务器的命o以及从服务器回送的反馈信息。非l构化的数据用在客户端希望存储或者读取数据时。服务器会以字符的形式严格? 的q回相应数据在存储时存储的数据。服务器不关注字节序Q它也不知道字节序的存在?/span>memcahce寚wl构化数据中的字W没有Q何限Ӟ可以是Q意的字符Q读取数据时Q客L可以在前ơ返回的文本行中切的知道接下来的数据块的长度?/span>

       文本行通常?#8220;"r"n”l束。非l构化数据通常也是?#8220;"r"n”l束Q尽?/span>"r?/span>"n或者其他Q?/span>8位字W可以出现在数据块中。所以当客户端从服务器读取数据时Q必M用前面提供的数据块的长度Q来定数据的l束Q二不是依据跟随在字W流N?#8220;"r"n”来确定数据流的结束,管实际上数据流格式如此?/span>

关键?/span> Keys

memcached使用关键字来区分存储不同的数据。关键字是一个字W串Q可以唯一标识一条数据。当前关键字的长度限制是250个字W(当然目前客户端似乎没有需求用q么长的关键字)Q关键字一?span style="color: red;">不能包含控制字符?span style="color: red;">I格?/span>

命oCommands

memcahe?/span>3U类型的命oQ?/span>

l         存储命o?span style="font-family: 宋体;">Q?/span>3个命令:set?/span>add?/span>replaceQ要求服务器安装关键字存储数据。客L发送一个命令行Q然后一个数据块Q命令执行后客户端等待一行反馈,用来表示命o执行成功与否?/span>

l         d命o-- Q只?/span>1个命令:getQ? 要求服务器根据一l关键字d数据Q在一个请求d以包含一个或多个关键字)。客L发送一个包含请求关键字的命令行Q命令传递到服务器后Q服务器查? 每一个关键字下的数据Q然户将数据?#8220;一个关键字数据Q一个反馈信息行跟着一个数据块”的格式回送数据,直到服务器发?#8220;END”的反馈行?/span>

l         其他命oQ如flush_allQ?/span>version{。这些命令不使用非结构化的数据。对于这些命令,客户端发送一个文本的命o行,Ҏ命o的特性等待一行数据或者在最后一行以“END“l尾的几行反馈信息?/span>

所有的命o行L以命令的名字开始,紧接着是以I格分割的参数。命令名U都是小写,q且是大写敏感的?/span>

时旉 Expiration times

       一些发送到服务器的命o包含时旉Q该时旉对应于:数据保存时_客户端操作限Ӟ。在q些例子中,被发送的真实旉要么?/span>UNIX旉戻I?/span>1970q?/span>1?/span>1?/span>零时LU数数|Q或者从当前旉开始算LU数。对于后一U情况,U数的数g能超q?/span>60*60*24*30Q?/span>30天的U数Q;如果U数的数值大于了q个数|服务器会认ؓ该数值是UNIX旉戻I而不是自当前旉开始的U数偏移倹{?/span>

错误信息 Error strings

       每个命o都有可能被反馈以一个错误消息。这些错误消息有以下三个cdQ?/span>

l         “ERROR"r"n” 

意味着客户端发送了一个在协议中不存在的命令?/span>

l         "CLIENT_ERROR <error>"r"n"

表示客户端输入的命o行上存在某种错误Q输入不W合协议规定?/span><error>是一个h工可读(human-readableQ的错误注释?/span>

l         "SERVER_ERROR <error>"r"n"

表示服务器在执行命o时发生了某些错误Q致使服务器无法执行下去?/span><error>也是一个h工可读(human-readableQ的错误注释。在一些情况下Q错误导致服务器不能再ؓ客户端服务(q样的情况很发生)Q服务器׃在发生错误消息后d关闭q接?span style="color: red;">q也是服务器d关闭到客Lq接的唯一情况?/span>

       后箋U数各种命o的时候,我们不再赘述错误消息的情况,当我们要清楚错误是存在的Q不可忽略?/span>

存储命o Storage commands

       首先Q客L发生如下q样的命令:

<command name> <key> <flags> <exptime> <bytes>"r"n

<data block>"r"n

其中Q?/span>

<command name> ?/span> set?/span>add或?/span>replace?/span>set表示存储该数据;add表示如果服务器没有保存该关键字的情况下,存储该数据;replace表示在服务器已经拥有该关键字的情况下Q替换原有内宏V?/span>

<key>是客L要求服务器存储数据的关键字?/span>

<flags>是一?/span>16位的无符h敎ͼ服务器将它和数据一起存储ƈ且当该数据被索时一赯回。客L可能使用该数gZ个位图来存储Ҏ数据信息Q这个字D对服务器不是透明的?/span>

<exptime>是超时时间。如果gؓ0表示该数据项永远不超Ӟ但有时候该数据可能被删除以ؓ其他数据腑ևI间Q;如果g?/span>0Q可能是l对?/span>UNIX旉Q也可能是自现在开始的偏移|它保证客h在这个超时时间到辑֐Q客L取不到该数据项?/span>

<bytes>是随后数据的字节敎ͼ不包括终l符”"r"n”?/span><bytes>有可能是0Q它后面是一个空的数据块?/span>

<data block>是真正要存储数据?/span>

       发送命令行和数据后Q客L{待反馈Q可以是如下几种情况Q?/span>

l         "STORED"r"n"              表示存储数据成功?/span>

l         "NOT_STORED"r"n"    表示发送的数据没有存储Q但q不因ؓ错误Q而是发生?/span>add或?/span>replace命o不能满条gӞ或者数据项正处于要删除的队列中?/span>

l         错误消息

d命o Retrieval command:

       d命o如下所C:

get <key>*"r"n

<key>*表示一个或多个使用I格分割的关键字字符丌Ӏ?/span>

       发送命令后Q客L{待q回一个或多个数据,每个数据的格式是一个文本行Q后跟着一个数据块。当所有的数据发送完毕后Q服务器发送字W串”END"r"n”表示服务器反馈数据的l束?/span>

       q回数据的格式如下Q?/span>

VALUE <key> <flags> <bytes>"r"n

<data block>"r"n

<key>是发生数据项的关键字?/span>

       <flags>是存储该数据ҎQ客L命o中的标志字段?/span>

       <bytes>是紧跟文本行后数据块的长度,不包括终l符”"r"n”?/span>

<data block>是数据项的数据部分?/span>

       如果h命o行中的有些关键字对应的数据项没有被返回,q意味着服务器没有该关键字标CZ的数据项Q有可能是从来没有被存储q,或者存储过但被删除掉以腑և内存I间Q或者数据项时了,再或者它被某个客L删除了)?/span>

删除 Deletion

删除命o允许直接删除数据,命o格式如下Q?/span>

delete <key> <time>"r"n

<key>是客L希望服务器删除数据项的关键字

<time>是客L希望服务器阻?/span>add?/span>replace命o使用该关键字数据的U数Q可以是相对旉也可以是UNIX的绝Ҏ间。在q段旉内,数据被攑օ一个删除队列,它不能被get命odQ在其上使用add?/span>replace也会p|Q但使用set命o可以成功。当q个旉q去后,数据从服务器的内存中真正的删除。该参数是可选参敎ͼ如果不存在默认ؓ0Q这意味着立即从服务器上删除?/span>

       服务器返回信息:

l         "DELETED"r"n"          表示数据删除成?/span>

l         "NOT_FOUND"r"n"      表示该关键字指定的数据项在服务器上没有找?/span>

l         其他错误消息

下面?/span>flush_all命o使得所有存在的数据立卛_效?/span>

增加/减少 Increment/Decrement

       “incr”?/span>”decr”命o用来修改以及存在的数据项的内容,增加或者减它。该数据被当?/span>32位无W号整数处理。如果当前数据非此类数据Q则l将该内容当?/span>0来处理。另外在其上施加incr/decr命o的数据项必须是业已存在的Q对于不存在的数据项不会它作ؓ0对待Q而是以错误结束?/span>

       客户端发送命令行如下格式Q?/span>

incr <key> <value>"r"n

或?/span>

decr <key> <value>"r"n

<key>是客L要修Ҏ据项的关键字

<value>是对该数据行q行增加或者减的操作数。它是一?/span>32位的无符h数?/span>

       反馈信息有如下几U:

l         "NOT_FOUND"r"n"

表明在服务器上没有找到该数据V?/span>

l         "<value>"r"n "

value是执行完增加/减少命o后,该数据项新的数倹{?/span>

l         错误信息?/span>

注意?#8220;decr”命o的下溢问题,如果客户端尝试减的数量于0Q其l果?/span>0?#8220;incr”命o的溢出问题没有检查。另外减一个数据而它减了长度Q但不保证减它q回时的长度。该数字可能是附加空格的数字Q但q只是实现的优化Q所以你不能怿它?/span>

l计 Statistics

       stats”命o用来查询服务器的q行情况和其他内部数据。它有两U情况,以有无参数来区分Q?/span>

stats"r"n

或?/span>

stats <args>"r"n

       W一U情况它D服务器输Z般统计信息以及设|信息和文档化内宏V?/span>

       W二U情冉|?/span><args>具体的参敎ͼ服务器发送各U内部数据。这部分没有在协议中文档化,因ؓ?/span>memcache的开发者有兛_可能是随时变化的?/span>

多用途统?/span> General-purpose statistics

       当接收到没有带参数的“stats”命o后,服务器发送许多类g如下格式的文本行Q?/span>

STAT <name> <value>"r"n

       当类似的文本行全部发送完毕后Q服务器发送如下的文本行结束反馈信息:

END"r"n

       在所?/span>STAT文本行中Q?/span><name>是该l计目的名Uͼ<value>是其数据。下面是一?/span>stats命o反馈的所有统计项目的列表Q后面跟着其值的数据cd。在数据cd列中Q?/span>”32u”表示一?/span>32位无W号整数Q?/span>”64u”表示一?/span>64位无W号整数Q?/span>”32u:32u”表示是两个用冒号分割?/span>32位无W号整数?/span>

名称

值类?/span>

含义

pid

32u

服务器进E的q程?/span>

uptime

32u

服务器自q行以来的秒?/span>

time

32u

当前服务器上?/span>UNIX

version

string

服务器的版本字符?/span>

rusage_user

32u:32u

服务器进E积累的用户旉Q秒:微妙Q?/span>

rusage_system

32u:32u

服务器进E积累的pȝ旉Q秒:微妙Q?/span>

curr_items

32u

当前在服务器上存储的数据的个数

total_items

32u

在服务器上曾l保存过的数据项的个?/span>

bytes

64u

当前服务器上保存数据的字节数

curr_connections

32u

处于打开状态的q接数目

total_connections

32u

曄打开q的所有连接的数目

connection_structures

32u

服务器分配的q接l构体的个数

cmd_get

64u

get命oh的次?/span>

cmd_set

64u

存储命oh的次?/span>

get_hits

64u

关键字获取命中的ơ数

get_misses

64u

关键字获取没有命中的ơ数

evictions

64u

所有因时而被替换出内存的数据的个数

bytes_read

64u

服务器从|络上读取到的字节数

bytes_write

64u

服务器向|络上写的字节数

limit_maxbytes

64u

服务器允许存储数据的最大?/span>

其他命o Other commands

"flush_all"是一个带有可选数字参数的命oQ它的执行L成功的,服务器L响应?/span>"OK"r"n"字符丌Ӏ它的作用是使得所有的数据立卻I默认Q或者经q一个指定的时旉后全部失效。在|数据项失效后,对于d命o不会返回Q何内容,除非在失效后q些数据再次被存储?/span>flush_allq没有真正的释放q些存在q的数据占用的内存I间Q数据空间真实被占用的情况发生在使用新的数据覆盖老的数据Ҏ。该命o作用最准确的定义是Q它D所有更新时间早于该命o讑֮的时间点的数据项Q在被检索时被忽略,其表现就像已被删除了一栗?/span>

       使用带有延时flush_all命o的目的是Q当你有?/span>memcached服务器池Q需要刷新所有的内容Ӟ但不能在同一旉h所有的服务器,q样可能因为所有的服务器突焉要重新徏立数据内容,而导致数据库压力的颠。g旉项允许你设|他们隔10U失效(讄W一个g时ؓ0Q第二个10U,W三?/span>20U等{)?/span>

"version"是一个没有参数的命oQ命令格式如下:

version"r"n

       服务器发回的反馈信息如下Q?/span>

l         "VERSION <version>"r"n"

<version>是从服务器返回的版本字符丌Ӏ?/span>

l         错误消息?/span>

"verbosity"是一个带有数字参数的命o。它的执行L成功的,服务器反馈以"OK"r"n"表示执行完成。它用来讄日志输出的详l等U?/span>                                        

"quit"是一个没有参数的命o。其格式如下Q?/span>

quit"r"n

       当服务器接受到此命o后,关闭与该客Lq接。不怎样Q客L可以在Q意不需要该q接的时d闭它Q而不需要发送该命o?/span>

UDP协议 UDP protocol

       当基?/span>TCP协议的连接数过TCPq接的上限时Q我们可以?/span>UDP协议来替代。但?/span>UDP协议接口不提供可靠的传输Q所以多用在不严D求成功的操作上;典型?/span>geth会因为缓存的问题Q引起丢失或者不完整的传输?/span>

       每个UDP数据包包含一个简单的帧头Q接着是?/span>TCP协议描述的数据格式的数据。在当前的实CQ请求必d含在一个单独的UDP数据包中Q但q回可能分散在多个数据包中。(唯一的可以拆分请求数据包的是大的多关键字geth?/span>sethQ鉴于可靠性相比而言他们更适合?/span>TCP传输。)

       帧头?/span>8字节长,如下是其格式Q所有的数字都是16位网l字节序整ŞQ高位在前)Q?/span>

       0 - 1                     hID

       2 - 3                     序列?/span>

       4 - 5                     在当前的消息中含有的数据包的个数

       6-7                保留以后使用Q当前必Mؓ0

       hID由客L提供。它的典型值是一个从随机U子开始递增|实际上客L可以使用L的请?/span>ID。服务器的反馈信息中包含了和h命o中一LhID。客L凭借这个请?/span>ID区分来自于同一服务器的反馈。每一个包含未知请?/span>ID的数据包Q可能是׃延时反馈造成Q这些数据包都应该抛弃不用?/span>

       序列号从0?/span>n-1Q?/span>n是消息中ȝ数据包的个数。客L按照序列h序重l数据包Q结果序列中包含了一个完整的?/span>TCP协议一h式的反馈信息Q包含了“"r"n”ȝ字符Ԍ?/span>



sway 2008-10-15 11:55 发表评论
]]>
Cache Insight (转自javaeye)http://www.tkk7.com/sway/articles/234404.htmlswayswayWed, 15 Oct 2008 03:49:00 GMThttp://www.tkk7.com/sway/articles/234404.htmlhttp://www.tkk7.com/sway/comments/234404.htmlhttp://www.tkk7.com/sway/articles/234404.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234404.htmlhttp://www.tkk7.com/sway/services/trackbacks/234404.html Cache Insight

前言
首先Q介l一下我Q作者)自己使用Cache的背景,以便读者更清楚C解我下面要讲q哪些内宏V?
我主要是一个Cache实现者,而不是用者。ؓ了给一些ORMQ比如JPA实现Q提供Cache支持Q我需要包装其它的Open Source CacheQƈ考察它们的特性?
我对q些Open Source Cache的一些工作原理,了解得比较多。具体配|和使用l节Q了解的比较?
本文主要讲述的也是Cache的特性和工作原理Q而不是一个安装、配|、用的入门手册?
本文qCache的一般特性,详述Cache的高U特性,比如Q分布式CacheQ关联对象的CacheQPOJO Cache{?
阅读本文需要具备基本的Cluster知识QORM知识Q数据库事务知识。本文不解释q些基本概念?

-------------------------------------------------------
Cache Features
首先Q我们来览一下常见的Cache?
q个链接l出了常用的Java Open Source Cache?
http://java-source.net/open-source/cache-solutions

memcachedQJBoss CacheQSwarmCacheQOSCacheQJCSQEHCache{开源项目的出镜率和x率比较高?
memcached和其他几个不同,后面会详q?
JBoss Cache的特ҎQ功能大而全Q可是Cache集大成者,几乎什么都支持?
其余的几个都很轻量。SwarmCacheQOSCacheQJCS支持Cluster。EHCache不支持Cluster?

下面列出Cache的基本特性?
1. 旉记录
数据q入Cache的时间?

2. timeoutq期旉
Cache里面的数据多久过?

3. Eviction Policy 清除{略
Cache满了之后Q根据什么策略,应该清除哪些数据?
比如Q最不经常被讉K的数据,最久没有访问到的数据?

4. 命中?
Cache的数据被选中的比?

5. 分Cache
有些Cache有分U的概念。比如,几乎所有的Cache都支持Region分区的概c可以指定某一cȝ数据存放在特定的Region里面。JBoss Cache可以支持更多的别?

6. 分布式Cache
分布在不同计机上的Cache

7. 锁,事务Q数据同?
一些Cache提供了完善的锁,事务支持?

以上Ҏ,大部分Cache都有相应的API支持。这些API很直观,也很单,本文不打展开讲述?
本文下面主要介绍Qmemcached和JBoss Cacheq两个具有代表意义的Cache的高U特性,包括分布式Cache的支持?

-------------------------------------------------------

memcached
http://www.danga.com/memcached/

memcached是一个Client Serverl构的远ECache实现?
Server是用C写的Q提供了多种语言的客LAPIQ包括Java, C#, Ruby, Python, PHP, Perl, C{多U语a?
memcached主要使用在Shared Nothing Architecture中。应用程序通过客户端APIQ从memcached server存取数据?
典型的应用,比如Q用memcached作ؓ数据库缓存?
也常有这L用法Q用memcached存放HTTP Session的数据。具体做法是包装Session InterfaceQ截获setAttribute(), getAttribute()Ҏ?

MemcachedSessionWrapper {
  Object getAttribute( key ){
    return memcachedClient.get (session.getId() + key);
  }
  void setAttribute( key, value ){
    memcachedClient.setObject(session.getId() + key, value);
  }
}

不同计算Z的应用程序通过一个IP地址来访问memcahced Server?
同一个key对应的数据,只存在于一台memcached server的一份内存中?
memcached server也可以部|在多台计算Z。Memcached通过key的hashcode来判断从哪台memcached server上存取数据数据。我们可以看刎ͼ同一个key对应的数据,q是只存在于一台memcached server的一份内存中?
所以,memcached不存在数据同步的问题。这个特性很关键Q我们后面讲到Cluster Cache的时候,׃涉及到数据同步的问题?
memcached׃是远ECacheQ要求放到Cache的Key和Value都是Serializable?
q程CacheQ最令h担心的网l通信开销。据有经验的Qmemcached|络通信开销很小?
memcached的API设计也是q程通信友好的,提供了getMulti(){高_度的调用方法,能够扚w获取数据Q从而减网l通信ơ数?

-------------------------------------------------------

JBoss Cache
http://www.jboss.org/products/jbosscache

有一个商业Cluster CacheQ叫做tangosol?
JBoss Cache是我唯一知道的能够和tangosol媲美的开源Cache?

Cluster Cache的数据同步,需要网l通信Q这p求放到Cache的数据是Serializable?
JBoss Cache提出了POJO Cache的概念,意思是数据不是SerializableQ一栯够在Cluster中同步?
JBoss POJO Cache通过AOP机制Q支持对象同步,支持对象属性的同步Q支持关联对象的CacheQ支持承,集合QQueryQƈ支持不同U别的事务,俨然一个小型内存数据库U别的数据存储系l?
下面q行解释?
最令hqh不解的是q个POJO的Cluster同步如何实现?
JBoss POJO Cache采用AOP来照了POJO的通信和传播工作。天下没有免费的午餐QPOJO不支持序列化Q框架本w就要做q个工作——Marshal and UnmarshalQ比如通过把Java对象译成XMLQ传播出去,Ҏ收到XMLQ再译成Java对象?
上面说了QJBoss POJO Cache很像一个小型存储容器,JBoss POJO Cache的对象管理也非常cMHibernateQJDOQJPA{ORM工具Q同hDetach和Attach的概c?
Attach是putQ把对象攑օ到Cache中。Detach是removeQ把对象从Cache中删除。ؓ啥要多v个名Q?
原因是,put的时候,放进ȝ是个q干净净的POJOQ出来的时候,是Enhanced ObjectQ里面夹杂了很多Interceptor代码Q监听对象的Ҏ?
你操作这个对象的时候,JBoss AOP框架p得了相应的通知Q能够做出相应的反应Q比如数据同步等?
JBoss POJO Cache支持寚w合类型的AOP。同样需要把集合AttachQPutQ进CacheQ然后get出来Q然后对集合q行操作Q就可以被JBoss AOP截获了?

JBoss POJO Cache的基是JBoss Tree Cache。这个Tree CachecM于一个XML DOM树Ş数据l构?
JBoss Cache采用Full Qualified Name作ؓCache KeyQ类gXPath。比如,a/b/c/d?
当你删除a/b的时候,a/b/cQa/b/c/d{所有属于a/b的Key和对应数据,都被删除?
JBoss Cache的findObjectsҎ能够扑և一串对象。比如,findObjectsҎa/b/c/d能够扑ևa,b,c,d{?个对象,攑֜一个Map中返回?
具体用法要参见API详细说明Q因为JBoss POJO Cache提供了很多行为模式?
q种分的Cache功能很有用,实现h也不难。只是,我觉得,q是不够强大。既然支持了cM于XPath的KeyQ不如烦性支持XPath? 条g查询。比如,a[name=”n”]/b/c。当Ӟ实现q种功能的代价非常大Q需要遍历整个Cache TreeQ正如XPath需要遍历整个DOM节点一栗?

最后,JBoss Cache和tangosol一P都支持了一个我认ؓ如同鸡肋一般的功能Q锁机制和事务支持。这个事务支持的意思是QCache本n实现了类g数据库的4U事务隔ȝ别?
在我看来Q这U支持无疑是Z赚取眼球。Cache不当做Cache来用Q搞些歪门邪道,大而不当。想当作数据库来用,那还不如把主要功夫花在上q提到的那种_扚w查询功能上?

-------------------------------------------------------
Cluster同步

Cluster之间的Cache同步有多U实现方法。比如,JMSQRMIQClient Server Socket{方法,用的最多的Q支持最q的Ҏ是JGroups开源项目实现的Multicast。配|Cluster CacheQ通常q当于配置JGroupsQ需要阅读JGroups配置文档?
Cache的操作通常?个,getQputQremoveQclear?
对于Cluster Cache来说Q读操作QgetQ肯定是LocalҎQ只需要从本台计算机内存中获取数据。Remove/clear两个写操作,肯定是Remote? 法,需要和Cluster其他计算行同步。Putq个写方法,可以是LocalQ也可以是Remote的?
Remote PutҎ的场景是q样Q一台计机把数据放到Cache里面Q这个数据就会被传播到Cluster其他计算Z。这个做法的好处是Cluster各台计算机的Cache数据可以及时得到补充Q坏处是传播的数据量比较大,q个代h比较?
Local PutҎ的场景是q样Q一台计机把数据放到Cache里面Q这个数据不会被传播到Cluster其他计算Z。这个做法的好处是不需要传播数据,坏处 是Cluster各台计算机的Cache数据不能及时得到补充Q这个不是很明显的问题,从Cache中得不到数据Q从数据库获取数据是很正常的现象?
Local Put比vRemote Put的优势很明显Q所以,通常的Cluster Cache都采用Local Put的策略。各Cache一般都提供了Local Put的配|选项Q如果你没有看到q个支持Q那么请换一个Cache?D

-------------------------------------------------------

Center vs Cluster
Memcached可以看作是Center Cache?
Center Cache和Cluster Cache的特性比较如下:
Center Cache没有同步问题Q所以,remove/clear的时候,比较有优势,不需要把通知发送到好几个计机上?
但是QCenter Cache的所有操作,get/put/remove/clear都是Remote操作。而Cluster Cache的get/put都是Local操作Q所以,Cluster Cache在get/put操作上具有优ѝ?

Local get/put在关联对象的l装和分拆方面,优势比较明显?
兌对象的分拆是q个意思?
比如Q有一个Topic对象Q下面有几个Post对象Q每个Post对象都有一个User对象?
Topic对象存放到Cache中的时候,下面的关联对象都要拆开来,分成各自的Entity Region来存放?
Topic Region -> Topic ID -> Topic Object
Post Region -> Post ID -> Post Object
User Region -> User ID -> User Object
q个时候,put的动作可能发生多ơ。Remote Put的开销比较大?
Get的过E类|也需要get多次Q才能拼装成一个完整的Topic对象?


-------------------------------------------------------

q期数据
Cache可以用在M地方Q比如,面~存。但Cache的最常用场景是用在ORM中,比如QHibernateQJDOQJPA中?
ORM Cache的用方法有个原则——不要把没有Commit的修Ҏ据放入到~存中。这是ؓ了防止Read Dirty?
数据库事务分ZU,一U是M务,不修Ҏ据,一U是写事务,修改数据?
写事务的操作程如下Q?
db.commt();
cache.remove(key); // q一步操作,清除了Cache数据Q也记录了一个时间removeTime?

M务的操作程如下Q?
readTime = current time;
data = cache.get(key);
if(data is null){
  data = db.load(key);
  cache.put(key, data, readTime); // q里要readTime传进?
}

q里需要注意的是put的时候,需要readTimeq个参数?
q个readTime要和上一ơ的removeTimeq行比较?
如果readTime > removeTimeQ这个put才能成功Q数据才能够q入~存?
q是Z保证不把q期数据攑օ到Cache中,及时反映数据库的变化?

另外Q需要注意的是,cache.remove(key); q个事g需要传播到Cluster其他计算机,通知它们清理~存?
Z么需要这个通知Q?
一定要注意Q这不是Z避免q发修改冲突。ƈ发修改冲H的避免需要引入乐观锁版本控制机制?
有可能存在这L误解Q认为有了乐观锁版本控制机制Q就不需要Cache.remove通知了。这是不对的?
Cache.remove通知的主要目的是Q保证缓存能够及时清理过期数据,反映数据的变化,保证大部分时间内Q应用程序显C给用户的不是过期数据?
另外Qdb.commt(); cache.remove(key); q两步调用之_有很的可能发生另外的事务。这D|的旉内,可能无法保证Read CommittedQ可能出现很短期的过期数据?
Z么说很短期,因ؓ紧接着的Cache.remove׃清理q期数据?
如果偏执到这U程度,q么短期的几乎不可能发生的小概率事gQ都不能容忍Q那么可以,db.commt()之前Q给Cache加一个悲观锁Q不让别的事务,把数据Putq入CacheQ就可以防止q个概率、微影响的事件?
JBoss Cache和Tangosol提供了q类鸡肋一般的悲观锁机制。典型的开发资源配|不当,有用的需要的不做Q没用的功能使劲做?
ORM Query Cache
ORM Cache一般分ZU。一U是ID CacheQORM文档中称ZUCacheQ,用来存放Entity ID对应的Entity对象Q一U是Query CacheQ用来存放一条查询语句对应的查询l果集?
ID Cache非常直观Q如同上q讲q的Q一般是一个Entity Class对应一个RegionQEntity存放到对应的Region里面?
Query Cache比较复杂Q而且潜在作用很大Q值得仔细讲解?
现有的ORM对Query Cache的支持ƈ不是很理惟?
比如QHibernate把整个结果集直接攑֜Query Cache中。这P有Q何风吹草动,发生了Q何数据库的写操作QQuery Cache都需要清I?
有一U比较好的做法,把ID List存放在Query Cache中,每次获取的时候,先获取ID ListQ然后根据ID List获取Entity List。Query CacheҎQuery涉及到的Table Name来进行清理,一旦发生对q些Table Name的修Ҏ作,可以根据不同情况,清理Query Cache?
比如Qselect t2.* from t1, t2 where t1.id = t2.foreign_id and t1.name = ‘a’
那么insert into t1, delete from t1, insert into t2, delete from t2都会清除q条Query Cache?
同样?update t1 set name = … q样的语句也会清除这条Query Cache?
HibernateZ么不q么做,因ؓQuery Cache的情冉|较复杂。也讔R择的结果集q不是只有一个EntitycdQ也许只是几个字Dc?
q个地方Q如果细分,q是有很多功夫可以做的。而且也很值得花功夫做Q因为Query Cache对于性能的提高,有很大作用?

-------------------------------------------------------

ORM Query Cache
Cache可以用在M地方Q比如,面~存。但Cache的最常用场景是用在ORM中,比如QHibernateQJDOQJPA中?
ORM Cache一般分ZU。一U是ID CacheQORM文档中称ZUCacheQ,用来存放Entity ID对应的Entity对象Q一U是Query CacheQ用来存放一条查询语句对应的查询l果集?
ID Cache非常直观Q如同上q讲q的Q一般是一个Entity Class对应一个RegionQEntity存放到对应的Region里面?
Query Cache比较复杂Q而且潜在作用很大Q值得仔细讲解?
现有的ORM对Query Cache的支持ƈ不是很理惟?
比如QHibernate把整个结果集直接攑֜Query Cache中。这P有Q何风吹草动,发生了Q何数据库的写操作QQuery Cache都需要清I?
有一U比较好的做法,把ID List存放在Query Cache中,每次获取的时候,先获取ID ListQ然后根据ID List获取Entity List。Query CacheҎQuery涉及到的Table Name来进行清理,一旦发生对q些Table Name的修Ҏ作,可以根据不同情况,清理Query Cache?
比如Qselect t2.* from t1, t2 where t1.id = t2.foreign_id and t1.name = ‘a’
那么insert into t1, delete from t1, insert into t2, delete from t2都会清除q条Query Cache?
同样?update t1 set name = … q样的语句也会清除这条Query Cache?
HibernateZ么不q么做,因ؓQuery Cache的情冉|较复杂。也讔R择的结果集q不是只有一个EntitycdQ也许只是几个字Dc?
q个地方Q如果细分,q是有很多功夫可以做的。而且也很值得花功夫做Q因为Query Cache对于性能的提高,有很大作用?

-----------------------------------------------------------

Query Key
Query Cache的性能需要考虑几个斚w。比如,Query Key。Query Key一般由2个部分组成:Query String部分QSQL, HQL, EQL, or OQLQ参数部分?
LQuery Key的对应数据的时候,Query Key的比较有两个步骤Q先hashQ然后equals。所以,Query Key的hashcode和equals两个Ҏ很重要。尤其是equalsҎ?
equalsҎ需要比较很长的Query String。如果没有命中,Query String不相{,那么开销很小Q因为通常来说Q不相等的String长度都不同,或者前面的字符串都不相同。开销最大的是命中的时候,Query String相等Q那么需要把String从头比到?
我们可以采取一些方法来提高String的比较速度。比如,大部分的情况属于静态查询,我们可以采用Singleton String。相同reference的String之间的比较速度很快。对于ORM来说Q最好直接用最外面的HQL, EQL, OQL作ؓQuery KeyQ而不是采用生成的SQLl果。因为生成的SQLl果每次都是一个新StringQ具有不同的referenceQCache命中的时候,需要比? 整个字符丌Ӏ?
动态拼装的Query String的性能提高比较隑֊。因为最l的l果Q都是一个新String。我采用的一U方式是Q动态拼装的l果是一个String[]。两? String[]如果相等Q那么里面的元素String的reference都是相等的,q是由JVM对一个Class内部的String帔Rq行优化? l果?
比如Q?
String[] a = {
  “select * from t where”
  “a = 1”
  “and b = 2”
};

String[] b = {
  “select * from t where”
  “a = 1”
  “and b = 2”
};

那么a和b的比较只需?ơString reference的比较?

sway 2008-10-15 11:49 发表评论
]]>
memcached全面剖析?. memcached的应用和兼容E序http://www.tkk7.com/sway/articles/234403.htmlswayswayWed, 15 Oct 2008 03:38:00 GMThttp://www.tkk7.com/sway/articles/234403.htmlhttp://www.tkk7.com/sway/comments/234403.htmlhttp://www.tkk7.com/sway/articles/234403.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234403.htmlhttp://www.tkk7.com/sway/services/trackbacks/234403.htmlmemcached全面剖析–5. memcached的应用和兼容E序
作?charlee  来源:idv2.com  旉:2008-09-28  阅读:49 ?nbsp; 原文链接   [收藏]  

发表日:2008/7/30
作者:镉K雅广(Masahiro Nagano)
原文链接Q?a >http://gihyo.jp/dev/feature/01/memcached/0005

我是Mixi的长野。memcached的连载终于要l束了。到上次为止Q我们介l了与memcached直接相关的话题,本次介绍一些mixi的案例和实际应用上的话题Qƈ介绍一些与memcached兼容的程序?

mixi案例研究

mixi在提供服务的初期阶段׃用了memcached。随着|站讉K量的急剧增加Q单Uؓ数据库添加slave已无法满需要,因此引入了memcached。此外,我们也从增加可扩展性的斚wq行了验证,证明了memcached的速度和稳定性都能满需要。现在,memcached已成为mixi服务中非帔R要的l成部分?/p>


? 现在的系l组?/p>

服务器配|和数量

mixi使用了许许多多服务器Q如数据库服务器、应用服务器、图片服务器、反向代理服务器{。单单memcached有近200台服务器在运行?memcached服务器的典型配置如下Q?/p>

  • CPUQIntel Pentium 4 2.8GHz
  • 内存Q?GB
  • 盘Q?46GB SCSI
  • 操作pȝQLinuxQx86_64Q?/li>

q些服务器以前曾用于数据库服务器{。随着CPU性能提升、内存hg降,我们U极地将数据库服务器、应用服务器{换成了性能更强大、内存更多的服务器。这P可以抑制mixi整体使用的服务器数量的急剧增加Q降低管理成本。由于memcached服务器几乎不占用CPUQ就换下来的服务器用作memcached服务器了?/p>

memcachedq程

每台memcached服务器仅启动一个memcachedq程。分配给memcached的内存ؓ3GBQ启动参数如下:

/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720

׃使用了x86_64的操作系l,因此能分?GB以上的内存?2位操作系l中Q每个进E最多只能?GB内存。也曄考虑q启动多个分?GB以下内存的进E,但这样一台服务器上的TCPq接数就会成倍增加,理上也变得复杂Q所以mixiq一使用?4位操作系l?/p>

另外Q虽然服务器的内存ؓ4GBQ却仅分配了3GBQ是因ؓ内存分配量超q这个|有可能D内存交换(swap)。连载的W??/a>中前坂讲解过了memcached的内存存?#8220;slab allocator”Q当时说q,memcached启动时指定的内存分配量是memcached用于保存数据的量Q没有包?#8220;slab allocator”本n占用的内存、以及ؓ了保存数据而设|的理I间。因此,memcachedq程的实际内存分配量要比指定的容量要大,q一点应当注意?/p>

mixi保存在memcached中的数据大部分都比较。这Pq程的大要比指定的定w大很多。因此,我们反复改变内存分配量进行验证,认?GB的大不会引发swapQ这是现在应用的数倹{?/p>

memcached使用Ҏ和客L

现在Qmixi的服务将200台左右的memcached服务器作Z个pool使用。每台服务器的容量ؓ3GBQ那么全体就有了近600GB的巨大的内存数据库。客LE序库用了本连载中多次提到车的Cache::Memcached::FastQ与服务器进行交互。当Ӟ~存的分布式法使用的是 W??/a>介绍q的 Consistent Hashing法?/p>

应用层上memcached的用方法由开发应用程序的工程师自行决定ƈ实现。但是,Z防止车轮再造、防止Cache::Memcached::Fast上的教训再次发生Q我们提供了Cache::Memcached::Fast的wrap模块q用?/p>

通过Cache::Memcached::Fastl持q接

Cache::Memcached的情况下Q与memcached的连接(文g句柄Q保存在Cache::Memcached包内的类变量中。在mod_perl和FastCGI{环境下Q包内的变量不会像CGI那样随时重新启动Q而是在进E中一直保持。其l果是不会断开与memcached的连接,减少了TCPq接建立时的开销Q同时也能防止短旉内反复进行TCPq接、断开而导致的TCP端口资源枯竭?/p>

但是QCache::Memcached::Fast没有q个功能Q所以需要在模块之外Cache::Memcached::Fast对象保持在类变量中,以保证持久连接?/p>

package Gihyo::Memcached;

use strict;
use warnings;
use Cache::Memcached::Fast;

my @server_list = qw/192.168.1.1:11211 192.168.1.1:11211/;
my $fast; ## 用于保持对象

sub new {
my $self = bless {}, shift;
if ( !$fast ) {
$fast = Cache::Memcached::Fast->new({ servers => \@server_list });
}
$self->{_fast} = $fast;
return $self;
}

sub get {
my $self = shift;
$self->{_fast}->get(@_);
}

上面的例子中QCache::Memcached::Fast对象保存到类变量$fast中?/p>

公共数据的处理和rehash

诸如mixi的主上的新闻这L所有用户共享的~存数据、设|信息等数据Q会占用许多,讉Kơ数也非常多。在q种条g下,讉K很容易集中到某台memcached服务器上。访问集中本wƈ不是问题Q但是一旦访问集中的那台服务器发生故障导致memcached无法q接Q就会生巨大的问题?/p>

q蝲?a >W??/a> 中提刎ͼCache::Memcached拥有rehash功能Q即在无法连接保存数据的服务器的情况下,会再ơ计hash|q接其他的服务器?/p>

但是QCache::Memcached::Fast没有q个功能。不q,它能够在q接服务器失败时Q短旉内不再连接该服务器的功能?/p>

my $fast = Cache::Memcached::Fast->new({
max_failures => 3,
failure_timeout => 1
});

在failure_timeoutU内发生max_failures以上ơ连接失败,׃再连接该memcached服务器。我们的讄?U钟3ơ以上?/p>

此外Qmixiqؓ所有用户共享的~存数据的键名设|命名规则,W合命名规则的数据会自动保存到多台memcached服务器中Q取得时从中仅选取一台服务器。创函数库后Q就可以使memcached服务器故障不再生其他媄响?/p>

memcached应用l验

到此为止介绍了memcached内部构造和函数库,接下来介l一些其他的应用l验?/p>

通过daemontools启动

通常情况下memcachedq行得相当稳定,但mixi现在使用的最新版1.2.5 曄发生q几ơmemcachedq程L的情c架构上保证了即使有几台memcached故障也不会媄响服务,不过对于memcachedq程L的服务器Q只要重新启动memcachedQ就可以正常q行Q所以采用了监视memcachedq程q自动启动的Ҏ。于是用了daemontools?/p>

daemontools是qmail的作者DJB开发的UNIX服务理工具集,其中名ؓsupervise的程序可用于服务启动、停止的服务重启{?/p>

q里不介ldaemontools的安装了。mixi使用了以下的run脚本来启动memcached?/p>

#!/bin/sh

if [ -f /etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi

exec 2>&1
exec /usr/bin/memcached -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN $OPTIONS

监视

mixi使用了名?#8220;nagios”的开源监视Y件来监视memcached?/p>

在nagios中可以简单地开发插Ӟ可以详细地监视memcached的get、add{动作。不qmixi仅通过stats命o来确认memcached的运行状态?/p>

define command {
command_name check_memcached
command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p 11211 -t 5 -E -s 'stats\r\nquit\r\n' -e 'uptime' -M crit
}

此外Qmixistats目录的结果通过rrdtool转化成图形,q行性能监视Qƈ每天的内存使用量做成报表,通过邮g与开发者共享?/p>

memcached的性能

q蝲中已介绍q,memcached的性能十分优秀。我们来看看mixi的实际案例。这里介l的图表是服务所使用的访问最为集中的memcached服务器?/p>


? h?/p>


? 量


? TCPq接?/p>

从上至下依次求数、流量和TCPq接数。请求数最大ؓ15000qpsQ流量达?00MbpsQ这时的q接数已过?0000个。该服务器没有特别的gQ就是开头介l的普通的memcached服务器。此时的CPU利用率ؓQ?/p>


? CPU利用?/p>

可见Q仍然有idle的部分。因此,memcached的性能非常高,可以作ؓWeb应用E序开发者放心地保存临时数据或缓存数据的地方?/p>

兼容应用E序

memcached的实现和协议都十分简单,因此有很多与memcached兼容的实现。一些功能强大的扩展可以memcached的内存数据写到磁盘上Q实现数据的持久性和冗余。连?a >W??/a> 介绍q,以后的memcached的存储层变成可扩展的(pluggableQ,逐渐支持q些功能?/p>

q里介绍几个与memcached兼容的应用程序?/p>

repcached
为memcached提供复制(replication)功能的patch?/dd>
Flared
存储到QDBM。同时实C异步复制和fail over{功能?/dd>
memcachedb
存储到BerkleyDB。还实现了message queue?/dd>
Tokyo Tyrant
数据存储到Tokyo Cabinet。不仅与memcached协议兼容Q还能通过HTTPq行讉K?/dd>

Tokyo Tyrant案例

mixi使用了上q兼容应用程序中的Tokyo Tyrant。Tokyo Tyrant是^林开发的 Tokyo Cabinet DBM的网l接口。它有自q协议Q但也拥有memcached兼容协议Q也可以通过HTTPq行数据交换。Tokyo Cabinet虽然是一U将数据写到盘的实玎ͼ但速度相当快?/p>

mixiq没有将Tokyo Tyrant作ؓ~存服务器,而是它作ؓ保存键值对l合的DBMS来用。主要作为存储用户上ơ访问时间的数据库来使用。它与几乎所有的mixi服务都有养I每次用户讉K面旉要更新数据,因此负荷相当高。MySQL的处理十分笨重,单独使用memcached保存数据又有可能会丢失数据,所以引入了Tokyo Tyrant。但无需重新开发客LQ只需原封不动C用Cache::Memcached::Fast卛_Q这也是优点之一。关于Tokyo Tyrant的详l信息,请参考本公司的开发blog?/p>

ȝ

到本ơؓ止,“memcached全面剖析”pdq束了。我们介l了memcached的基、内部结构、分散算法和应用{内宏V读完后如果您能对memcached产生兴趣Q就是我们的荣幸。关于mixi的系l、应用方面的信息Q请参考本公司?a >开发blog。感谢您的阅诅R?/p>

Z方便阅读Q现原来的译l果打包成PDF文档Q?a >下蝲?/p>



sway 2008-10-15 11:38 发表评论
]]>
memcached全面剖析?. memcached的分布式法http://www.tkk7.com/sway/articles/234402.htmlswayswayWed, 15 Oct 2008 03:37:00 GMThttp://www.tkk7.com/sway/articles/234402.htmlhttp://www.tkk7.com/sway/comments/234402.htmlhttp://www.tkk7.com/sway/articles/234402.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234402.htmlhttp://www.tkk7.com/sway/services/trackbacks/234402.htmlmemcached全面剖析–4. memcached的分布式法
作?charlee  来源:idv2.com  旉:2008-09-28  阅读:48 ?nbsp; 原文链接   [收藏]  

发表日:2008/7/23
作者:镉K雅广(Masahiro Nagano)
原文链接Q?a >http://gihyo.jp/dev/feature/01/memcached/0004

我是Mixi的长野?W??/a>?W??/a> 由前坂介l了memcached的内部情c本ơ不再介lmemcached的内部结构,开始介lmemcached的分布式?/p>

memcached的分布式

正如W??/a>中介l的那样Q?memcached虽然UCؓ“分布?#8221;~存服务器,但服务器端ƈ没有“分布?#8221;功能。服务器端仅包括 W??/a>?W??/a> 前坂介绍的内存存储功能,其实现非常简单。至于memcached的分布式Q则是完全由客户端程序库实现的。这U分布式是memcached的最大特炏V?/p>

memcached的分布式是什么意思?

q里多次使用?#8220;分布?#8221;q个词,但ƈ未做详细解释。现在开始简单地介绍一下其原理Q各个客L的实现基本相同?/p>

下面假设memcached服务器有node1~node3三台Q应用程序要保存键名?#8220;tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据?/p>


? 分布式简介:准备

首先向memcached中添?#8220;tokyo”。将“tokyo”传给客户端程序库后,客户端实现的法׃Ҏ“?#8221;来决定保存数据的memcached服务器。服务器选定后,卛_令它保存“tokyo”及其倹{?/p>


? 分布式简介:d?/p>

同样Q?#8220;kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存?/p>

接下来获取保存的数据。获取时也要要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,Ҏ“?#8221;选择服务器。用的法相同Q就能选中与保存时相同的服务器Q然后发送get命o。只要数据没有因为某些原因被删除Q就能获得保存的倹{?/p>


? 分布式简介:获取?/p>

q样Q将不同的键保存C同的服务器上Q就实现了memcached的分布式?memcached服务器增多后Q键׃分散Q即使一台memcached服务器发生故障无法连接,也不会媄响其他的~存Q系l依然能l箋q行?/p>

接下来介l?a >W??/a> 中提到的Perl客户端函数库Cache::Memcached实现的分布式Ҏ?/p>

Cache::Memcached的分布式Ҏ

Perl的memcached客户端函数库Cache::Memcached?memcached的作者Brad Fitzpatrick的作品,可以说是原装的函数库了?/p>

该函数库实现了分布式功能Q是memcached标准的分布式Ҏ?/p>

Ҏ余数计算分散

Cache::Memcached的分布式Ҏ单来_是“Ҏ服务器台数的余数q行分散”。求得键的整数哈希|再除以服务器台数Q根据其余数来选择服务器?/p>

下面Cache::Memcached化成以下的Perl脚本来进行说明?/p>

use strict;
use warnings;
use String::CRC32;

my @nodes = ('node1','node2','node3');
my @keys = ('tokyo', 'kanagawa', 'chiba', 'saitama', 'gunma');

foreach my $key (@keys) {
my $crc = crc32($key); # CRC?br /> my $mod = $crc % ( $#nodes + 1 );
my $server = $nodes[ $mod ]; # Ҏ余数选择服务?br /> printf "%s => %s\n", $key, $server;
}

Cache::Memcached在求哈希值时使用了CRC?/p>

首先求得字符串的CRC|Ҏ该值除以服务器节点数目得到的余数决定服务器。上面的代码执行后输入以下结果:

tokyo       => node2
kanagawa => node3
chiba => node2
saitama => node1
gunma => node1

Ҏ该结果,“tokyo”分散到node2Q?#8220;kanagawa”分散到node3{。多说一句,当选择的服务器无法q接ӞCache::Memcached会将q接ơ数d到键之后Q再ơ计哈希值ƈ试q接。这个动作称为rehash。不希望rehash时可以在生成Cache::Memcached对象时指?#8220;rehash => 0”选项?/p>

Ҏ余数计算分散的缺?/h3>

余数计算的方法简单,数据的分散性也相当优秀Q但也有其缺炏V那是当添加或U除服务器时Q缓存重l的代h相当巨大。添加服务器后,余数׃产生巨变Q这样就无法获取与保存时相同的服务器Q从而媄响缓存的命中率。用Perl写段代码来验证其代h?/p>

use strict;
use warnings;
use String::CRC32;

my @nodes = @ARGV;
my @keys = ('a'..'z');
my %nodes;

foreach my $key ( @keys ) {
my $hash = crc32($key);
my $mod = $hash % ( $#nodes + 1 );
my $server = $nodes[ $mod ];
push @{ $nodes{ $server } }, $key;
}

foreach my $node ( sort keys %nodes ) {
printf "%s: %s\n", $node, join ",", @{ $nodes{$node} };
}

q段Perl脚本演示了将“a”?#8220;z”的键保存到memcachedq访问的情况。将其保存ؓmod.plq执行?/p>

首先Q当服务器只有三台时Q?/p>

$ mod.pl node1 node2 nod3
node1: a,c,d,e,h,j,n,u,w,x
node2: g,i,k,l,p,r,s,y
node3: b,f,m,o,q,t,v,z

l果如上Qnode1保存a、c、d、e……Qnode2保存g、i、k……Q每台服务器都保存了8个到10个数据?/p>

接下来增加一台memcached服务器?/p>

$ mod.pl node1 node2 node3 node4
node1: d,f,m,o,t,v
node2: b,i,k,p,r,y
node3: e,g,l,n,u,w
node4: a,c,h,j,q,s,x,z

d了node4。可见,只有d、i、k、p、r、y命中了。像q样Q添加节点后键分散到的服务器会发生巨大变化?6个键中只有六个在讉K原来的服务器Q其他的全都Ud了其他服务器。命中率降低?3%。在Web应用E序中用memcachedӞ在添加memcached服务器的瞬间~存效率会大q度下降Q负载会集中到数据库服务器上Q有可能会发生无法提供正常服务的情况?/p>

mixi的Web应用E序q用中也有这个问题,D无法dmemcached服务器。但׃使用了新的分布式ҎQ现在可以轻而易丑֜dmemcached服务器了。这U分布式ҎUCؓ Consistent Hashing?/p>

Consistent Hashing

关于Consistent Hashing的思想Qmixi株式会社的开发blog{许多地斚w介绍q,q里只简单地说明一下?/p>

Consistent Hashing的简单说?/h3>

Consistent Hashing如下所C:首先求出memcached服务器(节点Q的哈希|q将光|到0?32的圆QcontinuumQ上。然后用同样的方法求出存储数据的键的哈希|q映到圆上。然后从数据映射到的位置开始顺旉查找Q将数据保存到找到的W一个服务器上。如果超q?32仍然找不到服务器Q就会保存到W一台memcached服务器上?/p>


? Consistent HashingQ基本原?/p>

从上囄状态中d一台memcached服务器。余数分布式法׃保存键的服务器会发生巨大变化而媄响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地炚w时针方向的W一台服务器上的键会受到影响?/p>


? Consistent HashingQ添加服务器

因此QConsistent Hashing最大限度地抑制了键的重新分布。而且Q有的Consistent Hashing的实现方法还采用了虚拟节点的思想。用一般的hash函数的话Q服务器的映地点的分布非常不均匀。因此,使用虚拟节点的思想Qؓ每个物理节点Q服务器Q在continuum上分?00?00个点。这样就能抑制分布不均匀Q最大限度地减小服务器增减时的缓存重新分布?/p>

通过下文中介l的使用Consistent Hashing法的memcached客户端函数库q行试的结果是Q由服务器台敎ͼnQ和增加的服务器台数QmQ计增加服务器后的命中率计公式如下:

(1 - n/(n+m)) * 100

支持Consistent Hashing的函数库

本连载中多次介绍的Cache::Memcached虽然不支持Consistent HashingQ但已有几个客户端函数库支持了这U新的分布式法。第一个支持Consistent Hashing和虚拟节点的memcached客户端函数库是名为libketama的PHP库,由last.fm开发?/p>

至于Perl客户端,q蝲?a >W??/a> 中介l过的Cache::Memcached::Fast和Cache::Memcached::libmemcached支持 Consistent Hashing?/p>

两者的接口都与Cache::Memcached几乎相同Q如果正在用Cache::MemcachedQ那么就可以方便地替换过来。Cache::Memcached::Fast重新实现了libketamaQ用Consistent Hashing创徏对象时可以指定ketama_points选项?/p>

my $memcached = Cache::Memcached::Fast->new({
servers => ["192.168.0.1:11211","192.168.0.2:11211"],
ketama_points => 150
});

另外QCache::Memcached::libmemcached 是一个用了Brain Aker开发的C函数库libmemcached的Perl模块?libmemcached本n支持几种分布式算法,也支持Consistent HashingQ其Perll定也支持Consistent Hashing?/p>

ȝ

本次介绍了memcached的分布式法Q主要有memcached的分布式是由客户端函数库实现Q以及高效率地分散数据的Consistent Hashing法。下ơ将介绍mixi在memcached应用斚w的一些经验,和相关的兼容应用E序?/p>



sway 2008-10-15 11:37 发表评论
]]>
memcached全面剖析?.memcached的删除机制和发展方向http://www.tkk7.com/sway/articles/234401.htmlswayswayWed, 15 Oct 2008 03:32:00 GMThttp://www.tkk7.com/sway/articles/234401.htmlhttp://www.tkk7.com/sway/comments/234401.htmlhttp://www.tkk7.com/sway/articles/234401.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234401.htmlhttp://www.tkk7.com/sway/services/trackbacks/234401.htmlmemcached全面剖析–3.memcached的删除机制和发展方向
作?charlee  来源:idv2.com  旉:2008-09-28  阅读:44 ?nbsp; 原文链接   [收藏]  

下面是《memcached全面剖析》的W三部分?/p>

发表日:2008/7/16
作者:前坂?Toru Maesaka)
原文链接Q?a >http://gihyo.jp/dev/feature/01/memcached/0003

memcached是缓存,所以数据不会永久保存在服务器上Q这是向pȝ中引入memcached的前提? 本次介绍memcached的数据删除机Ӟ以及memcached的最新发展方向——二q制协议QBinary ProtocolQ? 和外部引擎支持?/p>

memcached在数据删除方面有效利用资?/h2>

数据不会真正从memcached中消?/h3>

上次介绍q, memcached不会释放已分配的内存。记录超时后Q客L无法再看见该记录(invisibleQ透明Q, 其存储空间即可重复用?/p>

Lazy Expiration

memcached内部不会监视记录是否q期Q而是在get时查看记录的旉戻I查记录是否过期? q种技术被UCؓlazyQ惰性)expiration。因此,memcached不会在过期监视上耗费CPU旉?/p>

LRUQ从~存中有效删除数据的原理

memcached会优先用已时的记录的I间Q但即如此Q也会发生追加新记录时空间不的情况Q? 此时p使用名ؓ Least Recently UsedQLRUQ机制来分配I间? ֐思义Q这是删?#8220;最q最?#8221;的记录的机制? 因此Q当memcached的内存空间不xQ无法从slab class 获取到新的空间时Q,׃最q未被用的记录中搜索,q将其空间分配给新的记录? 从缓存的实用角度来看Q该模型十分理想?/p>

不过Q有些情况下LRU机制反倒会造成ȝ。memcached启动旉过“-M”参数可以止LRUQ如下所C:

$ memcached -M -m 1024

启动时必L意的是,写?#8220;-m”选项是用来指定最大内存大的。不指定具体数值则使用默认?4MB?/p>

指定“-M”参数启动后,内存用尽时memcached会返回错误? 话说回来Qmemcached毕竟不是存储器,而是~存Q所以推荐用LRU?/p>

memcached的最新发展方?/h2>

memcached的roadmap上有两个大的目标。一个是二进制协议的{划和实玎ͼ另一个是外部引擎的加载功能?/p>

关于二进制协?/h3>

使用二进制协议的理由是它不需要文本协议的解析处理Q得原本高速的memcached的性能更上一层楼Q? q能减少文本协议的漏z。目前已大部分实玎ͼ开发用的代码库中已包含了该功能? memcached的下载页面上有代码库的链接?/p>

二进制协议的格式

协议的包?4字节的Q其后面是键和无l构数据QUnstructured DataQ? 实际的格式如下(引自协议文档Q:

 Byte/     0       |       1       |       2       |       3       |   
/ | | | |
|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+---------------+---------------+---------------+---------------+
0/ HEADER /
/ /
/ /
/ /
+---------------+---------------+---------------+---------------+
24/ COMMAND-SPECIFIC EXTRAS (as needed) /
+/ (note length in th extras length header field) /
+---------------+---------------+---------------+---------------+
m/ Key (as needed) /
+/ (note length in key length header field) /
+---------------+---------------+---------------+---------------+
n/ Value (as needed) /
+/ (note length is total body length header field, minus /
+/ sum of the extras and key length body fields) /
+---------------+---------------+---------------+---------------+
Total 24 bytes

如上所C,包格式十分简单。需要注意的是,占据?6字节的头?HEADER)分ؓ h_Request HeaderQ和响应_Response HeaderQ两U? 头部中包含了表示包的有效性的Magic字节、命令种cR键长度、值长度等信息Q格式如下:

Request Header

Byte/ 0 | 1 | 2 | 3 |
/ | | | |
|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+---------------+---------------+---------------+---------------+
0| Magic | Opcode | Key length |
+---------------+---------------+---------------+---------------+
4| Extras length | Data type | Reserved |
+---------------+---------------+---------------+---------------+
8| Total body length |
+---------------+---------------+---------------+---------------+
12| Opaque |
+---------------+---------------+---------------+---------------+
16| CAS |
| |
+---------------+---------------+---------------+---------------+
Response Header

Byte/ 0 | 1 | 2 | 3 |
/ | | | |
|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+---------------+---------------+---------------+---------------+
0| Magic | Opcode | Key Length |
+---------------+---------------+---------------+---------------+
4| Extras length | Data type | Status |
+---------------+---------------+---------------+---------------+
8| Total body length |
+---------------+---------------+---------------+---------------+
12| Opaque |
+---------------+---------------+---------------+---------------+
16| CAS |
| |
+---------------+---------------+---------------+---------------+

如希望了解各个部分的详细内容Q可以checkout出memcached的二q制协议的代码树Q? 参考其中的docs文g夹中的protocol_binary.txt文档?/p>

HEADER中引人注目的地方

看到HEADER格式后我的感xQ键的上限太大了Q现在的memcached规格中,键长度最大ؓ250字节Q? 但二q制协议中键的大用2字节表示。因此,理论上最大可使用65536字节Q?<sup>16</sup>Q长的键? 管250字节以上的键q不会太常用Q二q制协议发布之后可以用巨大的键了?/p>

二进制协议从下一版本1.3pd开始支持?/p>

外部引擎支持

我去q曾l试验性地memcached的存储层攚w成了可扩展的(pluggableQ?/p>

MySQL的Brian Aker看到q个攚w之后,将代码发到了memcached的邮件列表? memcached的开发者也十分感兴,放Croadmap中。现在由我和 memcached的开发者Trond Norbye协同开发(规格设计、实现和试Q? 和国外协同开发时时差是个大问题,但抱着相同的愿景, 最后终于可以将可扩展架构的原型公布了? 代码库可以从memcached的下载页?/a> 上访问?/p>

外部引擎支持的必要?/h3>

世界上有许多memcached的派生YӞ其理由是希望怹保存数据、实现数据冗余等Q? 即牺牲一些性能也在所不惜。我在开发memcached之前Q在mixi的研发部也曾l? 考虑q重新发明memcached?/p>

外部引擎的加载机制能装memcached的网l功能、事件处理等复杂的处理? 因此Q现阶段通过强制手段或重新设计等方式使memcached和存储引擎合作的困难 ׃烟消云散Q尝试各U引擎就会变得轻而易举了?/p>

单API设计的成功的关键

该项目中我们最重视的是API设计。函数过多,会引擎开发者感到麻烦; q于复杂Q实现引擎的门槛׃q高。因此,最初版本的接口函数只有13个? 具体内容限于幅Q这里就省略了,仅说明一下引擎应当完成的操作Q?/p>

  • 引擎信息Q版本等Q?/li>
  • 引擎初始?/li>
  • 引擎关闭
  • 引擎的统计信?/li>
  • 在容量方面,试l定记录能否保存
  • 为itemQ记录)l构分配内存
  • 释放itemQ记录)的内?/li>
  • 删除记录
  • 保存记录
  • 回收记录
  • 更新记录的时间戳
  • 数学q算处理
  • 数据的flush

对详l规格有兴趣的读者,可以checkout engine目的代码,阅读器中的engine.h?/p>

重新审视现在的体p?/h3>

memcached支持外部存储的难ҎQ网l和事g处理相关的代码(核心服务器)? 内存存储的代码紧密关联。这U现象也UCؓtightly coupledQ紧密耦合Q? 必须内存存储的代码从核心服务器中独立出来,才能灉|地支持外部引擎? 因此Q基于我们设计的APIQmemcached被重构成下面的样子:


重构之后Q我们与1.2.5版、二q制协议支持版等q行了性能ҎQ证实了它不会造成性能影响?/p>

在考虑如何支持外部引擎加蝲Ӟ让memcachedq行q行控制Qconcurrency controlQ的Ҏ是最为容易的Q? 但是对于引擎而言Qƈ行控制正是性能的真谛,因此我们采用了将多线E支持完全交l引擎的设计Ҏ?/p>

以后的改q,会得memcached的应用范围更为广泛?/p>

ȝ

本次介绍了memcached的超时原理、内部如何删除数据等Q在此之上又介绍了二q制协议? 外部引擎支持{memcached的最新发展方向。这些功能要?.3版才会支持,敬请期待Q?/p>

q是我在本连载中的最后一。感谢大安L的文章!

下次由长野来介绍memcached的应用知识和应用E序兼容性等内容?/p>



sway 2008-10-15 11:32 发表评论
]]>
memcached全面剖析?.理解memcached的内存存?/title><link>http://www.tkk7.com/sway/articles/234400.html</link><dc:creator>sway</dc:creator><author>sway</author><pubDate>Wed, 15 Oct 2008 03:31:00 GMT</pubDate><guid>http://www.tkk7.com/sway/articles/234400.html</guid><wfw:comment>http://www.tkk7.com/sway/comments/234400.html</wfw:comment><comments>http://www.tkk7.com/sway/articles/234400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/sway/comments/commentRss/234400.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sway/services/trackbacks/234400.html</trackback:ping><description><![CDATA[<h1>memcached全面剖析–2.理解memcached的内存存?/h1> <div> 作?<a target="_blank">charlee</a>  来源:<a target="_blank">idv2.com</a>  旉:2008-09-28  阅读:57 ?nbsp; <a target="_blank">原文链接</a>   <a href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://wz.cnblogs.com/create?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t)+'&i=0','keyit','scrollbars=no,width=460,height=353,left=75,top=20,menu=yes,status=no,resizable=yes'));keyit.focus();" class="graylink">[收藏]</a>   </div> <div style="font-size: 14px;" id="ArticleCnt" class="content_words"> <p>下面是《memcached全面剖析》的W二部分?/p> <p>发表日:2008/7/9 <br /> 作者:前坂?Toru Maesaka) <br /> 原文链接Q?a >http://gihyo.jp/dev/feature/01/memcached/0002</a></p> <p>我是<a >mixi株式会社</a>研究开发组的前坂徹? <a >上次</a>的文章介l了memcached是分布式的高速缓存服务器? 本次介lmemcached的内部构造的实现方式Q以及内存的理方式? 另外Qmemcached的内部构造导致的q也将加以说明?/p> <h2 id="content_2_0">Slab Allocation机制Q整理内存以侉K复?/h2> <p>最q的memcached默认情况下采用了名ؓSlab Allocator的机制分配、管理内存? 在该机制出现以前Q内存的分配是通过Ҏ有记录简单地q行malloc和free来进行的? 但是Q这U方式会D内存片Q加重操作系l内存管理器的负担,最坏的情况下, 会导致操作系l比memcachedq程本nq慢。Slab Allocator是册问题而诞生的?/p> <p>下面来看看Slab Allocator的原理。下面是memcached文档中的slab allocator的目标:</p> <p>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.</p> <p>也就是说QSlab Allocator的基本原理是按照预先规定的大,分配的内存分割成特定长度的块, 以完全解军_存碎片问题?/p> <p>Slab Allocation的原理相当简单?分配的内存分割成各U尺寸的块(chunkQ, q把寸相同的块分成l(chunk的集合)Q图1Q?/p> <div style="text-align: left;"><img src="http://pic001.cnblogs.com/img/dudu/200809/2008092816564538.png" alt="" /><br /> </div> <p>? Slab Allocation的构造图</p> <p>而且Qslab allocatorq有重复使用已分配的内存的目的? 也就是说Q分配到的内存不会释放,而是重复利用?/p> <h3 id="content_2_1">Slab Allocation的主要术?/h3> <p><strong>Page</strong></p> <p>分配lSlab的内存空_默认?MB。分配给Slab之后Ҏslab的大切分成chunk?/p> <p><strong>Chunk</strong></p> <p>用于~存记录的内存空间?/p> <p><strong>Slab Class</strong></p> <p>特定大小的chunk的组?/p> <h2 id="content_2_2">在Slab中缓存记录的原理</h2> <p>下面说明memcached如何针对客户端发送的数据选择slabq缓存到chunk中?/p> <p>memcachedҎ收到的数据的大小Q选择最适合数据大小的slabQ图2Q? memcached中保存着slab内空闲chunk的列表,Ҏ该列表选择chunkQ? 然后数据缓存于其中?/p> <div style="text-align: left;"><img src="http://pic001.cnblogs.com/img/dudu/200809/2008092816571451.png" alt="" /><br /> </div> <p>? 选择存储记录的组的方?/p> <p>实际上,Slab Allocator也是有利也有弊。下面介l一下它的缺炏V?/p> <h2 id="content_2_3">Slab Allocator的缺?/h2> <p>Slab Allocator解决了当初的内存片问题Q但新的机制也给memcached带来了新的问题?/p> <p>q个问题是Q由于分配的是特定长度的内存Q因此无法有效利用分配的内存? 例如Q将100字节的数据缓存到128字节的chunk中,剩余?8字节浪费了Q图3Q?/p> <div style="text-align: left;"><img src="http://pic001.cnblogs.com/img/dudu/200809/2008092816574192.png" alt="" /><br /> </div> <p>? chunkI间的?/p> <p>对于该问题目前还没有完美的解x案,但在文档中记载了比较有效的解x案?/p> <p>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.</p> <p>是_如果预先知道客户端发送的数据的公用大,或者仅~存大小相同的数据的情况下, 只要使用适合数据大小的组的列表,可以减浪贏V?/p> <p>但是很遗憾,现在q不能进行Q何调优,只能期待以后的版本了? 但是Q我们可以调节slab class的大的差别? 接下来说明growth factor选项?/p> <h2 id="content_2_4">使用Growth Factorq行调优</h2> <p>memcached在启动时指定 Growth Factor因子Q通过-f选项Q, 可以在某种E度上控制slab之间的差异。默认gؓ1.25? 但是Q在该选项出现之前Q这个因子曾l固定ؓ2Q称?#8220;powers of 2”{略?/p> <p>让我们用以前的设|,以verbose模式启动memcached试试看:</p> <pre>$ memcached -f 2 -vv</pre> <p>下面是启动后的verbose输出Q?/p> <pre>slab class 1: chunk size 128 perslab 8192<br /> slab class 2: chunk size 256 perslab 4096<br /> slab class 3: chunk size 512 perslab 2048<br /> slab class 4: chunk size 1024 perslab 1024<br /> slab class 5: chunk size 2048 perslab 512<br /> slab class 6: chunk size 4096 perslab 256<br /> slab class 7: chunk size 8192 perslab 128<br /> slab class 8: chunk size 16384 perslab 64<br /> slab class 9: chunk size 32768 perslab 32<br /> slab class 10: chunk size 65536 perslab 16<br /> slab class 11: chunk size 131072 perslab 8<br /> slab class 12: chunk size 262144 perslab 4<br /> slab class 13: chunk size 524288 perslab 2</pre> <p>可见Q从128字节的组开始,l的大小依次增大为原来的2倍? q样讄的问题是Qslab之间的差别比较大Q有些情况下q当浪费内存? 因此Qؓ量减少内存费Q两q前q加了growth factorq个选项?/p> <p>来看看现在的默认讄Qf=1.25Q时的输出(幅所限,q里只写到第10l)Q?/p> <pre>slab class 1: chunk size 88 perslab 11915<br /> slab class 2: chunk size 112 perslab 9362<br /> slab class 3: chunk size 144 perslab 7281<br /> slab class 4: chunk size 184 perslab 5698<br /> slab class 5: chunk size 232 perslab 4519<br /> slab class 6: chunk size 296 perslab 3542<br /> slab class 7: chunk size 376 perslab 2788<br /> slab class 8: chunk size 472 perslab 2221<br /> slab class 9: chunk size 592 perslab 1771<br /> slab class 10: chunk size 744 perslab 1409</pre> <p>可见Q组间差距比因子?时小得多Q更适合~存几百字节的记录? 从上面的输出l果来看Q可能会觉得有些计算误差Q? q些误差是ؓ了保持字节数的对齐而故意设|的?/p> <p>memcached引入产品Q或是直接用默认D行部|时Q? 最好是重新计算一下数据的预期q_长度Q调整growth factorQ? 以获得最恰当的设|。内存是珍贵的资源,费太可惜了?/p> <p>接下来介l一下如何用memcached的stats命o查看slabs的利用率{各U各L信息?/p> <h2 id="content_2_5">查看memcached的内部状?/h2> <p>memcached有个名ؓstats的命令,使用它可以获得各U各L信息? 执行命o的方法很多,用telnet最为简单:</p> <pre>$ telnet L?端口?/pre> <p>q接到memcached之后Q输入stats再按回RQ即可获得包括资源利用率在内的各U信息? 此外Q输?stats slabs"?stats items"q可以获得关于缓存记录的信息? l束E序误入quit?/p> <p>q些命o的详l信息可以参考memcached软g包内的protocol.txt文档?/p> <pre>$ telnet localhost 11211<br /> Trying ::1...<br /> Connected to localhost.<br /> Escape character is '^]'.<br /> stats<br /> STAT pid 481<br /> STAT uptime 16574<br /> STAT time 1213687612<br /> STAT version 1.2.5<br /> STAT pointer_size 32<br /> STAT rusage_user 0.102297<br /> STAT rusage_system 0.214317<br /> STAT curr_items 0<br /> STAT total_items 0<br /> STAT bytes 0<br /> STAT curr_connections 6<br /> STAT total_connections 8<br /> STAT connection_structures 7<br /> STAT cmd_get 0<br /> STAT cmd_set 0<br /> STAT get_hits 0<br /> STAT get_misses 0<br /> STAT evictions 0<br /> STAT bytes_read 20<br /> STAT bytes_written 465<br /> STAT limit_maxbytes 67108864<br /> STAT threads 4<br /> END<br /> quit</pre> <p>另外Q如果安装了libmemcachedq个面向C/C++语言的客L库,׃安装 memstat q个命o? 使用Ҏ很简单,可以用更的步骤获得与telnet相同的信息,q能一ơ性从多台服务器获得信息?/p> <pre>$ memstat --servers=server1,server2,server3,...</pre> <p>libmemcached可以从下面的地址获得Q?/p> <ul style="padding-left: 16px; margin-left: 16px;"> <li><a >http://tangent.org/552/libmemcached.html</a></li> </ul> <h2 id="content_2_6">查看slabs的用状?/h2> <p>使用memcached的创造着Brad写的名ؓmemcached-tool的Perl脚本Q可以方便地获得slab的用情? Q它memcached的返回值整理成Ҏ阅读的格式)。可以从下面的地址获得脚本Q?/p> <ul style="padding-left: 16px; margin-left: 16px;"> <li><a >http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool</a></li> </ul> <p>使用Ҏ也极其简单:</p> <pre>$ memcached-tool L?端口 选项</pre> <p>查看slabs使用状况时无需指定选项Q因此用下面的命令即可:</p> <pre>$ memcached-tool L?端口</pre> <p>获得的信息如下所C:</p> <pre> # Item_Size Max_age 1MB_pages Count Full?<br /> 1 104 B 1394292 s 1215 12249628 yes<br /> 2 136 B 1456795 s 52 400919 yes<br /> 3 176 B 1339587 s 33 196567 yes<br /> 4 224 B 1360926 s 109 510221 yes<br /> 5 280 B 1570071 s 49 183452 yes<br /> 6 352 B 1592051 s 77 229197 yes<br /> 7 440 B 1517732 s 66 157183 yes<br /> 8 552 B 1460821 s 62 117697 yes<br /> 9 696 B 1521917 s 143 215308 yes<br /> 10 872 B 1695035 s 205 246162 yes<br /> 11 1.1 kB 1681650 s 233 221968 yes<br /> 12 1.3 kB 1603363 s 241 183621 yes<br /> 13 1.7 kB 1634218 s 94 57197 yes<br /> 14 2.1 kB 1695038 s 75 36488 yes<br /> 15 2.6 kB 1747075 s 65 25203 yes<br /> 16 3.3 kB 1760661 s 78 24167 yes</pre> <p>各列的含义ؓQ?/p> <div> <table border="0" cellspacing="1"> <tbody> <tr> <td>?/td> <td>含义</td> </tr> <tr> <td>#</td> <td>slab class~号</td> </tr> <tr> <td>Item_Size</td> <td>Chunk大小</td> </tr> <tr> <td>Max_age</td> <td>LRU内最旧的记录的生存时?/td> </tr> <tr> <td>1MB_pages</td> <td>分配lSlab的页?/td> </tr> <tr> <td>Count</td> <td>Slab内的记录?/td> </tr> <tr> <td>Full?</td> <td>Slab内是否含有空闲chunk</td> </tr> </tbody> </table> </div> <p>从这个脚本获得的信息对于调优非常方便Q强烈推荐用?/p> <h2 id="content_2_7">内存存储的ȝ</h2> <p>本次单说明了memcached的缓存机制和调优Ҏ? 希望读者能理解memcached的内存管理原理及其优~点?/p> <p>下次l说明LRU和Expire{原理,以及memcached的最新发展方向—? 可扩充体p(pluggable architecherQ)?/p> </div> <img src ="http://www.tkk7.com/sway/aggbug/234400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sway/" target="_blank">sway</a> 2008-10-15 11:31 <a href="http://www.tkk7.com/sway/articles/234400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcached完全剖析?. memcached的基http://www.tkk7.com/sway/articles/234399.htmlswayswayWed, 15 Oct 2008 03:28:00 GMThttp://www.tkk7.com/sway/articles/234399.htmlhttp://www.tkk7.com/sway/comments/234399.htmlhttp://www.tkk7.com/sway/articles/234399.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234399.htmlhttp://www.tkk7.com/sway/services/trackbacks/234399.htmlmemcached完全剖析–1. memcached的基
作?charlee  来源:idv2.com  旉:2008-09-28  阅读:191 ?nbsp; 原文链接   [收藏]  

译一技术评论社的文章,是讲memcached的连载?a >fcicq同学说这个东西很有用Q希望大家喜Ƣ?/p>

发表日:2008/7/2
作者:镉K雅广(Masahiro Nagano)
原文链接Q?a >http://gihyo.jp/dev/feature/01/memcached/0001

我是mixi株式会社开发部pȝq营l的镉K? 日常负责E序的运营。从今天开始,分几次针对最q在Web应用的可扩展性领? 的热门话题memcachedQ与我公司开发部研究开发组的前坂一P 说明其内部结构和使用?/p>

memcached是什么?

memcached 是以LiveJournal 旗下Danga Interactive 公司?a >Brad Fitzpatric 为首开发的一ƾY件。现在已成ؓ mixi? hatena? Facebook? Vox、LiveJournal{众多服务中 提高Web应用扩展性的重要因素?/p>

许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据ƈ在浏览器中显C? 但随着数据量的增大、访问的集中Q就会出现RDBMS的负担加重、数据库响应恶化? |站昄延迟{重大媄响?/p>

q时pmemcached大显w手了。memcached是高性能的分布式内存~存服务器? 一般的使用目的是,通过~存数据库查询结果,减少数据库访问次敎ͼ以提高动态Web应用的速度? 提高可扩展性?/p>


? 一般情况下memcached的用?/p>

memcached的特?/h2>

memcached作ؓ高速运行的分布式缓存服务器Q具有以下的特点?/p>

  • 协议?/li>
  • Zlibevent的事件处?/li>
  • 内置内存存储方式
  • memcached不互盔R信的分布式

协议?/h3>

memcached的服务器客户端通信q不使用复杂的XML{格式, 而用简单的Z文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。下面是例子?/p>

$ telnet localhost 11211

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

set foo 0 0 3 Q保存命令)

bar Q数据)

STORED Q结果)

get foo Q取得命令)

VALUE foo 0 3 Q数据)

bar Q数据)

协议文档位于memcached的源代码内,也可以参考以下的URL?/p>

Zlibevent的事件处?/h3>

libevent是个E序库,它将Linux的epoll、BSDcL作系l的kqueue{事件处理功? 装成统一的接口。即使对服务器的q接数增加,也能发挥O(1)的性能? memcached使用q个libevent库,因此能在Linux、BSD、Solaris{操作系l上发挥光性能? 关于事g处理q里׃再详l介l,可以参考Dan Kegel的The C10K Problem?/p>

内置内存存储方式

Z提高性能Qmemcached中保存的数据都存储在memcached内置的内存存储空间中? ׃数据仅存在于内存中,因此重启memcached、重启操作系l会D全部数据消失? 另外Q内容容量达到指定g后,基于LRU(Least Recently Used)法自动删除不用的~存? memcached本n是ؓ~存而设计的服务器,因此q没有过多考虑数据的永久性问题? 关于内存存储的详l信息,本连载的W二讲以后前坂会q行介绍Q请届时参考?/p>

memcached不互盔R信的分布式

memcached管?#8220;分布?#8221;~存服务器,但服务器端ƈ没有分布式功能? 各个memcached不会互相通信以共享信息。那么,怎样q行分布式呢Q? q完全取决于客户端的实现。本q蝲也将介绍memcached的分布式?/p>


? memcached的分布式

接下来简单介l一下memcached的用方法?/p>

安装memcached

memcached的安装比较简单,q里E加说明?/p>

memcached支持许多q_?/p>

  • Linux
  • FreeBSD
  • Solaris (memcached 1.2.5以上版本)
  • Mac OS X

另外也能安装在Windows上。这里用Fedora Core 8q行说明?/p>

memcached的安?/h3>

q行memcached需要本文开头介l的libevent库。Fedora 8中有现成的rpm包, 通过yum命o安装卛_?/p>

$ sudo yum install libevent libevent-devel

memcached的源代码可以从memcached|站上下载。本文执W时的最新版本ؓ1.2.5? Fedora 8虽然也包含了memcached的rpmQ但版本比较老。因为源代码安装q不困难Q? q里׃使用rpm了?/p>

  • 下蝲memcachedQ?a >http://www.danga.com/memcached/download.bml

memcached安装与一般应用程序相同,configure、make、make installp了?/p>

$ 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

$ sudo make install

默认情况下memcached安装?usr/local/bin下?/p>

memcached的启?/h3>

从终端输入以下命令,启动memcached?/p>

$ /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)

q里昄了调试信息。这样就在前台启动了memcachedQ监听TCP端口11211 最大内存用量?4M。调试信息的内容大部分是关于存储的信息, 下次q蝲时具体说明?/p>

作ؓdaemon后台启动Ӟ只需

$ /usr/local/bin/memcached -p 11211 -m 64m -d

q里使用的memcached启动选项的内容如下?/p>

选项 说明
-p 使用的TCP端口。默认ؓ11211
-m 最大内存大。默认ؓ64M
-vv 用very vrebose模式启动Q调试信息和错误输出到控制台
-d 作ؓdaemon在后台启?/td>

上面四个是常用的启动选项Q其他还有很多,通过

$ /usr/local/bin/memcached -h

命o可以昄。许多选项可以改变memcached的各U行为, 推荐M诅R?/p>

用客Lq接

许多语言都实Cq接memcached的客LQ其中以Perl、PHPZ? 仅仅memcached|站上列出的语言有

  • Perl
  • PHP
  • Python
  • Ruby
  • C#
  • C/C++
  • Lua

{等?/p>

  • memcached客户端APIQ?a >http://www.danga.com/memcached/apis.bml

q里介绍通过mixi正在使用的Perl库链接memcached的方法?/p>

使用Cache::Memcached

Perl的memcached客户端有

  • Cache::Memcached
  • Cache::Memcached::Fast
  • Cache::Memcached::libmemcached

{几个CPAN模块。这里介l的Cache::Memcached是memcached的作者Brad Fitzpatric的作品, 应该是memcached的客L中应用最为广泛的模块了?/p>

使用Cache::Memcachedq接memcached

下面的源代码为通过Cache::Memcachedq接刚才启动的memcached的例子?/p>

#!/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地址和一个选项Q以生成实例? Cache::Memcached常用的选项如下所C?/p>

选项 说明
servers 用数l指定memcached服务器和端口
compress_threshold 数据压羃时用的?/td>
namespace 指定d到键的前~

另外QCache::Memcached通过Storable模块可以Perl的复杂数据序列化之后再保存, 因此散列、数l、对象等都可以直接保存到memcached中?/p>

保存数据

向memcached保存数据的方法有

  • add
  • replace
  • set

它们的用方法都相同Q?/p>

my $add = $memcached->add( '?, '?, '期限' );

my $replace = $memcached->replace( '?, '?, '期限' );

my $set = $memcached->set( '?, '?, '期限' );

向memcached保存数据时可以指定期?U?。不指定期限Ӟmemcached按照LRU法保存数据? q三个方法的区别如下Q?/p>

选项 说明
add 仅当存储I间中不存在键相同的数据时才保存
replace 仅当存储I间中存在键相同的数据时才保?/td>
set 与add和replace不同Q无Z旉保存

获取数据

获取数据可以使用get和get_multiҎ?/p>

my $val = $memcached->get('?);

my $val = $memcached->get_multi('?', '?', '?', '?', '?');

一ơ取得多条数据时使用get_multi。get_multi可以非同步地同时取得多个键| 光度要比循环调用get快数十倍?/p>

删除数据

删除数据使用deleteҎQ不q它有个独特的功能?/p>

$memcached->delete('?, 'd旉(U?');

删除W一个参数指定的键的数据。第二个参数指定一个时间|可以止使用同样的键保存新数据? 此功能可以用于防止缓存数据的不完整。但是要注意Q?strong>set函数忽视该阻塞,照常保存数据

增一和减一操作

可以memcached上特定的键g数器使用?/p>

my $ret = $memcached->incr('?);

$memcached->add('?, 0) unless defined $ret;

增一和减一是原子操作,但未讄初始值时Q不会自动赋?。因此, 应当q行错误查,必要时加入初始化操作。而且Q服务器端也不会? 过2<sup>32</sup>时的行ؓq行查?/p>

ȝ

q次单介l了memcachedQ以及它的安装方法、Perl客户端Cache::Memcached的用法? 只要知道Qmemcached的用方法十分简单就_了?/p>

下次由前坂来说明memcached的内部结构。了解memcached的内部构造, p知道如何使用memcached才能使Web应用的速度更上一层楼? Ƣ迎l箋阅读下一章?/p>



sway 2008-10-15 11:28 发表评论
]]>
Memcached深度分析http://www.tkk7.com/sway/articles/234360.htmlswayswayWed, 15 Oct 2008 01:31:00 GMThttp://www.tkk7.com/sway/articles/234360.htmlhttp://www.tkk7.com/sway/comments/234360.htmlhttp://www.tkk7.com/sway/articles/234360.html#Feedback0http://www.tkk7.com/sway/comments/commentRss/234360.htmlhttp://www.tkk7.com/sway/services/trackbacks/234360.html阅读全文

sway 2008-10-15 09:31 发表评论
]]>
վ֩ģ壺 ѸƵ| 99Ƶ| 2020Ʒۺ| ձ޳ɸһ| ݹѾþþ| ۺϾþþþþĻ޹ۺһ | һ91| ۺһʵ| ѹԺ߹ۿ| ѹۿ.WWW| 88avѹۿ| ȫƵ߹ۿѸ| ˾ҹƵѹ| Ļ˵| þۺɫһ| ˳ɫ777777߹ۿ| AVһþ| ձĻ| Ƶ| ߹ۿav| aëƬȫƵ| Ʒһ | ޳ѹۿ| 91Ƶѹۿ| eeussӰԺ| һ˿wwwƵ| ˳վ߹ۿ | va˳Ƶվȫ| ɬɬɬƵ߹ۿ| ˻18س˻18Ƶ | av뾫ƷϼӰӰԺ| 91鶹ƷԲ߹ۿ | ۺϾþþƷ| ձһ| ŮѹۿƬ| պһ| ҹƵվ| ĻӰѹۿַ| ޳˹Ʒ| պAVĻ| ҹ侫Ʒպ|