LoginSignup
9
8

More than 5 years have passed since last update.

Tokyo Tyrant をC言語で使う

Last updated at Posted at 2014-12-04

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);
    

レプリケーション構築

準備

  1. マスタの更新ログ置き場を用意する

    
    マスタ側
    $ mkdir /tmp/ulog-master
    
  2. スレーブの更新ログ置き場を用意する

    
    スレーブ側
    $ 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"の値が被らないように、任意の値を割り当ててください

確認

  1. マスタにデータを登録

    
    $ tcrmgr put -port 1978 %%master_host%% tako ika
    

    ※ %%master_host%% はマスタのホスト名(またはIPアドレス)に置き換えてください
  2. マスタのデータを検索

    
    $ tcrmgr get -port 1978 %%master_host%% tako
    

    ※ %%master_host%% はマスタのホスト名(またはIPアドレス)に置き換えてください
  3. スレーブのデータを検索

    
    $ tcrmgr get -port 1979 %%slave_host%% tako
    

    ※ %%slave_host%% はスレーブのホスト名(またはIPアドレス)に置き換えてください

参考

Tokyo TyrantによるHAハッシュDBサーバの構築
http://alpha.mixi.co.jp/entry/2008/10692/

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8