cagraのα版試してみたよ(ビルド編)

cagra: Reliable and Flexible Distributed Storage System
分散ストレージエンジンテクニカルデモ α版リリース

あの上野 (nyaxt) 氏と、あの古橋 (frsyuki/viver) 氏 共作の cagra*1。cagra は分散ストレージシステムで、memcached の分散版というとちょっと語弊があるけど、memcached位のお手軽さで使えるストレージ(現在はオンメモリのみ)です。ストレージという意味では、MogileFS に近いのでは?というご指摘もいただきました。現在 24 ノード (24台) 位でもちゃんと動いているようです。(もちろん、1ノードでも動くよ)

しかもデフォルトで Ruby バインドが付属です!memcached を簡易 DB 代わりみたいに Ruby から使っている僕としては、これは試すしかない!ということで、とりあえずビルドとちょっとした動作確認とかを、OSXLinux の2台でやってみました。

以下がビルドの方法です。

1. Ruby 入れておいてください

ビルドに必要だそうです。(Versionは、1.85, 1.86あたりで僕は確認してます)

2. Boost 1.34.1 のインストール

Tarballは、以下からダウンロードできます。OSX だと MacPort でもインストール出来るみたいです。*2

http://sourceforge.net/project/showfiles.php?group_id=7586&package_id=8041&release_id=527428

2.1 configure と make
$ ./configure --prefix=/opt/local/boost_1_34_1 
$ make
$ sudo make install

とかで、/opt/local/boost_1_34_1 以下にインストールされます。boostはバージョンごとにディレクトリ分けた方が幸せになれます。(ちょっとここで嵌った。)あとは、このboostのlibを通すのを忘れずに。(Linuxだと、/etc/ld.so.confに、/opt/local/boost_1_34_1/libを追加で、ldconfig)

3. cagra のインストール

まずnyaxt氏のページをよく読んでから、ソースとって来て(がんがん更新されていっているので、氏のblogで最新版確認してください)

3.1 configure と make
$ ./configure --with-boost=/opt/local/boost_1_34_1 --prefix=/opt/local
$ make

(make installはまだないみたい Alpha2で make install 出来るようになりました。ただ、いまのところ ruby_clinet 以下はインストールされませんので注意。)

で、make したディレクトリに、cagrad が出来ます。

とりあえずこれだけです。使い方も簡単です。使い方は、 cagraのα版試してみたよ(ちょと使ってみた編) - @takuma104 log に書きました。

*1:ライセンスは、Apache V2です。cf: http://nyaxtstep.com/trac/nxfs/browser/COPYING  ちなみに、彼らはcagraをほぼ1ヶ月で動くものに作り上げたようです。驚異的スピード! cf: http://nyaxtstep.com/trac/nxfs/changeset/0

*2:Linuxは、だれか作ったrpmあるのかなあ?まあいいや。

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のようです。なので上記の [ ] は大丈夫だったのですね