??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲男人天堂av,av资源网在线观看,久久国产精品久久国产精品http://www.aygfsteel.com/syniii/category/47375.htmlzh-cnThu, 07 Apr 2011 04:50:40 GMTThu, 07 Apr 2011 04:50:40 GMT60[转]Consistent Hashing - memcached分布式原?/title><link>http://www.aygfsteel.com/syniii/articles/340783.html</link><dc:creator>杨罗|?/dc:creator><author>杨罗|?/author><pubDate>Wed, 15 Dec 2010 05:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/syniii/articles/340783.html</guid><wfw:comment>http://www.aygfsteel.com/syniii/comments/340783.html</wfw:comment><comments>http://www.aygfsteel.com/syniii/articles/340783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/syniii/comments/commentRss/340783.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/syniii/services/trackbacks/340783.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 21px; font-family: verdana, sans-serif; font-size: 14px" class="Apple-style-span"> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">下面q篇文章写的非常好,l合memcached?特点利用Consistent hasning 法Q可以打造一个非常完备的分布式缓存服务器?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="contents"></p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >memcached的分布式</a> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list2"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >memcached的分布式是什么意思?</a></li> </ul> </li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached的分布式Ҏ</a> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list2"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Ҏ余数计算分散</a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Ҏ余数计算分散的缺?/a></li> </ul> </li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Consistent Hashing</a> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list2"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Consistent Hashing的简单说?/a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >支持Consistent Hashing的函数库</a></li> </ul> </li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >ȝ</a></li> </ul> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">memcached的分布式</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">正如W?ơ中介绍的那P memcached虽然UCؓ“分布?#8221;~存服务器,但服务器端ƈ没有“分布?#8221;功能?服务器端仅包?W?ơ?W??前坂介绍的内存存储功能,其实现非常简单?至于memcached的分布式Q则是完全由客户端程序库实现的?q种分布式是memcached的最大特炏V?/p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">memcached的分布式是什么意思?</h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">q里多次使用?#8220;分布?#8221;q个词,但ƈ未做详细解释?现在开始简单地介绍一下其原理Q各个客L的实现基本相同?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">下面假设memcached服务器有node1~node3三台Q?应用E序要保存键名ؓ“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-01.png" alt="memcached-0004-01.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-01.png" width="441" height="405" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? 分布式简介:准备</p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">首先向memcached中添?#8220;tokyo”。将“tokyo”传给客户端程序库后, 客户端实现的法׃Ҏ“?#8221;来决定保存数据的memcached服务器?服务器选定后,卛_令它保存“tokyo”及其倹{?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-02.png" alt="memcached-0004-02.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-02.png" width="445" height="454" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? 分布式简介:d?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">同样Q?#8220;kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">接下来获取保存的数据。获取时也要要获取的键“tokyo”传递给函数库?函数库通过与数据保存时相同的算法,Ҏ“?#8221;选择服务器?使用的算法相同,p选中与保存时相同的服务器Q然后发送get命o?只要数据没有因ؓ某些原因被删除,p获得保存的倹{?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-03.png" alt="memcached-0004-03.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-03.png" width="449" height="457" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? 分布式简介:获取?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">q样Q将不同的键保存C同的服务器上Q就实现了memcached的分布式?memcached服务器增多后Q键׃分散Q即使一台memcached服务器发生故?无法q接Q也不会影响其他的缓存,pȝ依然能l运行?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">接下来介l?a style="color: rgb(51,102,153); text-decoration: none" >W??/a><span id="wmqeeuq" class="Apple-converted-space"> </span>中提到的Perl客户端函数库Cache::Memcached实现的分布式Ҏ?/p> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Cache::Memcached的分布式Ҏ</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Perl的memcached客户端函数库Cache::Memcached?memcached的作者Brad Fitzpatrick的作品,可以说是原装的函数库了?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached - search.cpan.org</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">该函数库实现了分布式功能Q是memcached标准的分布式Ҏ?/p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Ҏ余数计算分散</h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Cache::Memcached的分布式Ҏ单来_是“Ҏ服务器台数的余数q行分散”?求得键的整数哈希|再除以服务器台数Q根据其余数来选择服务器?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">下面Cache::Memcached化成以下的Perl脚本来进行说明?/p> <div id="wmqeeuq" class="hl-surround"> <div id="wmqeeuq" class="hl-main"><span style="color: navy">use strict</span><span style="color: gray">;<br /> </span><span style="color: navy">use warnings</span><span style="color: gray">;<br /> </span><span style="color: navy">use String::CRC32</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@nodes</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">node1</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">node2</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">node3</span><span style="color: rgb(139,0,0)">'</span><span style="color: olive">)</span><span style="color: gray">;<br /> </span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@keys</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">tokyo</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">kanagawa</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">chiba</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">saitama</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">gunma</span><span style="color: rgb(139,0,0)">'</span><span style="color: olive">)</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">foreach</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(0,0,139)">@keys</span><span style="color: olive">)</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">{</span><span style="color: gray"><br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$crc</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">crc32</span><span style="color: olive">(</span><span style="color: rgb(0,0,139)">$key</span><span style="color: olive">)</span><span style="color: gray">;<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(255,165,0)"># CRC?/span><span style="color: gray"><br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$crc</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>%<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$#nodes</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>+<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: maroon">1</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray">;<br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">[</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">]</span><span style="color: gray">;<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(255,165,0)"># Ҏ余数选择服务?/span><span style="color: gray"><br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">printf</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">"</span><span style="color: red">%s =&gt; %s</span><span style="color: navy">\n</span><span style="color: rgb(139,0,0)">"</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray">;<br /> </span><span style="color: olive">}</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Cache::Memcached在求哈希值时使用了CRC?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >String::CRC32 - search.cpan.org</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">首先求得字符串的CRC|Ҏ该值除以服务器节点数目得到的余数决定服务器?上面的代码执行后输入以下l果Q?/p> <pre>tokyo => node2<br /> kanagawa => node3<br /> chiba => node2<br /> saitama => node1<br /> gunma => node1</pre> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Ҏ该结果,“tokyo”分散到node2Q?#8220;kanagawa”分散到node3{?多说一句,当选择的服务器无法q接ӞCache::Memcached会将q接ơ数 d到键之后Q再ơ计哈希值ƈ试q接。这个动作称为rehash?不希望rehash时可以在生成Cache::Memcached对象时指?#8220;rehash => 0”选项?/p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Ҏ余数计算分散的缺?/h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">余数计算的方法简单,数据的分散性也相当优秀Q但也有其缺炏V?那就是当d或移除服务器Ӟ~存重组的代L当巨大?d服务器后Q余数就会生巨变,q样无法获取与保存时相同的服务器, 从而媄响缓存的命中率。用Perl写段代码来验证其代h?/p> <div id="wmqeeuq" class="hl-surround"> <div id="wmqeeuq" class="hl-main"><span style="color: navy">use strict</span><span style="color: gray">;<br /> </span><span style="color: navy">use warnings</span><span style="color: gray">;<br /> </span><span style="color: navy">use String::CRC32</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@nodes</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@ARGV</span><span style="color: gray">;<br /> </span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@keys</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">a</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">..</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">z</span><span style="color: rgb(139,0,0)">'</span><span style="color: olive">)</span><span style="color: gray">;<br /> </span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">%nodes</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">foreach</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@keys</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">{</span><span style="color: gray"><br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$hash</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">crc32</span><span style="color: olive">(</span><span style="color: rgb(0,0,139)">$key</span><span style="color: olive">)</span><span style="color: gray">;<br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$hash</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>%<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$#nodes</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>+<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: maroon">1</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray">;<br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>=<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">[</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">]</span><span style="color: gray">;<br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">push</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span>@</span><span style="color: olive">{</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">{</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">}</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">}</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray">;<br /> </span><span style="color: olive">}</span><span style="color: gray"><br /> <br /> </span><span style="color: green">foreach</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$node</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">sort</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">keys</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">%nodes</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">{</span><span style="color: gray"><br />   <span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">printf</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">"</span><span style="color: red">%s: %s</span><span style="color: navy">\n</span><span style="color: rgb(139,0,0)">"</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$node</span><span style="color: gray">,<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: green">join</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">"</span><span style="color: red">,</span><span style="color: rgb(139,0,0)">"</span><span style="color: gray">, @</span><span style="color: olive">{</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">{</span><span style="color: rgb(0,0,139)">$node</span><span style="color: olive">}</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: olive">}</span><span style="color: gray">;<br /> </span><span style="color: olive">}</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">q段Perl脚本演示了将“a”?#8220;z”的键保存到memcachedq访问的情况?其保存为mod.plq执行?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">首先Q当服务器只有三台时Q?/p> <div id="wmqeeuq" class="hl-surround"> <div id="wmqeeuq" class="hl-main"><span style="color: gray">$<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">mod</span><span style="color: gray">.</span><span style="color: blue">pl</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">node1</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">node2</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">nod3</span><span style="color: gray"><br /> </span><span style="color: blue">node1</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">a</span><span style="color: gray">,</span><span style="color: blue">c</span><span style="color: gray">,</span><span style="color: blue">d</span><span style="color: gray">,</span><span style="color: blue">e</span><span style="color: gray">,</span><span style="color: blue">h</span><span style="color: gray">,</span><span style="color: blue">j</span><span style="color: gray">,</span><span style="color: blue">n</span><span style="color: gray">,</span><span style="color: blue">u</span><span style="color: gray">,</span><span style="color: blue">w</span><span style="color: gray">,</span><span style="color: blue">x</span><span style="color: gray"><br /> </span><span style="color: blue">node2</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">g</span><span style="color: gray">,</span><span style="color: blue">i</span><span style="color: gray">,</span><span style="color: blue">k</span><span style="color: gray">,</span><span style="color: blue">l</span><span style="color: gray">,</span><span style="color: blue">p</span><span style="color: gray">,</span><span style="color: blue">r</span><span style="color: gray">,</span><span style="color: blue">s</span><span style="color: gray">,</span><span style="color: green">y</span><span style="color: gray"><br /> </span><span style="color: blue">node3</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">b</span><span style="color: gray">,</span><span style="color: blue">f</span><span style="color: gray">,</span><span style="color: blue">m</span><span style="color: gray">,</span><span style="color: blue">o</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">q,</span><span style="color: red">t</span><span style="color: rgb(139,0,0)">,</span><span style="color: blue">v</span><span style="color: gray">,</span><span style="color: blue">z</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">l果如上Qnode1保存a、c、d、e……Qnode2保存g、i、k……Q?每台服务器都保存?个到10个数据?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">接下来增加一台memcached服务器?/p> <div id="wmqeeuq" class="hl-surround"> <div id="wmqeeuq" class="hl-main"><span style="color: gray">$<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">mod</span><span style="color: gray">.</span><span style="color: blue">pl</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">node1</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">node2</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">node3</span><span style="color: gray"><span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">node4</span><span style="color: gray"><br /> </span><span style="color: blue">node1</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">d</span><span style="color: gray">,</span><span style="color: blue">f</span><span style="color: gray">,</span><span style="color: blue">m</span><span style="color: gray">,</span><span style="color: blue">o</span><span style="color: gray">,</span><span style="color: blue">t</span><span style="color: gray">,</span><span style="color: blue">v</span><span style="color: gray"><br /> </span><span style="color: blue">node2</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">b</span><span style="color: gray">,</span><span style="color: blue">i</span><span style="color: gray">,</span><span style="color: blue">k</span><span style="color: gray">,</span><span style="color: blue">p</span><span style="color: gray">,</span><span style="color: blue">r</span><span style="color: gray">,</span><span style="color: green">y</span><span style="color: gray"><br /> </span><span style="color: blue">node3</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">e</span><span style="color: gray">,</span><span style="color: blue">g</span><span style="color: gray">,</span><span style="color: blue">l</span><span style="color: gray">,</span><span style="color: blue">n</span><span style="color: gray">,</span><span style="color: blue">u</span><span style="color: gray">,</span><span style="color: blue">w</span><span style="color: gray"><br /> </span><span style="color: blue">node4</span><span style="color: gray">:<span id="wmqeeuq" class="Apple-converted-space"> </span></span><span style="color: blue">a</span><span style="color: gray">,</span><span style="color: blue">c</span><span style="color: gray">,</span><span style="color: blue">h</span><span style="color: gray">,</span><span style="color: blue">j</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">q,</span><span style="color: red">s</span><span style="color: rgb(139,0,0)">,</span><span style="color: blue">x</span><span style="color: gray">,</span><span style="color: blue">z</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">d了node4。可见,只有d、i、k、p、r、y命中了。像q样Q添加节点后 键分散到的服务器会发生巨大变化?6个键中只有六个在讉K原来的服务器Q?其他的全都移C其他服务器。命中率降低?3%。在Web应用E序中用memcachedӞ 在添加memcached服务器的瞬间~存效率会大q度下降Q负载会集中到数据库服务器上Q?有可能会发生无法提供正常服务的情c?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">mixi的Web应用E序q用中也有这个问题,D无法dmemcached服务器?但由于用了新的分布式方法,现在可以轻而易丑֜dmemcached服务器了?q种分布式方法称?Consistent Hashing?/p> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Consistent Hashing</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">关于Consistent Hashing的思想Qmixi株式会社的开发blog{许多地斚w介绍q, q里只简单地说明一下?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >mixi Engineers’ Blog - わVヹ{な分散で快適キャッシュライフ</a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >ConsistentHashing - ゟ냳゗テン?ハッ゗?/a></li> </ul> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Consistent Hashing的简单说?/h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Consistent Hashing如下所C:首先求出memcached服务器(节点Q的哈希| q将光|到0?<sup>32</sup>的圆QcontinuumQ上?然后用同LҎ求出存储数据的键的哈希|q映到圆上?然后从数据映到的位|开始顺旉查找Q将数据保存到找到的W一个服务器上?如果过2<sup>32</sup>仍然找不到服务器Q就会保存到W一台memcached服务器上?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-04.png" alt="memcached-0004-04.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-04.png" width="521" height="409" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? Consistent HashingQ基本原?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">从上囄状态中d一台memcached服务器。余数分布式法׃保存键的服务器会发生巨大变化 而媄响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地炚w时针方向的 W一台服务器上的键会受到影响?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-05.png" alt="memcached-0004-05.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-05.png" width="518" height="439" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? Consistent HashingQ添加服务器</p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">因此QConsistent Hashing最大限度地抑制了键的重新分布?而且Q有的Consistent Hashing的实现方法还采用了虚拟节点的思想?使用一般的hash函数的话Q服务器的映地点的分布非常不均匀?因此Q用虚拟节点的思想Qؓ每个物理节点Q服务器Q?在continuum上分?00?00个点。这样就能抑制分布不均匀Q?最大限度地减小服务器增减时的缓存重新分布?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">通过下文中介l的使用Consistent Hashing法的memcached客户端函数库q行试的结果是Q?由服务器台数QnQ和增加的服务器台数QmQ计增加服务器后的命中率计公式如下:</p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">(1 - n/(n+m)) * 100</p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">支持Consistent Hashing的函数库</h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">本连载中多次介绍的Cache::Memcached虽然不支持Consistent HashingQ?但已有几个客L函数库支持了q种新的分布式算法?W一个支持Consistent Hashing和虚拟节点的memcached客户端函数库?名ؓlibketama的PHP库,由last.fm开发?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >libketama - a consistent hashing algo for memcache clients – RJ ブロ?- Users at Last.fm</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">至于Perl客户端,q蝲的第1?中介l过的Cache::Memcached::Fast和Cache::Memcached::libmemcached支持 Consistent Hashing?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached::Fast - search.cpan.org</a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached::libmemcached - search.cpan.org</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">两者的接口都与Cache::Memcached几乎相同Q如果正在用Cache::MemcachedQ?那么可以方便地替换q来。Cache::Memcached::Fast重新实现了libketamaQ?使用Consistent Hashing创徏对象时可以指定ketama_points选项?/p> <pre>my $memcached = Cache::Memcached::Fast->new({<br /> servers => ["192.168.0.1:11211","192.168.0.2:11211"],<br /> ketama_points => 150<br /> });</pre> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">另外QCache::Memcached::libmemcached 是一个用了Brain Aker开发的C函数库libmemcached的Perl模块?libmemcached本n支持几种分布式算法,也支持Consistent HashingQ?其Perll定也支持Consistent Hashing?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Tangent Software: libmemcached</a></li> </ul> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">ȝ</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">本次介绍了memcached的分布式法Q主要有memcached的分布式是由客户端函数库实现Q?以及高效率地分散数据的Consistent Hashing法。下ơ将介绍mixi在memcached应用斚w的一些经验, 和相关的兼容应用E序?/p> </span></span> <img src ="http://www.aygfsteel.com/syniii/aggbug/340783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/syniii/" target="_blank">杨罗|?/a> 2010-12-15 13:35 <a href="http://www.aygfsteel.com/syniii/articles/340783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">³ľ</a>| <a href="http://" target="_blank">Т</a>| <a href="http://" target="_blank">׶</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">ʯɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͺ</a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">®</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޵</a>| <a href="http://" target="_blank">ƽȪ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ҿ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>