k4200’s notes and thoughts

Programmer side of k4200

FlockDB (2)

はじめに

この記事はScala Advent Calendar jp 2011最終日用のエントリーです。

前回Apache Thrift, FlockDBのビルド、そしてFlockDBのデモの動作を試して失敗しました。

今回の目標は

  • デモを動かす
  • FlockDBの内部の仕組みについて大雑把に理解する
  • (もしかしたら次回かも)Rubyのクライアントプログラムを参考に、Scalaの簡単なクライアントプログラムを作ってみる

続・FlockDBのデモを動かす

gizzmo が動かない

前回gizzmoが動かなかった原因ですが、権限の問題でした。gem installでインストールされたファイルが、一般ユーザーだと読めないようになっていたので、解決方法としては

  • 権限を変更
  • root で実行

面倒なので後者にしました。

で、以下のコマンドを実行すると・・・ようやくちゃんと表示されました!!

[kashima@www3220u ~]$ sudo gizzmo help
(略)
シャードの設定?

環境変数MySQLのユーザー名とパスワードを設定します(リモートのMySQLを使う方法は今の所不明)。

$ export DB_USERNAME="root"
$ export DB_PASSWORD="password"


~/.gizzmorc という設定ファイルを作ります。

host: localhost
port: 7920

手順に従って環境設定スクリプトを動かしてみます。何やらメッセージが大量に出ます。上手くいったのかどうかも良く分かりません。

[kashima@www3220u flockdb]$ sudo -E ./dist/flockdb/scripts/setup-env.sh 
Killing any running flockdb...
Launching flockdb...
Creating shards...
1 Connection refused - connect(2)
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/vendor/thrift_client/simple.rb:324:in `initialize'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/vendor/thrift_client/simple.rb:324:in `new'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/vendor/thrift_client/simple.rb:324:in `_proxy'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/thrift.rb:142:in `_proxy'
(eval):1:in `create_shard'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:114:in `send'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:114:in `method_missing'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:148:in `with_retry'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/nameserver.rb:114:in `method_missing'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:259:in `run'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:257:in `each'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:257:in `run'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzard/commands.rb:18:in `run'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzmo.rb:499
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzmo.rb:493:in `custom_timeout'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/lib/gizzmo.rb:498
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/bin/gizzmo:3:in `load'
/usr/lib/ruby/gems/1.8/gems/gizzmo-0.11.2/bin/gizzmo:3
/usr/bin/gizzmo:19:in `load'
/usr/bin/gizzmo:19
(略)
Usage: gizzmo addforwarding TABLE_ID BASE_ID SHARD_ID

Add a forwarding from a graph_id / base_source_id to a given shard.

Usage: gizzmo addforwarding TABLE_ID BASE_ID SHARD_ID

Add a forwarding from a graph_id / base_source_id to a given shard.

13 14 15 
Done.

一応戻り値を確認してみます。

[kashima@www3220u flockdb]$ echo $?
0

OK?

動作確認

とりあえず動作確認してみます。

[kashima@www3220u flockdb]$ ps aux | grep java
root     29535  9.9 44.3 787752 226648 pts/0   Sl   17:36   0:25 java -Xms256m -Xmx256m -XX:NewSize=64m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -server -jar ./dist/flockdb/flockdb-1.8.0-alpha16-SNAPSHOT.jar config/development.scala
kashima  29964  0.0  0.1   6040   576 pts/0    S+   17:40   0:00 grep java

プロセスは動いってるっぽいです。

[kashima@www3220u flockdb]$ sudo netstat -nlp | grep 29535
tcp        0      0 :::9990                     :::*                        LISTEN      29535/java          
tcp        0      0 :::7915                     :::*                        LISTEN      29535/java          
tcp        0      0 :::7920                     :::*                        LISTEN      29535/java          
tcp        0      0 :::7921                     :::*                        LISTEN      29535/java

いくつかのポートで待ち受けてるっぽいです。

挨拶してみます。

[kashima@www3220u flockdb]$ curl localhost:9990/server_info.txt
build: 20111223-173553
build_branch_name: unknown
build_last_few_commits: unknown
build_revision: d9f09a90d7ed8931e117615e5ca96155a46837ac
name: flockdb
start_time: Fri Dec 23 17:36:16 JST 2011
uptime: 184169
version: 1.8.0-alpha16-SNAPSHOT

なんか動いているようです。

FlockDBとお話しする

引き続きデモの説明に従って。

RubyのFlockDBクライアントのインストール

説明に従ってFlockDBのクライアントを入れます。

[kashima@www3220u ~]$ sudo gem install flockdb
Building native extensions.  This could take a while...
ERROR:  Error installing flockdb:
        thrift_client requires thrift (~> 0.7.0, runtime)

thrift とか thrift_client が必要らしいのでインストールします。

[kashima@www3220u ~]$ sudo gem install thrift_client
Building native extensions.  This could take a while...
Successfully installed thrift-0.7.0
Successfully installed thrift_client-0.7.1
2 gems installed

再度試した所OKでした。

