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:11211 や 172.22.3.19:11212 にアクセスして bar の値を取得す
る限りは 'aaaa' が get でも gets でも取得できます。
gets の場合は、key: bar のハッシュを担当するノードに問い合わせが必ず転
送されているようですが、get の場合はローカルにデータのコピーがある場合
それを取得しているような動作に見え、今回の場合は、そのローカルデータが
正しく更新されなかったような感じです。
このように正しく値を取得できない状況があるのですが、使い方を根本的に誤
っていれば、正しい使い方をご教示いただければと思います。
よろしくお願いします。
ご連絡ありがとうございます。鳥居です。
ご指摘のケース起こりえます。注意が足りませんでした。
ROMA の get は ROMA Client の使用を前提に、そのノードにデータが存在する
場合はそれを返すように実装されています。一方後から追加された gets は複数
キーを取り扱うためキーに対するノードを再計算し適切にルーティングします。
新ノードが join したことで bar の割り当てが 172.22.3.19_11211 から外れ、
その時点まで保有していた古いデータが残されます。これは、暫くすると消されますが、
それまでの間にこのノードで get されてしまうと見えてしまいます。
ROMA Client を使うことでこの現象は緩和されますが問題ですね。
この部分は gets の動作に統一するように修正させて頂きます。
また、異なるマシンで ROMA をお使い頂く場合、mkroute,romad の --enabled_repeathost
オプションは不要になります。このオプションは、同一のマシンに複数のインスタンスを上げて
テストを行うための物で、同じマシンにも冗長化の割り当てを許可する意味を持ちます。
複数のマシンをお使いの場合は、同じマシンに冗長化する意味がありませんのでオプションは
不要です。
貴重なご連絡ありがとうございました。
近日中にパッチを当てますのでよろしくお願いいたします。
鳥居 順次
きくもとです。
> 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
鳥居です。
以下の修正を行いました。
http://github.com/roma/roma/commit/e18019ae1f5870065c2bda105cc92635106bc3f2
またお気付きの点がございましたらご連絡ください。
どうぞよろしくお願いします。
鳥居 順次
さっそくのパッチありがとうございます。
動作を確認したところ、get, gets とも同じ修正後の値を取得できることを
確認できました。
ありがとうございました。
2010年1月19日11:56 jun <jun...@gmail.com>: