青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

memcached的分布式算法-Consistent Hashing

前言:

我們知道以往資料要放到 M 臺服務器上,最簡單的方法就是取余數 (hash_value % M) 然后放到對應的服務器上,那就是當添加或移除服務器時,緩存重組的代價相當巨大。 添加服務器后,余數就會產生巨變,這樣就無法獲取與保存時相同的服務器, 從而影響緩存的命中率。

下面這篇文章寫的非常好,結合memcached的 特點利用Consistent hasning 算法,可以打造一個非常完備的分布式緩存服務器。

我是Mixi的長野。 本次不再介紹memcached的內部結構, 開始介紹memcached的分布式。

 

memcached的分布式

正如第1次中介紹的那樣, memcached雖然稱為“分布式”緩存服務器,但服務器端并沒有“分布式”功能。 服務器端僅包括 第2次、 第3次 前坂介紹的內存存儲功能,其實現非常簡單。 至于memcached的分布式,則是完全由客戶端程序庫實現的。 這種分布式是memcached的最大特點。

memcached的分布式是什么意思?

這里多次使用了“分布式”這個詞,但并未做詳細解釋。 現在開始簡單地介紹一下其原理,各個客戶端的實現基本相同。

下面假設memcached服務器有node1~node3三臺, 應用程序要保存鍵名為“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的數據。

memcached-0004-01.png

圖1 分布式簡介:準備

首先向memcached中添加“tokyo”。將“tokyo”傳給客戶端程序庫后, 客戶端實現的算法就會根據“鍵”來決定保存數據的memcached服務器。 服務器選定后,即命令它保存“tokyo”及其值。

memcached-0004-02.png

圖2 分布式簡介:添加時

同樣,“kanagawa”“chiba”“saitama”“gunma”都是先選擇服務器再保存。

接下來獲取保存的數據。獲取時也要將要獲取的鍵“tokyo”傳遞給函數庫。 函數庫通過與數據保存時相同的算法,根據“鍵”選擇服務器。 使用的算法相同,就能選中與保存時相同的服務器,然后發送get命令。 只要數據沒有因為某些原因被刪除,就能獲得保存的值。

memcached-0004-03.png

圖3 分布式簡介:獲取時

這樣,將不同的鍵保存到不同的服務器上,就實現了memcached的分布式。 memcached服務器增多后,鍵就會分散,即使一臺memcached服務器發生故障 無法連接,也不會影響其他的緩存,系統依然能繼續運行。

接下來介紹第1次 中提到的Perl客戶端函數庫Cache::Memcached實現的分布式方法。

Cache::Memcached的分布式方法

Perl的memcached客戶端函數庫Cache::Memcached是 memcached的作者Brad Fitzpatrick的作品,可以說是原裝的函數庫了。

該函數庫實現了分布式功能,是memcached標準的分布式方法。

根據余數計算分散

Cache::Memcached的分布式方法簡單來說,就是“根據服務器臺數的余數進行分散”。 求得鍵的整數哈希值,再除以服務器臺數,根據其余數來選擇服務器。

下面將Cache::Memcached簡化成以下的Perl腳本來進行說明。

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値
my $mod = $crc % ( $#nodes + 1 );
my $server = $nodes[ $mod ]; # 根據余數選擇服務器
printf “%s => %s\n”, $key, $server;
}
Cache::Memcached在求哈希值時使用了CRC。

首先求得字符串的CRC值,根據該值除以服務器節點數目得到的余數決定服務器。 上面的代碼執行后輸入以下結果:

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

根據該結果,“tokyo”分散到node2,“kanagawa”分散到node3等。 多說一句,當選擇的服務器無法連接時,Cache::Memcached會將連接次數 添加到鍵之后,再次計算哈希值并嘗試連接。這個動作稱為rehash。 不希望rehash時可以在生成Cache::Memcached對象時指定“rehash => 0”選項。

根據余數計算分散的缺點

余數計算的方法簡單,數據的分散性也相當優秀,但也有其缺點。 那就是當添加或移除服務器時,緩存重組的代價相當巨大。 添加服務器后,余數就會產生巨變,這樣就無法獲取與保存時相同的服務器, 從而影響緩存的命中率。用Perl寫段代碼來驗證其代價。

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} };
}
這段Perl腳本演示了將“a”到“z”的鍵保存到memcached并訪問的情況。 將其保存為mod.pl并執行。

首先,當服務器只有三臺時:

$ 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

結果如上,node1保存a、c、d、e……,node2保存g、i、k……, 每臺服務器都保存了8個到10個數據。

接下來增加一臺memcached服務器。

$ 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

添加了node4??梢?,只有d、i、k、p、r、y命中了。像這樣,添加節點后 鍵分散到的服務器會發生巨大變化。26個鍵中只有六個在訪問原來的服務器, 其他的全都移到了其他服務器。命中率降低到23%。在Web應用程序中使用memcached時, 在添加memcached服務器的瞬間緩存效率會大幅度下降,負載會集中到數據庫服務器上, 有可能會發生無法提供正常服務的情況。

