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の環境を作成し、使用してみたいと思います。
OS CentOS_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.
#================================================================
正常に終了しました。
続いて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
コマンド1 && コマンド2
という風に書くことでコマンドを続けて実行させることができます。&&を使用することで、コマンド2はコマンド1が正常終了した場合にのみ実行されます。
コマンド1 || コマンド2
こうやると、コマンド1が異常終了したときにコマンド2が実行されます。
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";
簡単ですね!
次回は、分散環境を交えて動かしてみたいと思います。