cagraのα版試してみたよ(ちょと使ってみた編)

cagraのα版試してみたよ(ビルド編) - @takuma104 log に引き続き。まずは手元にあったOSX(10.5)とLinux(Fedora7) の 2 台でやってみました。

サーバー (cagrad) の起動

./cagrad 1.2.3.4:9999

これだけです。ほかの設定ファイルとかは一切要りません!

ここで、1.2.3.4は、その LAN の IP アドレスにする必要があります。これを安易に localhost などとしてはいけません!*1 (Alpha2で localhost の場合は警告が出るようになりました。)

2台の設定とも、同様にIPアドレスを指定して起動して、あとは 10 から 30 秒ぐらい放っておくと、上記で指定した IP アドレスが Multicastでアナウンスされて、双方の cagrad が勝手にお互いを自動認識します! これは何台有っても同様で、勝手にそのcagradのネットワークに参加していきます。そのとき、サーバ同士が認識しているかどうかは、ログの[INFO]で、参加したときに、"accepted new node" と "new connection pooled" の両方が、IPアドレス付きで出ます。これが出てれば多分大丈夫な感じみたいです。

この Multicast ですが、TTL が 1 に設定されているようなので、ルータは通らないです。複数台の場合は、同一 LAN 内で、ということだと思います。*2

あとLinuxだと、デフォルトで iptables 設定が結構ガチガチになっていて、マルチキャストが通らないでサーバが認識しないというのも有ると思います。そんなときは、# iptables -F でお願いします。嘘です。あとでちゃんと書きます cagraに必要になるかもしれない Firewall (iptables等) 設定 - @takuma104 log

ruby_client/clientを使って、2台で読み書きしてみる

クライアントの使い方も負けず劣らず簡単です。Rubyで言うと、あるHash(keyとvalueのペア)が、たとえば全サーバで共有できる、みたいなイメージで使えます。例えば以下のようにできます。

片側で書き込みしてみる:

$ irb
irb>> require 'ruby_client/client' # おまじない;)
=> true
irb>> nxfs = NXFS::Client.connect("localhost", 8422) # localhost の cagrad に接続するオブジェクト作成
=> #<NXFS::Client:0x350ca0 @socket=#<TCPSocket:0x350cb4>>
irb>> nxfs['hoge'] = 'fuga' # "hoge"というキーに"fuga"という値代入で書き込み(put)
=> "fuga"

書けたので、もう片側のサーバで読んでみる:

$ irb
irb>> require 'ruby_client/client' # おまじない;)
=> true
irb>> nxfs = NXFS::Client.connect("localhost", 8422) # localhost の cagrad に接続するオブジェクト作成
=> #<NXFS::Client:0xb7ee04a0 @socket=#<TCPSocket:0xb7ee04b4>>
irb>> nxfs['hoge'] # "hoge"というキーでの評価で読み込み(get)
=> "fuga" # 値が"fuga"と取れた

おおきたー。となります。超簡単ですね! 

あまりに拍子抜ける位簡単なので、一応説明

それぞれのクライアントは、それぞれの cagrad に接続していて(両方localhostになっているのに注目)、cagrad 経由でデータが取れたことになります。ざっくり図を書いてみるとこんな感じ。(frsyukiさんに図をいただきました。感謝。)

もちろんクライアントを localhost 以外の別のサーバの cagrad につなぐこともできます。あと cagrad に何もクライアントつながない、というのも、大丈夫です。その場合は、単に冗長用のストレージのような役割になりますね。

レプリケーション数の指定

ほんとは、ちゃんとレプリケーション数を、冗長化したい分(サーバの台数分以下)指定したほうがよい、とのことで、*3指定は、

irb>> nxfs.put('foo','bar', {:numReplication=>2})
=> nil

とかするだけです。(fooがkeyで、barがvalue。numReplicationがレプリケーション数)一応その環境から確認すると、

irb>> nxfs['foo']
=> "bar"

書けている。もう1台のほうで確認

irb>> nxfs['foo']
=> "bar"

読めました。という感じです。

Valueに何を入れられるか


いまのところ、putメソッドや[]メソッドで指定できるvalueには、文字列だけのようですが、何か配列とか、ハッシュとか突っ込みたい、とかいうときは、Marshal.dump / Marshal.restore という便利な機能がRubyにはあるので、

nxfs['foo'] = Marshal.dump(value) # write
Marshal.restore(nxfs['foo']) # read

とかで、valueに何でも入れられると思います。(つうか、client.rbを細工しといた方が便利?) UPDATE: Alpha2で、内部でMarshalされるようになりました。つまり、何をvalueにしてもおkです。

*1:1台のときはとりあえず動くみたいですが、複数台のときに嵌りました! twitterでnyaxt師に教えてもらいました。感謝。

*2:細工すればいくらでも出来るけど

*3:client.rb読むと、[ ] メソッドとか、デフォルトはnumReplicationは3のようです。なので上記の [ ] は大丈夫だったのですね