join後の更新で、データ更新されないノードがあります

10 views
Skip to first unread message

きくもと

unread,
Jan 18, 2010, 7:45:18 AM1/18/10
to roma-user-japan
はじめまして、きくもとと申します。

ROMA のストレージ実装を Tokyo Cabinet に差し替えて試用しています。
最初 2つの ROMA プロセスで起動し、その後、1プロセスを join し、デー
タを上書きするようなことをすると、もとのあるプロセスでは、データが古い
ままという状況がになりました。
以下のようなことをしていますが、何か使い方が間違っていますでしょうか?

物理的なノードは2つ用意しています。
IP が 172.22.3.18 と 172.22.3.19 の2つです。
ROMA および Tokyo Cabinet への差し替えは、ドキュメントに従ったつもりで
います。

まず、172.22.3.18 のノード上で、

$ ./bin/mkroute --enabled_repeathost 172.22.3.18_11211
172.22.3.19_11211
nodes => ["172.22.3.18_11211", "172.22.3.19_11211"]
Routing table has created.

とし、routing ファイルを、

$ scp *.route 172.22.3.19:~/roma/ruby/server/

として、コピーしています。その後、

$ ./bin/romad --enabled_repeathost 172.22.3.18 -p 11211 --verbose -d

で、ROMA プロセスを起動しています。
さらに、172.22.3.19 のノード上でも

$ ./bin/romad --enabled_repeathost 172.22.3.19 -p 11211 --verbose -d

で、ROMA プロセスを起動しています。
その後、

$ telnet 172.22.3.18 11211
set foo 0 0 3
bar
STORED
set bar 0 0 4
hoge
STORED
set hoge 0 0 4
geho
STORED

のようにデータを保存します。
この状態で、172.22.3.19 のノード上で

$ ./bin/romad --enabled_repeathost 172.22.3.19 -p 11212 --verbose -d
-j 172.22.3.18_11211

を実行し、ROMA クラスタに新たなプロセスを参加させます。
ログを見て、同期の処理らしきものが完了した後に、

$ telnet 172.22.3.19 11212
set bar 0 0 4
aaaa
STORED

として、key: bar の値を上書き更新します。
このとき 172.22.3.18_11211.log には

I, [2010-01-18T21:21:37.708209 #16888] INFO -- : command log:rset
baroma 3522174797 1 2147483647 4

に、表示され、172.22.3.19_11212.log には

I, [2010-01-18T21:14:47.764636 #28962] INFO -- : command log:set
bar 0 0 4

と表示されますが、172.22.3.19_11211.log には、set に関するログは何も出
ませんでした。

そして、

$ telnet 172.22.3.19 11211
get bar
VALUE bar 0 4
hoge
END
gets bar
VALUE bar 0 4 1
aaaa
END

というように、get と gets で結果が異なるという状況が発生しました。
172.22.3.18:11211172.22.3.19:11212 にアクセスして bar の値を取得す
る限りは 'aaaa' が get でも gets でも取得できます。
gets の場合は、key: bar のハッシュを担当するノードに問い合わせが必ず転
送されているようですが、get の場合はローカルにデータのコピーがある場合
それを取得しているような動作に見え、今回の場合は、そのローカルデータが
正しく更新されなかったような感じです。

このように正しく値を取得できない状況があるのですが、使い方を根本的に誤
っていれば、正しい使い方をご教示いただければと思います。

よろしくお願いします。

jun

unread,
Jan 18, 2010, 8:18:27 AM1/18/10
to roma-user-japan
きくもと さん

ご連絡ありがとうございます。鳥居です。

ご指摘のケース起こりえます。注意が足りませんでした。
ROMA の get は ROMA Client の使用を前提に、そのノードにデータが存在する
場合はそれを返すように実装されています。一方後から追加された gets は複数
キーを取り扱うためキーに対するノードを再計算し適切にルーティングします。

新ノードが join したことで bar の割り当てが 172.22.3.19_11211 から外れ、
その時点まで保有していた古いデータが残されます。これは、暫くすると消されますが、
それまでの間にこのノードで get されてしまうと見えてしまいます。
ROMA Client を使うことでこの現象は緩和されますが問題ですね。

この部分は gets の動作に統一するように修正させて頂きます。

また、異なるマシンで ROMA をお使い頂く場合、mkroute,romad の --enabled_repeathost
オプションは不要になります。このオプションは、同一のマシンに複数のインスタンスを上げて
テストを行うための物で、同じマシンにも冗長化の割り当てを許可する意味を持ちます。
複数のマシンをお使いの場合は、同じマシンに冗長化する意味がありませんのでオプションは
不要です。

貴重なご連絡ありがとうございました。

近日中にパッチを当てますのでよろしくお願いいたします。

鳥居 順次

Takahiro Kikumoto

unread,
Jan 18, 2010, 7:33:33 PM1/18/10
to roma-us...@googlegroups.com
鳥居さま

きくもとです。

> ROMA Client を使うことでこの現象は緩和されますが問題ですね。

そうなのですね。とりあえず、ということで telnet での確認してしていませ
んでした。

> この部分は gets の動作に統一するように修正させて頂きます。

ありがとうございます。そのように修正いただけるとうれしいです。

> また、異なるマシンで ROMA をお使い頂く場合、mkroute,romad の --enabled_repeathost
> オプションは不要になります。

このあたりも、まだ使い方をきちんと把握できていないので、これから使いな
がら理解していきたいと思います。アドバイスありがとうございました。

今後も、よろしくお願いします。

2010年1月18日22:18 jun <jun...@gmail.com>:

>> ? $ ./bin/mkroute --enabled_repeathost 172.22.3.18_11211
>> 172.22.3.19_11211
>> ? nodes => ["172.22.3.18_11211", "172.22.3.19_11211"]
>> ? Routing table has created.
>>
>> とし、routing ファイルを、
>>
>> ? $ scp *.route 172.22.3.19:~/roma/ruby/server/
>>
>> として、コピーしています。その後、
>>
>> ? $ ./bin/romad --enabled_repeathost 172.22.3.18 -p 11211 --verbose -d


>>
>> で、ROMA プロセスを起動しています。
>> さらに、172.22.3.19 のノード上でも
>>

>> ? $ ./bin/romad --enabled_repeathost 172.22.3.19 -p 11211 --verbose -d
>>
>> で、ROMA プロセスを起動しています。
>> その後、
>>
>> ? $ telnet 172.22.3.18 11211
>> ? set foo 0 0 3
>> ? bar
>> ? STORED
>> ? set bar 0 0 4
>> ? hoge
>> ? STORED
>> ? set hoge 0 0 4
>> ? geho
>> ? STORED
>>
>> のようにデータを保存します。
>> この状態で、172.22.3.19 のノード上で
>>
>> ? $ ./bin/romad --enabled_repeathost 172.22.3.19 -p 11212 --verbose -d


>> -j 172.22.3.18_11211
>>
>> を実行し、ROMA クラスタに新たなプロセスを参加させます。
>> ログを見て、同期の処理らしきものが完了した後に、
>>

>> ? $ telnet 172.22.3.19 11212
>> ? set bar 0 0 4
>> ? aaaa
>> ? STORED


>>
>> として、key: bar の値を上書き更新します。
>> このとき 172.22.3.18_11211.log には
>>

>> ? I, [2010-01-18T21:21:37.708209 #16888] ?INFO -- : command log:rset


>> baroma 3522174797 1 2147483647 4
>>
>> に、表示され、172.22.3.19_11212.log には
>>

>> ? I, [2010-01-18T21:14:47.764636 #28962] ?INFO -- : command log:set


>> bar 0 0 4
>>
>> と表示されますが、172.22.3.19_11211.log には、set に関するログは何も出
>> ませんでした。
>>
>> そして、
>>

>> ? $ telnet 172.22.3.19 11211
>> ? get bar
>> ? VALUE bar 0 4
>> ? hoge
>> ? END
>> ? gets bar
>> ? VALUE bar 0 4 1
>> ? aaaa
>> ? END

jun

unread,
Jan 18, 2010, 9:56:40 PM1/18/10
to roma-user-japan
きくもと さん

鳥居です。

以下の修正を行いました。
http://github.com/roma/roma/commit/e18019ae1f5870065c2bda105cc92635106bc3f2

またお気付きの点がございましたらご連絡ください。
どうぞよろしくお願いします。

鳥居 順次

Takahiro Kikumoto

unread,
Jan 19, 2010, 4:21:22 AM1/19/10
to roma-us...@googlegroups.com
鳥居さま

さっそくのパッチありがとうございます。
動作を確認したところ、get, gets とも同じ修正後の値を取得できることを
確認できました。

ありがとうございました。

2010年1月19日11:56 jun <jun...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages