R&Dトレンドレポート

第3回NoSQLを動かしてみよう

NoSQLの種類

第1回第2回とNoSQLとRDBMSの比較を行ってきました。では、NoSQLの具体的なプロダクトって何があるのよ?という話ですが、実際に調べてみると結構な数のプロダクトが存在するようです。

こちらのブログで紹介されていますが、実に40種類以上ものNoSQLが挙げられています。そして元ネタとなった資料も紹介されていますが(プレゼン資料をPDF化したものらしい⁠⁠、RDBMSとの違いをNot Only ACID, Not Only Relationalと表現していたりなかなか興味深いものがあります。

さて、今回は数あるNoSQLの中からTokyoCabinet/TokyoTyrantを取り上げたいと思います。

TokyoCabinet/TokyoTyrantとは

TokyoCabinet(以下TC)は現Mixiの平林幹雄氏が開発したもので、実際にMixiのシステムでも使用されているデータベースです。ハッシュ型データ構造のキーバリュー形式(Key Value Store:KVS)だけではなく、データ構造を選択することでDBのタイプを変更することができるようです。

KVSとしてはmemcachedというオンメモリ型のデータベースが有名ですが、memcachedはオンメモリ型という特性があるため、データを永続的に持つことができません(揮発性)でした。TCはmemcachedとは違いますが、memcachedとプロトコル互換があるため、memcachedを不揮発で使いたいというニーズに合致するものでした。実際にMixiではmemcachedからTCへの置き換えを行ったそうです。

また、TCとならんでTokyoTyrant(以下TT)というプロダクトがあり、こちらはデータベースエンジンであるTCのネットワークインターフェースの実装となります。TC単体ではネットワーク経由で使用することができませんが、TTと同時に使用することで外部の機器からネットワーク経由でTCを使用することが可能となります。

TokyoCabinet/TokyoTyrantを使ってみよう

それでは実際にTC/TTの環境を作成し、使用してみたいと思います。

OSCentOS_5.4(32ビット)
インストールするプログラムTokyoCabinet
TokyoTyrant
perlで使用するためのモジュールTokyoTyrant-perl

TokyoCabinet

①ソースのダウンロード&展開

Tokyo Cabinetのサイトからソースのダウンロードを行います。2010/10/19現在1.4.46が最新のようです。CentOSのようなLinuxマシンでは、ダウンロードの際にwgetを使用すると便利です。

$ wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.46.tar.gz
《中略》
2010-10-22 17:57:10 (358 KB/s) - `tokyocabinet-1.4.46.tar.gz' saved [1002423/1002423]

$ ls
tokyocabinet-1.4.46.tar.gz

正常にダウンロードできました。

続いて展開です。

$ tar zxvf tokyocabinet-1.4.46.tar.gz

《中略》

正常に展開されました。

②ソースのコンパイル&インストール

続いてソースのコンパイル作業です。

事前準備

私の環境では、zlib.h、bzlib.hが無いと怒られましたので、事前に入れておきましょう。


$ su -
Password:

# yum install zlib-devel
# yum install bzip2-devel

yumは便利ですね(^o^)/

# exit
一般ユーザに戻ります。

$ cd tokyocabinet-1.4.46
$ ./configure --enable-off64

《中略》

#================================================================
# Ready to make.
#================================================================

正常に終了しました。
※--enable-off64は32ビット環境で64ビットのファイルオフセットを扱うために必要。つけなかった場合はDBサイズが2Gでエラーとなる可能性もある。

続いてmakeします。

$ make

《中略》

#================================================================
# Ready to install.
#================================================================

そしてinstall

$ su - 
Password:?
# make install

《中略》

#================================================================
# Thanks for using Tokyo Cabinet.
#================================================================

これでTokyocabinetがインストールされました。

Tokyo Tyrant

①ソースのダウンロード&展開

Tokyo Tyrantのサイトからソースのダウンロードを行います。2010/10/19現在1.1.41が最新のようです。

$ wget http://fallabs.com/tokyotyrant/tokyotyrant-1.1.41.tar.gz

《中略》

$ tar zxvf tokyotyrant-1.1.41.tar.gz

《中略》

$ cd tokyotyrant-1.1.41

②ソースのコンパイル&インストール

configureとmakeを続けて行います。

$ ./configure && make

$ su -
Password:

# make install

TokyoTyrant-perl

①ソースのダウンロード&展開

Tokyo Tyrantのサイトからソースのダウンロードを行います。2010/10/19現在1.16が最新のようです。

$ wget http://1978th.net/tokyotyrant/perlpkg/tokyotyrant-perl-1.16.tar.gz

《中略》

$ tar zxvf tokyotyrant-perl-1.16.tar.gz?

《中略》

$ cd tokyotyrant-perl-1.16
$ ls
《略》

Perlモジュールは慣例的に以下のようにコンパイルします。

$ perl Makefile.PL && make

$ su -
Password:?

# make install

OK!

これで必要なプログラムはすべて入りました。

TokyoTyrantの起動

ライブラリや実行ファイルへのパスを通しつつttservctlコマンドに対し、startを与えて起動させます。

$ su -
Password:

# env \
   LD_LIBRARY_PATH=/usr/local/lib \
   PATH=/usr/local/bin:$PATH \
   /usr/local/sbin/ttservctl start

環境によっては/usr/local/lib, /usr/local/binが環境変数に含まれている場合があるので、

# /usr/local/sbin/ttservctl start

これだけでよいかもしれません。

自動起動させたい場合は、/etc/rc.localに、以下のコマンドをそのまま貼り付けておきましょう。

env \
  LD_LIBRARY_PATH=/usr/local/lib \
  PATH=/usr/local/bin:$PATH \
  /usr/local/sbin/ttservctl start

接続確認してみましょう。tcrmgrコマンドを使って確認ができます。

データを登録してみましょう。

$ tcrmgr put localhost name wakimoto

キーとバリューをputします。この場合は、キー:name、バリュー:wakimotoを設定しています。次に取得してみます。


$ tcrmgr get localhost name?
wakimoto

キー:nameを指定したら、バリューのwakimotoが帰ってきました。 成功です!

おまけ

ネットワークポートの確認

TokyoTryrantはデフォルトで1978ポートを使用します。

$ netstat -ant | grep 1978
tcp         0       0 0.0.0.0:1978                0.0.0.0:*                 LISTEN

開いていますね!

プロセスの確認

ttserverプロセスがいるか確認します。

$$ ps ax | grep ttserver
 9924           Sl     0:00 ttserver -port 1978 -dmn -pid /var/ttserver/pid /var/ttserver/casket.tch#bnum=1000000

いました!

うまくいかなかったときのための情報収集の参考にしてください。

perlからの接続

perlから接続確認をしてみましょう。

TokyoTyrantモジュールをuseします。

#!/usr/bin/perl

use strict;
use TokyoTyrant;

RDBをインスタンス化し、ホスト名、ポート番号を指定してopenします。

my $rdb = TokyoTyrant::RDB->new();
if(!$rdb->open("localhost", 1978))
{
 my $ecode = $rdb->ecode();
 die ("open error: %s\n", $rdb->errmsg($ecode));
}

$rdbオブジェクトのputメソッドで、キーとバリューを指定します。いくつか登録して見ましょう。

$rdb->put("name", "Wakimoto");
$rdb->put("address", "Yokohama");
$rdb->put("phone", "090xxxxxxxx");

getメソッドでキーを指定してバリューを取り出します。

表示して終了します。

print "name:", $name, "\n";
print "address:", $address, "\n";
print "phone:", $phone, "\n";

簡単ですね!

次回は、分散環境を交えて動かしてみたいと思います。

おすすめ記事

記事・ニュース一覧