mixi的Web應用程序運用中也有這個問題,導致無法添加memcached服務器。 但由于使用了新的分布式方法,現在可以輕而易舉地添加memcached服務器了。 這種分布式方法稱為 Consistent Hashing。

Consistent Hashing

關于Consistent Hashing的思想,mixi株式會社的開發blog等許多地方都介紹過, 這里只簡單地說明一下。

Consistent Hashing的簡單說明

Consistent Hashing如下所示:首先求出memcached服務器(節點)的哈希值, 并將其配置到0~232的圓(continuum)上。 然后用同樣的方法求出存儲數據的鍵的哈希值,并映射到圓上。 然后從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。 如果超過232仍然找不到服務器,就會保存到第一臺memcached服務器上。

memcached-0004-04.png

圖4 Consistent Hashing:基本原理

從上圖的狀態中添加一臺memcached服務器。余數分布式算法由于保存鍵的服務器會發生巨大變化 而影響緩存的命中率,但Consistent Hashing中,只有在continuum上增加服務器的地點逆時針方向的 第一臺服務器上的鍵會受到影響。

memcached-0004-05.png

圖5 Consistent Hashing:添加服務器

因此,Consistent Hashing最大限度地抑制了鍵的重新分布。 而且,有的Consistent Hashing的實現方法還采用了虛擬節點的思想。 使用一般的hash函數的話,服務器的映射地點的分布非常不均勻。 因此,使用虛擬節點的思想,為每個物理節點(服務器) 在continuum上分配100~200個點。這樣就能抑制分布不均勻, 最大限度地減小服務器增減時的緩存重新分布。

通過下文中介紹的使用Consistent Hashing算法的memcached客戶端函數庫進行測試的結果是, 由服務器臺數(n)和增加的服務器臺數(m)計算增加服務器后的命中率計算公式如下:

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

支持Consistent Hashing的函數庫

本連載中多次介紹的Cache::Memcached雖然不支持Consistent Hashing, 但已有幾個客戶端函數庫支持了這種新的分布式算法。 第一個支持Consistent Hashing和虛擬節點的memcached客戶端函數庫是 名為libketama的PHP庫,由last.fm開發。

至于Perl客戶端,連載的第1次 中介紹過的Cache::Memcached::Fast和Cache::Memcached::libmemcached支持 Consistent Hashing。

兩者的接口都與Cache::Memcached幾乎相同,如果正在使用Cache::Memcached, 那么就可以方便地替換過來。Cache::Memcached::Fast重新實現了libketama, 使用Consistent Hashing創建對象時可以指定ketama_points選項。

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

另外,Cache::Memcached::libmemcached 是一個使用了Brain Aker開發的C函數庫libmemcached的Perl模塊。 libmemcached本身支持幾種分布式算法,也支持Consistent Hashing, 其Perl綁定也支持Consistent Hashing。

總結

本次介紹了memcached的分布式算法,主要有memcached的分布式是由客戶端函數庫實現, 以及高效率地分散數據的Consistent Hashing算法。下次將介紹mixi在memcached應用方面的一些經驗, 和相關的兼容應用程序。

