NoSQLデータベースを試してみる

第3回 様々なデータ型を扱えるTokyoTyrant

この記事を読むのに必要な時間:およそ 4 分

はじめに

今回は,永続性key-valueストアの代表としてTokyoTyrantを取り上げます。TokyoTyrantというのはTokyoCabinetのネットワークインタフェースです。名前が似ていてわかりにくいですが,TokyoCabinetがkey-valueストアの機能(データの保存や読み出し)を持ったデータストレージであり,TokyoTyrantはTokyoCabinetをネットワーク越しに操作できるようにしたラッパーです。キャビネット(内閣)を傀儡にするタイラント(僭主)ということで,このような名前が付けられたそうです

今回も利用したコードやプログラムはgithubに置いてあるので適宜参照してください。

TokyoTyrantの特徴

key-valueストアという点ではmemcachedと同じですが,TokyoTyrantサーバを停止してもデータが消えない(データの永続性がある)ことが最大の特徴です。 expiresを設定することはできませんが,それ以外はほぼmemcachedと同じように扱えます。

また,TCHDB(ハッシュデータベース,※1),TCTDB(テーブルデータベース,※2などといった様々なデータ型があり,それらを用途に応じて使い分けることができることも特徴です※3)。

表1 それぞれのデータ型に対応するクラス名とファイル名

データ型TokyoTyrantTokyoCabinetファイル名
ハッシュデータベースRDBHDB*.tch
テーブルデータベースRDBTBLTDB*.tct
B+treeデータベースRDBBDB*.tcb
オンメモリデータベースRDBADB*
※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

著者プロフィール

佐々木達也(ささきたつや)

普段は主にHadoopを用いた大規模データ解析を行っている象使いエンジニア。最近はNoSQLデータベースにも興味を持っている。Ruby, Railsはもちろん、広島カープも大好き。

bloghttp://blog.livedoor.jp/sasata299/

twitterhttp://twitter.com/sasata299/

コメント

コメントの記入