Tokyo Cabinet

とりあえず触ってみました。全然大したことしてませんが。仕事から帰って調子悪いなーと思ったらどうも風邪っぽいような。作業場所が丁度下の通気口から冷却風が出ていた場所でかなり寒かったです。客先だったから薄手のスーツだったし、あれが良くなかったんやろうな...。DCはサーバ、ルータ様には優しい環境でも人には優しい環境ではないですね。まあサーバ、ルータ様のためなので仕方ありません。寒い方が正しいのです。それにしても鼻水が止まらん。(。´Д⊂) まさか風邪じゃなくて花粉症とかじゃないだろうな...。

Tokyo Cabinetインストール

$ wget http://jaist.dl.sourceforge.net/sourceforge/tokyocabinet/tokyocabinet-1.4.18.tar.gz
$ tar zxvf tokyocabinet-1.4.18.tar.gz
$ cd tokyocabinet-1.4.18
$ ./configure
$ make
$ su
# make install

perl API インストール

make testしてみたらlibtokyocabinet.soがみつかんないって怒られたので、/usr/local/libを追加

# vi /etc/ld.so.conf

/usr/local/lib
include ld.so.conf.d/*.conf

# ldconfig

インストール

$ wget http://tokyocabinet.sourceforge.net/perlpkg/tokyocabinet-perl-1.26.tar.gz
$ tar zxvf tokyocabinet-perl-1.26.tar.gz
$ cd tokyocabinet-perl-1.26
$ perl Makefile.PL
$ make test
$ su
# make install

コード

tokyo cabinetはデータ形式として以下の3つをサポートしてるらしいです。とりあえずハッシュで。

  • ハッシュデータベース
  • B+木データベース
  • テーブルデータベース
#!/usr/bin/perl                                                                                                                                             

use strict;
use warnings;

use Readonly;
use TokyoCabinet;

Readonly my $DB_FILE=>'/var/tmp/cabinet.hdb';
my $hdb;

$hdb = TokyoCabinet::HDB->new();

# DBオープン                                                                                                                                                
$hdb->open($DB_FILE, $hdb->OWRITER | $hdb->OREADER) || &print_error;

# データ書き込み                                                                                                                                            
$hdb->put("key", "value") || &print_error;
$hdb->put("name", "mind") || &print_error;

# データ取り出し                                                                                                                                            
&print_value('key');
&print_value('name');

# valueの出力                                                                                                                                               
sub print_value {
    my $key = shift;

    my $value = $hdb->get($key);

    if(defined($value)) {
        print "key: $key -> value: $value\n";
    }else{
        &print_error;
    }
}

# エラー出力                                                                                                                                                
sub print_error {
    my $ecode = $hdb->ecode();
    print $hdb->errmsg($ecode) . "\n";
}

DBデータは先に作っておきます。openする際のオプションにOCREATを指定しておけばファイルがない際に作ってくれるそうな。今回はつけてません。
APIのリファレンスはこちら。つ http://tokyocabinet.sourceforge.net/perldoc/

$ touch /var/tmp/cabinet.hdb

実行結果

key: key -> value: value
key: name -> value: mind

これだけだとあまりに普通ですね。API使ってみただけなので。まあTokyo Tyrantを使ってリモートアクセスする方が実用的な処理かと思うのでそっちを試してみたいですね。Tokyo TyrantMySQLを模したHA構成用の機能が携わっているようで、バイナリログ的な差分ログによるリカバリも、レプリケーションもできるみたいです。こちらにその辺りの話に触れているエントリがありました。

http://alpha.mixi.co.jp/blog/?p=147

上記を見る限りでは負荷分散も考慮してデュアルマスタを用途毎に複数にわけているみたいですね。WEB+DB pressでも触れてたかな。興味深いです。よーしパパXenで (ry
実験用にVMWare ESXiいれれるくらいのスペックのマシンが欲しいなー。最低構成やとどの位で作れるやろう...。今なら十数万くらいかなぁ。特に負荷かけなければ8個くらいならゲストOS動かせると思うんですよねー。やっぱ実験する上では仮想はかなり便利だなぁと思う今日この頃です。本番で動かすならやっぱり実機でってのはあるでしょうけど、使ってる限りでは結構安定してますよVMは。