[kashima@www3220u ~]$ sudo gem install flockdb
Successfully installed flockdb-0.7.1
1 gem installed
Installing ri documentation for flockdb-0.7.1...
Installing RDoc documentation for flockdb-0.7.1...
もうちょいRuby関係で・・・

非常に長かったですが、ようやくFlockDBの機能を使う所まで辿り着い・・・てないようです。

[kashima@www3220u ~]$ sudo -E irb
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> require "flockdb"
Gem::Exception: can't activate thrift (~> 0.7.0, runtime), already activated thrift-0.8.0
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:149:in `activate'
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:165:in `activate'
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `each'
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `activate'
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:165:in `activate'
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `each'
        from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:164:in `activate'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:35:in `require'
        from (irb):2

何かバージョン関連のエラーっぽいです。

調べてみると thrift 0.8.0 と 0.7.1 の両方が入っています。0.8.0 なんて入れた覚えはないのですが、削除します。

[kashima@www3220u ~]$ gem list

*** LOCAL GEMS ***

flockdb (0.7.1)
gizzmo (0.11.2)
thrift (0.8.0, 0.7.0)
thrift_client (0.7.1)
[kashima@www3220u ~]$ sudo gem uninstall thrift -v 0.8.0
Successfully uninstalled thrift-0.8.0

これでようやくOKっぽいです。

[kashima@www3220u ~]$ sudo -E irb
irb(main):001:0> require "rubygems"
=> true
irb(main):002:0> require "flockdb"
=> true
データの作成

デモの通り進めてみます。

まずは2種類の関係(フォロー、ブロック)を持つグラフを定義しているようです。

irb(main):003:0> flock = Flock.new "localhost:7915", :graphs => { :follows => 1, :blocks => 2 }
=> #<Flock::Client:0x2b003f4f9e48 @service=<Flock::Service(Flock::Edges::FlockDB::Client) @current_server=localhost:7915>, @graphs={:follows=>1, :blocks=>2}>

現在空のグラフなのですが、何人のユーザーがユーザー"1"をフォローしているか検索してみます(結果は空のはず)。

irb(main):004:0> flock.select(nil, :follows, 1).to_a
Flock::Edges::FlockException: Flock::Edges::FlockException
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/gen-rb/flock_d_b.rb:171:in `recv_select'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/gen-rb/flock_d_b.rb:161:in `select'
        from /usr/lib/ruby/gems/1.8/gems/thrift_client-0.7.1/lib/thrift_client/abstract_thrift_client.rb:150:in `send'
        from /usr/lib/ruby/gems/1.8/gems/thrift_client-0.7.1/lib/thrift_client/abstract_thrift_client.rb:150:in `handled_proxy'
        from /usr/lib/ruby/gems/1.8/gems/thrift_client-0.7.1/lib/thrift_client/abstract_thrift_client.rb:60:in `select'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/select_operation.rb:31:in `get_results'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/select_operation.rb:40:in `operation'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:48:in `call'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:48:in `get_results'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:22:in `current_page'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:77:in `next?'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operation.rb:62:in `each'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/select_operation.rb:4:in `each'
        from (irb):4:in `to_a'
        from (irb):4

to_a でエラーになってるので、to_a を外してみると何か返ってきました。

irb(main):005:0> flock.select(nil, :follows, 1)
=> #<Flock::SimpleOperation:0x2b003f483568 @term=#<Flock::QueryTerm:0x2b003f483590 @states=[], @destination=1, @graphs={:follows=>1, :blocks=>2}, @graph=1, @source=nil>, @service=<Flock::Service(Flock::Edges::FlockDB::Client) @current_server=>, @client=#<Flock::Client:0x2b003f4f9e48 @service=<Flock::Service(Flock::Edges::FlockDB::Client) @current_server=>, @graphs={:follows=>1, :blocks=>2}>>

あまりRubyに時間を使いたくないので、サクサク進めます。

以下のように実行するらしいです。

>> flock.add(20, :follows, 1)
=> nil
>> flock.add(21, :follows, 1)
=> nil
>> flock.add(22, :follows, 1)
=> nil

ここでは、ユーザー 1, 20, 21, 22というノードを作成し、20, 21, 22が1をフォローするという関係を作成しているようです。ノードを明示的に作成しなくても、エッジを作成すれば自動的にノードが作成されるたいです。

実際にやってみると・・・

irb(main):014:0> flock.add(20, :follows, 1)
TypeError: wrong argument type Symbol (expected Proc)
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/execute_operations.rb:23:in `to_thrift'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/operations/execute_operations.rb:18:in `apply'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/client.rb:87:in `update'
        from /usr/lib/ruby/gems/1.8/gems/flockdb-0.7.1/lib/flock/client.rb:92:in `add'
        from (irb):14

FlockDBのMLでも同じ話題が出ていますが、反応無しです。

渡している型が違うと言っているのは分かるのですが、正しい型が分かりません。

まとめ

クリスマスイブにRubyと格闘するのもいやなので、今回はこの辺で。全然Scalaの話が出てなくて済みません。

今日か明日にもし時間があれば、以下のどちらかをやろうと思います。

  • FlockDB のクライアントをScalaで書く
  • FlockDB のソースを説明

良いお年を〜。