はじめに
今回は,永続性key-valueストアの代表としてTokyoTyrantを取り上げます。TokyoTyrantというのはTokyoCabinetのネットワークインタフェースです。名前が似ていてわかりにくいですが,TokyoCabinetがkey-valueストアの機能(データの保存や読み出し)を持ったデータストレージであり,TokyoTyrantはTokyoCabinetをネットワーク越しに操作できるようにしたラッパーです。キャビネット(内閣)を傀儡にするタイラント(僭主)ということで,このような名前が付けられたそうです。
今回も利用したコードやプログラムはgithubに置いてあるので適宜参照してください。
TokyoTyrantの特徴
key-valueストアという点ではmemcachedと同じですが,TokyoTyrantサーバを停止してもデータが消えない(データの永続性がある)ことが最大の特徴です。 expiresを設定することはできませんが,それ以外はほぼmemcachedと同じように扱えます。
また,TCHDB(ハッシュデータベース,※1),TCTDB(テーブルデータベース,※2)などといった様々なデータ型があり,それらを用途に応じて使い分けることができることも特徴です(※3)。
表1 それぞれのデータ型に対応するクラス名とファイル名
| データ型 | TokyoTyrant | TokyoCabinet | ファイル名 |
|---|---|---|---|
| ハッシュデータベース | RDB | HDB | *.tch |
| テーブルデータベース | RDBTBL | TDB | *.tct |
| B+treeデータベース | RDB | BDB | *.tcb |
| オンメモリデータベース | RDB | ADB | * |
- ※1
- 単純なkey-valueストア。
- ※2
- 一つのkeyに複数のvalueを持たせてRDBMSのように扱えます。
- ※3
- データ型に応じたファイル名を指定する必要があります。
どんなところに使える?
もっとも簡単な利用方法は,前回紹介したmemcachedの代替として利用するというものです。memcached互換プロトコルが実装されているため,memcachedを利用している場合ポート番号を変えるだけでTokyoTyrantに差し替えることが可能です。これだけで簡単にデータの永続性が得られます。
また,テーブルデータベースを利用すれば一つのkeyに対して複数のvalueを持たせることが可能であり,keyだけでなく任意のvalueを条件としてデータの検索を行うこともできます。JOINやGROUP BYといった処理は行えませんが,それ以外のほとんどの検索条件を扱えます。レスポンスはRDBMSに比べて高速なので,アクセス数が多いテーブルをTokyoTyrantのテーブルデータベースに載せ換える,といった利用方法も効果的かもしれません。
- 具体的な利用シーン
- memcachedの代替としての利用
- 複雑な検索条件を用いつつも高速なレスポンスが要求される
TokyoCabinetを試す
さて,まずはTokyoCabinetを試してみます。TokyoCabinetはvalueとして文字列しか扱えません。配列やハッシュなどをvalueとして保存したい場合には,明示的にシリアライズ(取り出すときにはデシリアライズ)してあげる必要があります。
リスト1 TokyoCabinetを使った具体的なコード例
class TokyocabinetController < ApplicationController
require 'json'
require 'tokyocabinet'
include TokyoCabinet
before_filter :do_init
after_filter :do_finalize
def set
@hdb['key1'] = 100
@hdb['key2'] = ["foo", "bar"].to_json
@hdb['key3'] = {"a" => "ほげ", "b" => "ふが"}.to_json
end
def get
p @hdb['key1'] # "100"
p JSON.parse(@hdb['key2']) # ["foo", "bar"]
p JSON.parse(@hdb['key3']) # {"a" => "ほげ", "b" => "ふが"}
end
private
def do_init
@hdb = HDB.new # ハッシュデータベースを指定
@hdb.open('sample.tch', HDB::OWRITER | HDB::OCREAT)
end
def do_finalize
@hdb.close
end
end
TokyoTyrantを試す
TokyoCabinetでデータの保存や読み出しが出来ることが確認できました。しかし,TokyoCabinetではネットワーク越しのアクセス(例えば別サーバにアクセスするなど)ができません。これを実現するものがTokyoTyrantです。
では,TokyoTyrantを利用してみましょう。前回と同じように,localhostに3台のTokyoTyrantサーバを別々のポートで起動してみます。
プロンプト1 ハッシュデータベース用のTokyoTyrantサーバを別々のポートで複数起動する
sudo ttserver -port 1978 -pid /var/ttserver/pid_1978 -dmn /var/ttserver/ttcache_1978.tch sudo ttserver -port 1979 -pid /var/ttserver/pid_1979 -dmn /var/ttserver/ttcache_1979.tch sudo ttserver -port 1980 -pid /var/ttserver/pid_1980 -dmn /var/ttserver/ttcache_1980.tch

