2010
06.11

TokyoTyrantをRubyで使ってみた

伊藤です。

今はやりのKey-Valueストア, TokyoTyrantをUbuntu Linuxにインストールして、Rubyから試してみました。

TokyoTyrantはあるバイト列(key)に、あるバイト列(value)を対応させて保存し、取り出すことができるサーバです。
バックグラウンドの技術として、コアのkey-valueペアの集合を効率的にファイルに保存したり取り出したりするTokyoCabinetが使われています。
TokyoCabinetもRubyのライブラリがあるのですが、key-valueの値をネットワーク上から共有したい場合にはTCPサーバのラッパーをかぶせたTokyoTyrantが便利に使えます。
ネットワークkey-valueストアの始祖であるmemcachedに対するTokyoTyrantの特徴は、全ての書き込みがファイルに保存されることです。
しかし、様々な部分の実装をカリカリにチューニングしてあるため、1クエリあたりの処理時間はmemcachedと遜色ないというすばらしいソフトウェアです。

まずは、TokyoTyrantが依存しているライブラリであるTokyoCabinetをインストールしましょう。
Ubuntuではすでにパッケージが提供されているようですが、せっかくなので最新バージョンを入れたいと思ったのでソースからインストールしてみましょう。
巨大でファイルが大量なライブラリではありませんので、パッケージを使わないことによる環境の汚れも精神衛生上そんなに気にならないと思います。
wgetでとってくるアーカイブのURLはTokyoCabinetのページから、適宜コピーしてきてください。
ここでは展開やコンパイルに/usr/local/src/を使っています。
今回テストに使ったサーバでは、configureの前にlibbz2-devパッケージをaptitude(apt-get)でインストールする必要がありました。

$ cd /usr/local/src/
$ wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.45.tar.gz
$ tar xzf ./tokyocabinet-1.4.45.tar.gz
$ cd tokyocabinet-1.4.45.tar.gz
$ ./configure
$ make
$ sudo make install

問題なくいけば、次はTokyoTyrantをインストールします。

$ cd /usr/local/src/
$ wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz
$ tar xzf ./tokyotyrant-1.1.40.tar.gz
$ cd ./toykotyrant-1.1.40
$ ./configure
$ make
$ sudo make install

問題なくいけば、/usr/local/sbin/や/usr/local/binにいろいろなコマンドがインストールされています。
そのうちのひとつ、/usr/local/sbin/ttservctlがTokyoTyrantの起動/再起動/停止コマンドになっています。
ポート番号や、データの保存先ファイルなどの設定はこのシェルスクリプトに以下のように直接記述されています。

# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/var/ttserver"
port="1978"
pidfile="$basedir/pid"
#logfile="$basedir/log"
#ulogdir="$basedir/ulog"
#ulimsiz="256m"
#sid=1
#mhost="remotehost1"
#mport="1978"
#rtsfile="$basedir/rts"
dbname="$basedir/casket.tch#bnum=1000000"
retval=0

これらの情報を編集したいときは

$ sudo vim /usr/local/sbin/ttservctl

で編集しましょう。
とりあえず、デフォルトのまま起動してみます。TokyoTyrantのデフォルトのポートはTCP1978番。

$ sudo /usr/local/sbin/ttservctl start

起動したら、TokyoTyrantをテストするコマンドtcrmgr(TokyoCabinetRemote Managerの略でしょうか?)が/usr/local/binにあるはずですので、
これを使っていくつかテストしてみましょう。
何も引数を与えずに実行すると、サブコマンドを含む簡単な使い方が出てきます。
putで、キーに対する値を設定、getでまた取得、というのをやってみましょう。

tomotaka@rain:~$ tcrmgr put localhost testtest test-value
tomotaka@rain:~$ tcrmgr get localhost testtest
test-value

おお、動いているようですね。
この他にもキーの一覧を表示するlistや、内容を完全にまっさらにクリアするvanish、キー:値のペアを削除するoutなどがあります。

TokyoTyrantがいい感じに動いているので、RubyからTokyoTyrantにアクセスするライブラリをインストールして、
使ってみましょう。