posted on 2009-09-16 10:50 楊粼波 閱讀(1009) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区免费在线观看| 亚洲欧美精品在线| 欧美精品国产| 免费在线日韩av| 久热精品视频| 欧美精品乱码久久久久久按摩| 麻豆精品一区二区av白丝在线| 久久偷看各类wc女厕嘘嘘偷窃| 久久天堂av综合合色| 欧美福利一区| 国产精品黄色| 国内精品久久久久久| 亚洲福利精品| 亚洲午夜久久久久久久久电影院| 亚洲男人的天堂在线aⅴ视频| 欧美一区二区三区日韩| 久热国产精品视频| 亚洲精品国产精品国自产在线| 亚洲国产欧美另类丝袜| 在线综合亚洲| 亚洲国产成人91精品| 久久久久久成人| 亚洲国产高清在线| 亚洲欧美一区在线| 欧美成人一区二免费视频软件| 欧美日韩精品综合| 精久久久久久久久久久| 一二三区精品福利视频| 久久欧美中文字幕| 一区二区免费看| 久久亚洲一区二区三区四区| 欧美日韩国产一区二区三区| 国外精品视频| 亚洲男人第一av网站| 亚洲成人在线网| 鲁大师成人一区二区三区 | 亚洲深夜激情| 亚洲综合二区| 蜜桃av噜噜一区二区三区| 亚洲美女免费精品视频在线观看| 午夜精品短视频| 欧美日韩高清在线观看| 亚洲成人自拍视频| 欧美一区二区三区视频在线| 亚洲国产精品女人久久久| 欧美在线观看网站| 国产精品一区二区视频| 一区二区欧美国产| 亚洲缚视频在线观看| 久久久91精品国产| 国产午夜精品一区二区三区欧美 | 日韩视频在线观看国产| 老鸭窝毛片一区二区三区| 国产亚洲a∨片在线观看| 亚洲免费中文字幕| 在线亚洲免费| 欧美日韩国产在线播放网站| 最新亚洲一区| 亚洲国产经典视频| 久热精品视频在线观看| 亚洲国产精品免费| 欧美成人嫩草网站| 久久影院午夜论| 亚洲第一福利视频| 欧美成人综合| 欧美粗暴jizz性欧美20| 日韩午夜激情| 日韩一级精品视频在线观看| 欧美日韩一区二区视频在线| 亚洲欧美不卡| 亚洲欧美日韩精品综合在线观看| 国产精品亚洲一区| 国产精品www994| 宅男噜噜噜66一区二区66| 亚洲巨乳在线| 国产精品久久久久久久电影| 欧美一级夜夜爽| 久久狠狠久久综合桃花| 在线观看亚洲专区| 亚洲国产高清在线| 欧美系列一区| 久久亚洲美女| 欧美看片网站| 欧美一区永久视频免费观看| 欧美一区二区三区免费看| 永久久久久久| 99热免费精品在线观看| 国产日韩精品久久| 欧美国产第二页| 欧美日韩亚洲另类| 久久成人这里只有精品| 久久精品人人做人人爽| 亚洲久久成人| 亚洲宅男天堂在线观看无病毒| 国产在线不卡视频| 欧美激情精品久久久久久久变态| 欧美国产视频在线观看| 性欧美xxxx大乳国产app| 久久亚洲精选| 亚洲欧美国产日韩中文字幕| 久久久久一区二区三区| 亚洲素人一区二区| 久久久久久久综合日本| 这里只有精品电影| 久热精品视频| 久久精品女人| 欧美午夜电影在线观看| 蜜臀久久99精品久久久久久9| 欧美日韩国产一中文字不卡| 久久深夜福利免费观看| 欧美日韩高清免费| 亚洲第一黄色| 国内成+人亚洲| 亚洲久久一区| 日韩视频在线免费| 久久久精品2019中文字幕神马| 亚洲一区三区在线观看| 欧美不卡在线| 免费视频一区二区三区在线观看| 国产精品乱码一区二区三区| 亚洲电影视频在线| 韩日成人av| 亚洲女爱视频在线| 亚洲亚洲精品在线观看| 欧美国产在线电影| 欧美国产视频日韩| 精品999网站| 午夜精品一区二区三区四区| 亚洲一区久久久| 欧美日韩一区自拍| 亚洲精品综合精品自拍| 亚洲精品国偷自产在线99热| 久久全球大尺度高清视频| 久久久久中文| 黄色亚洲精品| 久久久国产一区二区三区| 久久久久五月天| 国产在线精品成人一区二区三区| 亚洲欧美影院| 亚洲电影第三页| 久久久久五月天| 欧美国产精品专区| 最近看过的日韩成人| 欧美成人免费在线| 亚洲人成欧美中文字幕| 99re6这里只有精品| 欧美日韩免费在线视频| 日韩一区二区精品| 亚洲欧美国产77777| 国产欧美在线观看一区| 欧美一区二区高清| 免费亚洲婷婷| 日韩视频在线播放| 欧美日韩亚洲一区| 一本色道久久精品| 欧美一区二区三区四区夜夜大片 | 亚洲香蕉视频| 国产精品乱码久久久久久| 午夜精品久久久久久久99水蜜桃| 久久久www| 亚洲激情电影中文字幕| 欧美激情精品久久久久久大尺度 | 久热国产精品| 日韩视频在线一区二区三区| 亚洲图片欧美午夜| 国产欧美日韩麻豆91| 久久精品一区二区| 最新国产の精品合集bt伙计| 亚洲综合三区| 亚洲福利国产精品| 欧美视频一区二区三区…| 欧美一区二区视频在线| 欧美激情精品久久久久久免费印度| 夜夜嗨一区二区| 国产一区二区三区黄视频| 欧美高清不卡| 欧美亚洲视频一区二区| 91久久线看在观草草青青| 欧美一区=区| 亚洲另类一区二区| 国内精品久久久久影院 日本资源| 欧美福利精品| 久久er精品视频| 妖精成人www高清在线观看| 久久综合一区| 欧美一区二区三区日韩| 亚洲色在线视频| 亚洲国产天堂久久综合| 国产日韩欧美a| 欧美日韩亚洲91| 美国十次成人| 欧美在线资源| 亚洲午夜电影网| 亚洲精品国精品久久99热| 久久久精品性| 欧美尤物巨大精品爽| 妖精成人www高清在线观看| 在线精品国精品国产尤物884a| 国产精品午夜在线| 欧美三级中文字幕在线观看|