Tokyo Cabinet

Tokyo Cabinet について。利用前に情報はりつけ。

  • Tokyo Cabinet

Tokyo Cabinetはデータベースを扱うルーチン群のライブラリです。データベースといっても単純なもので、キーと値のペアからなるレコード群を格納したデータファイルです。キーと値は任意の長さを持つ一連のバイト列であり、文字列でもバイナリでも扱うことができます。テーブルやデータ型の概念はありません。レコードはハッシュ表かB+木か固定長配列で編成されます。

http://tokyocabinet.sourceforge.net/

ライセンス:GNU Lesser General Public License(released under LGPL)

http://tokyocabinet.sourceforge.net/tokyoproducts.pdf

ハッシュ表のデータベース

  • キーはデータベース内で一意
  • キーと値を指定してレコードを格納したり
  • キーを指定して対応するレコードを削除したり
  • キーを指定して対応するレコードを検索
  • 格納してある全てのキーを順不同に一つずつ取り出す
  • 効率的なハッシュデータベースの実装
    • 例えば100万個のレコードを格納するためには50万要素のバケット配列が求められます
    • バケット配列の各要素は4バイトです
    • すなわち、2MバイトのRAMが利用できれば100万レコードのデータベースが構築

B+木のデータベース

  • キーが重複する複数のレコードを格納可能
  • レコードはユーザが指示した比較関数に基づいて整列されて格納
  • カーソルを用いて各レコードを昇順または降順で参照
  • 文字列の前方一致検索や数値の範囲検索が可能
  • 便利なB+木データベース
    • ハッシュデータベースより遅い
    • ユーザが定義した順序に基づいて各レコードを参照できる
    • ほとんどの場合、ハッシュデータベースに較べてデータベースファイルのサイズが半減
    • データベースの規模が大きくディスクI/Oがボトルネックとなる場合は、圧縮機能を有効化すると処理速度が大幅に改善

固定長配列のデータベース

  • 一意な自然数をキーとしてレコードが格納
  • キーが重複する複数のレコードを格納することはできません
  • 各レコードの値の長さは一定以下に制限
  • 提供される操作はハッシュデータベースとほぼ同様
  • 素朴な固定長データベースの実装
    • キーが自然数でなくてはならず、また値のサイズが制限
    • 固定長データベースはハッシュデータベースよりもさらに高速に動作
    • マルチスレッド環境での並列実行性能も傑出
    • データベースのサイズは、キーの変域と値の制限長に比例
      • キーの変域が小さく、値のサイズが小さいほど、空間効率は向上
      • キーの最大値が100万で、値の制限長が100バイトの場合、データベースのサイズは100MB

テーブルのデータベース

  • ハッシュ表のデータベース変種
  • 各レコードは主キーで識別
  • 名前付きコラムの集合を値として持ち
  • 任意のコラムに張られたインデックスを用いることで複雑な条件に基づくレコードの検索を効率化
  • 柔軟なテーブルデータベースの実装
    • リレーショナルデータベースの表のような構造を表現
    • 各レコードは主キーで識別されるとともに、任意の文字列で名前を付けられたコラムの集合を値として持ち
    • 例えば、社員番号を主キーにして、名前や部署や給与などのコラムを構造化して格納することができます
    • リレーショナルデータベースと違ってデータスキーマを事前に定義する必要はなく、レコード毎に異なる種類のコラムを持たせることができます
    • 主キー以外の条件でも問い合わせを行うことができます
    • インデックスはB+木データベースの外部ファイルとして実装
  • Tokyo Cabinetは高速に動作します。
    • 例えば100万件のレコードの登録にかかる時間
    • ハッシュデータベースで0.7秒ほど
    • B+木データベースで1.6秒ほどです。
  • Tokyo Cabinetのデータベースは小さいです。
    • 例えば1レコードあたりのオーバーヘッドは、ハッシュデータベースで16バイトほど
    • B+木データベースで5バイトほどです。
    • さらにTokyo Cabinetで扱えるデータの規模は莫大です。
      • 最大8EB(9.22e18バイト)までのデータベースファイルを扱うことができます。
  • 実用的な機能性
  • データベースに接続するモード
    • 「リーダ」と「ライタ」の二種類
    • リーダは読み込み専用
    • ライタは読み書き両用
    • データベースにはファイルロックによってプロセス間での排他制御が行われます
      • ライタが接続している間は、他のプロセスはリーダとしてもライタとしても接続できません
      • リーダが接続している間は、他のプロセスのリーダは接続できるが、ライタは接続できません
      • この機構によって、マルチタスク環境での同時接続に伴うデータの整合性が保証
  • 単純だが多様なインタフェース群
    • 開く(open)、閉じる(close)、挿入する(put)、削除する(out)、取得する(get)といった関数(メソッド)を呼ぶことでプログラミングを進めていけます
    • ハッシュデータベースとB+木データベースと固定長データベースのAPIは互いに酷似
    • API群を全く同じインターフェイスで操作するための抽象APIも提供
    • 抽象APIを用いると実行時にデータベースの種類を決定することができます
    • メモリ上でレコードを簡単に扱うために、ユーティリティAPIが提供
    • 複数のプロセスが同時にデータベースを操作したい場合やリモートホストにあるデータベースを操作したい場合には、リモートサービスを使うと便利

抽象データベースAPI

  • 抽象データベースは、オンメモリハッシュデータベースとオンメモリツリーデータベースとハッシュデータベースとB+木データベースと固定長データベースとテーブルデータベースを同一のAPIで抽象化したデータベース
    • 抽象データベースAPIです。`tcadb.h' にAPIの仕様の完全な記述

バックアップ

  • データベースが更新中でないこと確認してからバックアップ作業を行うことが必要
  • データベースファイルのバックアップは、通常のファイルと同様にcpやtarやcpioといったコマンドで行うことができます
  • ただし、ライタとして接続しているプロセスがデータベースを更新中である場合、コピー元のファイルの状態が中途半端になっている可能性があるため、コピー先のファイルに不整合が起きる場合があります

テーブルデータベースの仕組み

  • 複数の列からなるレコードを格納できるデータベース
  • ハッシュデータベースのように主キーでレコードを識別しながらも、リレーショナルデータベースのようにレコード内に名前をつけた複数のコラムを持たせることができます
  • リレーショナルデータベースとは違って、あらかじめスキーマを定義する必要がなく、レコード毎に異なる種類のコラムを持たせることができます
  • レコードの検索は、合致条件や順序指定を組み合わせたクエリオブジェクトをデータベースに渡すことで実行

抽象データベース

  • ハッシュデーターベースかB+木データベースかを実行時に決定したい場合には、抽象データベースAPIを使う

抽象データベースによるテーブル操作

  • 抽象データベースの接尾辞に ".tct" をつけるとテーブルデータベースになります

リモートインターフェイス

  • データベースサーバとそれに接続するためのライブラリが別パッケージ「Tokyo Tyrant」として提供
  • Tokyo Tyrantのサーバは抽象データベースを扱うので、Tokyo Cabinetの全種類のデータベースをリモートインターフェイスで操作することができます