memcachedを知り尽くす

第4回memcachedの分散アルゴリズム


23memcachedmemcached

memcached


1memcached23memcachedmemcached

memcached




memcachednode1node3tokyokanagawachibasaitamagunma
1 
図1 分散概要:準備
tokyomemcachedaddtokyomemcachedtokyo
2 
図2 分散概要:追加時
kanagawachinasaitamagunma

tokyo使get
3 
図3 分散概要:取得時
memcachedmemcachedmemcached1

1PerlCache::Memcached

Cache::Memcached


PerlmemcachedCache::MemcachedmemcachedBrad Fitzpatrick


Cache::Memcached - search.cpan.org


memcached


Cache::MemcachedCache::MemcachedPerl
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::MemcachedCRC


String::CRC32 - search.cpan.org


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

tokyonode2kanagawanode3Cache::MemcachedrehashrehashCache::Memcachedrehash=>0


memcachedPerl
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} };
}

Perlazmemcachedmod.pl

3
$ 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

node1a, c, d, e...node2g, i, k...1810

memcached1
$ 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

node426623%Webmemcachedmemcached

mixiWebmemcachedmemcachedConsistent Hashing

Consistent Hashing


Consistet Hashing


mixi Engineers' Blog >> 

ConsistentHashing - 

Consiste Hashing


Consistent Hasingmemcached0232continuum232memcached
4 Consistent Hashing
図4 Consistent Hashing:基本
memcached1Consistent-Hashingcontinuum
5 Consistent Hashing
図5 Consistent Hashing:サーバ追加
Consistent HashingConsistent Hasinghash1100200continuum

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

Consistent Hashing


Cache::MemcachedConsistent HashingConsistet HashingmemcachedlibketamaPHPlast.fm


libketama - a consistent hashing algo for memcache clients  RJ  - Users at Last.fm


Perl1Cache::Memcached::FastCache::Memcached::libmemcachedConsistent Hashing


Cache::Memcached::Fast - search.cpan.org

Cache::Memcached::libmemcached - search.cpan.org


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

Cache::Memcached::libmemcachedBrian AkerClibmemcachedPerllibmemcachedConsistent HashingPerlConsistent Hashing


Tangent Software: libmemcached


memcachedmemcachedConsistent Hashingmiximemcached
 

おすすめ記事

記事・ニュース一覧