gemでも提供されているのかもしれませんが、いまのところ公式サイトではソースアーカイブで配布されているので、
ここではソースアーカイブを展開してinstall.rbを実行するようにしてインストールしてみます。
アーカイブのURLは公式ページから最新のものをコピーして、適宜書き換えてください。

$ cd /usr/local/src
$ wget http://1978th.net/tokyotyrant/rubypkg/tokyotyrant-ruby-1.13.tar.gz
$ tar xzf ./tokyotyrant-ruby-1.13.tar.gz
$ cd tokyotyrant-ruby-1.13.targz
$ sudo ruby ./install.rb

これでRubyからはrequire “tokyotyrant”で、読み込めるようになったはずです。
簡単なサンプルで、ためしてみましょう。
さっき書き込んだtesttestというキーの値を読みこんでみましょう。

require "tokyotyrant"
tt = TokyoTyrant::RDB.new
tt.open("localhost", 1978)
value = tt.get("testtest")
puts value
tt.close

きちんとtest-valueが出てきたでしょうか。
書き込みにはputを使います。

 require "tokyotyrant"
 tt = TokyoTyrant::RDB.new
 tt.open("localhost", 1978)
 tt.put("aiueo", "kakikukeko")
 tt.close
 

書き込んだキーaiueoに対して、きちんとkakikukekoがはいってるかたしかめましょう。

 $ tcrmgr get localhost aiueo
 

他にも、keysや、size(length)、each、has_key?などRubyのHashと互換性のあるメソッドが使えます。
これらと内容を空にする clear(vanish)、最適化するoptimize、書き込んだ内容を同期書込みさせるsync
などを覚えておけばだいたい実務レベルで使えるのではないでしょうか?
詳細なAPIの定義は公式のドキュメントを見てみてください。

最後に、TokyoTyrantの特徴であるパフォーマンスについても軽く触れたいと思います。
僕が独自に調査した結果では、10万レコードを追加するのに、約13〜15秒
同じく10万レコードを取得するのに同様に約11〜12秒程度でした。
これはKVM上で動かしている仮想マシンでのベンチマーク結果ですので、実マシンですともっとよくなりそうですね。
小さく、大量のアクセスがあり、なおかつファイルに残しておきたい内容をさばくにはかなりオススメの選択肢と思います。
今回検証した用途は高速に使えるキャッシュという用途でしたが、いろいろな応用が考えられますね。

それではよいKVSライフを!

Tags: , ,

Comment / Trackback

  1. RailsでTokyoTyrantを使ってみたらフリーズした « BPS株式会社 開発ブログ Beyond Perspective Solutions LTD.より:
    10 年06 月24 日 2:27 PM

    [...] 最初は馬場が記事にしてくれているようにファイルベースのものを用いていましたが(実際はもうちょっと複雑なものを使っていました)、 ファイル数(エントリ)が数万単位で増えた際、パフォーマンスが指数関数的に悪くなってしまったので、キーと値の格納にTokyoTyrantを利用することにしました。 TokyoTyrantの使い方はシステムエンジニアブログにも書いてみました(TokyoTyrantをRubyで使ってみた)ので、TokyoTyrantそのものについてはこちらも見てみてください。 [...]

  2. Tweets that mention TokyoTyrantをRubyで使ってみた « BPS株式会社 ネットワークエンジニアブログ Beyond Perspective Solutions LTD. -- Topsy.comより:
    10 年07 月30 日 4:03 PM

    [...] This post was mentioned on Twitter by Rubyニュース, Ruby最新情報ツイッター and Rubyist Bot, bsiyo. bsiyo said: Ruby: TokyoTyrantをRubyで使ってみた « BPS株式会社 ネットワークエンジニアブログ Beyond Perspective Solutions LTD. : http://www.bpsinc.jp/slog/archives/49 [...]

    [WORDPRESS HASHCASH] The comment’s server IP (208.74.66.43) doesn’t match the comment’s URL host IP (74.112.128.10) and so is spam.

Post

Powered by WP Hashcash