Write/Write Conflictについての蛇足
前述の通り,
ここで述べる事は,
では,
何らかの理由によりクラスタが分裂している際に,
まず始めに,
リスト4 kai_
[{kai, [
{rpc_port, 11011},
{rpc_max_processes, 30},
{memcache_port, 11211},
{memcache_max_processes, 10},
{max_connections, 32},
{n, 3},
{r, 3},
{w, 1},
{number_of_buckets, 1024},
{number_of_virtual_nodes, 128},
{store, ets},
]}].
リスト5 kai_
[{kai, [
{rpc_port, 11012},
{rpc_max_processes, 30},
{memcache_port, 11212},
{memcache_max_processes, 10},
{max_connections, 32},
{n, 3},
{r, 3},
{w, 1},
{number_of_buckets, 1024},
{number_of_virtual_nodes, 128},
{store, ets},
]}].
リスト6 kai_
[{kai, [
{rpc_port, 11013},
{rpc_max_processes, 30},
{memcache_port, 11213},
{memcache_max_processes, 10},
{max_connections, 32},
{n, 3},
{r, 3},
{w, 1},
{number_of_buckets, 1024},
{number_of_virtual_nodes, 128},
{store, ets},
]}].
N:R:W = 3:3:1であるため,
次に,
$ /path/to/start_kai.sh kai_wwc1 kai_wwc2 kai_wwc3
次のようなPerl Scriptを用意し,
リスト7 kai_
#!/usr/bin/env perl
use strict;
use warnings;
use Cache::Memcached;
for (1..3) {
my $mem = Cache::Memcached->new({
servers => ['127.0.0.1:1121' . $_],
});
$mem->set(foo => 'bar' . $_, 0,);
}
W=1であるため,
$ perl /path/to/kai_test_wwc_set.pl
これで,
次に,
$ /path/to/remsh.sh kai1_wwc1 Erlang R13B (erts-5.7.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.7.1 (abort with ^G) (kai1_wwc1@centos)1> kai_rpc:check_node({{127,0,0,1}, 11011}, {{127,0,0,1}, 11012}). ok (kai1_wwc1@centos)2> kai_rpc:check_node({{127,0,0,1}, 11012}, {{127,0,0,1}, 11013}). ok (kai1_wwc1@centos)3> kai_rpc:check_node({{127,0,0,1}, 11013}, {{127,0,0,1}, 11011}). ok (kai1_wwc1@centos)4> User switch command --> q
では,
$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. get foo VALUE foo 0 4 bar1 VALUE foo 0 4 bar2 VALUE foo 0 4 bar3 END quit Connection closed by foreign host.
ご覧の通り,
ここでは,
一般的なmemcachedクライアントは,
前述の通り,
よって,
以下は,
言語 | クライアント | バージョン | 実装 | 戻り値 |
---|---|---|---|---|
Perl | Cache::Memcached | 1. | Pure Perl | 最後の値 |
Cache::Memcached::Fast | 0. | XS(独自実装) | 最初の値 | |
Cache::Memcached::libmemcached | 0. | libmemcached | 最後の値 | |
Ruby | memcache-client | 1. | Pure Ruby | 最後の値 |
Ruby-MemCache | 0. | Pure Ruby | 最後の値 | |
Python | python-memcached | 1. | Pure Python | 最初の値 |
PerlのCache::Memcached,
リスト8 kai_
#!/usr/bin/env python
import memcache
mc = memcache.Client(['127.0.0.1:11211'])
print mc.get('foo')
mc.set('foo_py', 'baz')
print mc.get('foo_py')
$ /path/to/kai_test_wwc_get.py
bar1
bar3 <- foo_py を取得しているにも関わらず,foo の値を取得している
意図的に発生させなければ,
ただ,
Write/