Tokyo Tyrantとは
Key-Value Store(KVS)の一種で、DBMSよりも高速にデータを読み書きすることができるため、
キャッシュ情報などの頻繁に更新されるデータの保存に使用される
Tokyo TyrantはTokyo Cabinetと組み合わせて使い、Tokyo Cabinetは実際にデータを読み書きするファイルコンテナで、
Tokyo Tyrantはそれを操作するためのインタフェースを提供する
ここでは便宜上、Tokyo TyrantとTokyo Cabinetを組み合わせて構成したものをTokyo Tyrantと表記する
URL
Tokyo Tyrant: network interface of Tokyo Cabinet
http://fallabs.com/tokyotyrant/
DBMによるテーブルデータベース その参 (Mixi::Engineers::Blog)
http://alpha.mixi.co.jp/entry/2009/10705/
インストール
バージョン
- Tokyo Cabinet: 1.4.48
- Tokyo Tyrant: 1.1.41
configure
インストール先を${PREFIX_DIR}で指定しています。ここでは以下の設定をしていますが、環境に合わせて適宜変更(/usrや/usr/localなど)してください
PREFIX_DIR=/opt/tokyotyrant
- Tokyo Cabinet
./configure \
--prefix=${PREFIX_DIR} \
--libdir=${TARGETLIB_DIR} \
--sysconfdir=${PREFIX_DIR}/conf \
--localstatedir=${PREFIX_DIR}/var \
--enable-shared \
--disable-debug \
--disable-devel
- Tokyo Tyrant
./configure \
--prefix=${PREFIX_DIR} \
--libdir=${TARGETLIB_DIR} \
--sysconfdir=${PREFIX_DIR}/conf \
--localstatedir=${PREFIX_DIR}/var \
--with-tc=${PREFIX_DIR} \
--enable-shared \
--disable-debug \
--disable-devel
make
$ make
# make install
コマンドによるデータベース操作
- 値を取得
$ tcrmgr get localhost ${key}
- 値をセット
$ tcrmgr put localhost ${key} ${value}
- 値を削除
$ tcrmgr out localhost ${key}
- 登録されている全てのキーを取得
$ tcrmgr list localhost
- 登録されている全てのデータのキーと値を取得
$ tcrmgr list -pv -sep '|' localhost
- データを全て削除する
$ tcrmgr vanish localhost
- データベースを最適化する
$ tcrmgr optimize localhost
データ構造
ファイルのサフィックスで変わる。ttserver起動時に指定する
例) tctを指定してtable database型で動作
$ ttserver /tmp/ttserver.tct
サフィックス | 形式 |
---|---|
指定なし | hash database |
+ | tree database |
.tch | hash database |
.tcb | tree database |
.tcf | fixed length database |
.tct | table database |
データ構造については以下のページを参考 (slide shareの17ページ目)
http://www.akirakoyasu.net/2011/12/11/tokyo-cabinet-and-tokyo-tyrant/
C言語API
fallabsの サンプルコード を見れば基本的な使い方が分かる
APIの仕様については、Tokyo Tyrantの tcrdb.h を確認すればよい
- レコードを格納する(上書きモード)
bool tcrdbtblput(TCRDB *rdb, const void *pkbuf, int pksiz, TCMAP *cols);
- レコードを格納する(既存値優先モード)
bool tcrdbtblputkeep(TCRDB *rdb, const void *pkbuf, int pksiz, TCMAP *cols);
- レコードを格納する(カラム追加モード)
bool tcrdbtblputcat(TCRDB *rdb, const void *pkbuf, int pksiz, TCMAP *cols);
- レコードを削除する
bool tcrdbtblout(TCRDB *rdb, const void *pkbuf, int pksiz);
- レコードを取得する
TCMAP *tcrdbtblget(TCRDB *rdb, const void *pkbuf, int pksiz);
- コラムインデックスを設定する
bool tcrdbtblsetindex(TCRDB *rdb, const char *name, int type);
- ユニークなID番号を採番する
int64_t tcrdbtblgenuid(TCRDB *rdb);
- クエリオブジェクトを生成する
RDBQRY *tcrdbqrynew(TCRDB *rdb);
- クエリオブジェクトを破棄する
void tcrdbqrydel(RDBQRY *qry);
- クエリオブジェクトに絞り込み条件を追加する
void tcrdbqryaddcond(RDBQRY *qry, const char *name, int op, const char *expr);
- クエリオブジェクトに結果の順序を設定する
void tcrdbqrysetorder(RDBQRY *qry, const char *name, int type);
- クエリオブジェクトに結果の最大取得件数を設定する
void tcrdbqrysetmax(RDBQRY *qry, int max);
- 検索を行って主キーのリストを取得する
TCLIST *tcrdbqrysearch(RDBQRY *qry);
- 検索を行って該当のレコードを削除する
bool tcrdbqrysearchout(RDBQRY *qry);
レプリケーション構築
準備
- マスタの更新ログ置き場を用意する
マスタ側
$ mkdir /tmp/ulog-master
- スレーブの更新ログ置き場を用意する
スレーブ側
$ mkdir /tmp/ulog-slave
起動
- マスタの起動
$ ttserver -port 1978 -sid 1 -ulog /tmp/ulog-master /tmp/casket-master.tch
- スレーブの起動
$ ttserver -port 1979 -sid 2 -ulog /tmp/ulog-slave -mhost %%master_host%% -mport 1978 -rts /tmp/slave.rts /tmp/casket-slave.tch
※ %%master_host%% はマスタのホスト名(またはIPアドレス)に置き換えてください
※ 複数のスレーブを立てる場合は"-sid"の値が被らないように、任意の値を割り当ててください
確認
- マスタにデータを登録
$ tcrmgr put -port 1978 %%master_host%% tako ika
※ %%master_host%% はマスタのホスト名(またはIPアドレス)に置き換えてください
- マスタのデータを検索
$ tcrmgr get -port 1978 %%master_host%% tako
※ %%master_host%% はマスタのホスト名(またはIPアドレス)に置き換えてください
- スレーブのデータを検索
$ tcrmgr get -port 1979 %%slave_host%% tako
※ %%slave_host%% はスレーブのホスト名(またはIPアドレス)に置き換えてください
参考
Tokyo TyrantによるHAハッシュDBサーバの構築
http://alpha.mixi.co.jp/entry/2008/10692/