cagraのα版試してみたよ(ビルド編)
cagra: Reliable and Flexible Distributed Storage System
分散ストレージエンジンテクニカルデモ α版リリース
あの上野 (nyaxt) 氏と、あの古橋 (frsyuki/viver) 氏 共作の cagra*1。cagra は分散ストレージシステムで、memcached の分散版というとちょっと語弊があるけど、memcached位のお手軽さで使えるストレージ(現在はオンメモリのみ)です。ストレージという意味では、MogileFS に近いのでは?というご指摘もいただきました。現在 24 ノード (24台) 位でもちゃんと動いているようです。(もちろん、1ノードでも動くよ)
しかもデフォルトで Ruby バインドが付属です!memcached を簡易 DB 代わりみたいに Ruby から使っている僕としては、これは試すしかない!ということで、とりあえずビルドとちょっとした動作確認とかを、OSX と Linux の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
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
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です。