Dinio - Distributed Data Store for Nesta/IO

Dinio とは

Dinio は memcached プロトコルに対応したキー・バリュー型データストアである Nesta/IO に分散データストアの機能を提供するサーバー製品です。

複数のデータストア(Nesta/IO)をノード(実態はプロセスです)として管理することで大量のデータを扱う事が可能になります。 Dinio は論理的に 1,000台までのデータストアを管理することが可能です。

分散データストア Dinio は以下の特徴を備えています。

データストアの追加や削除はシステムを停止することなく行うことができます。
また、データストアの追加や削除が行われた時点で自動的にノード間でデータの再配分が行われます。このデータの再配分を行っているときは、対象となるデータストアが分散ロックメカニズムによって一時的にロックされますのでデータの一貫性が保たれます。

Dinio はデータの複製を作成するレプリケーション機能を備えています。
レプリケーション機能を用いることでどこかのデータストアが障害を起こしても複製を持つデータストアから目的のデータを取り扱うことが可能になります。標準の設定では3カ所のデータストアにデータを書き込みます。このことでバックアップを必要としないデータベースを実現しています。
レプリケーションはキューイングされてバックエンドのスレッドで実行されるため、メインスレッドの性能に影響を与えない設計になっています。コンフィグレーションによってはデータの更新と同期してレプリケーションを行う設定も可能です。

Dinio はマスタサーバーを必要としないため単一障害点が存在しません。
一つの Dinio を複数のアプリケーションから共有する事も可能です。また、アプリケーションごとに専用の Dinio を用意することでパフォーマンスが向上します。 データストアの情報は複数の Dinio 間で共有しています。データストアの追加や削除などが発生した場合はデータストアの情報が Dinio 間で瞬時に通知されます。
データストアの情報を共有する Dinio のサーバー情報はコンフィグレーションファイルの dinio.friend_file で定義します。

クライアントからのインターフェイスは memcached プロトコルになります。
プログラムは C言語で記述されているので Linux, Mac OS/X および Windows で動作します。

Dinio と Nesta/IO のインターフェイスも memcached プロトコルです。 ただし、レプリケーションやノード間でのデータの再配分を効率よく処理するために独自のコマンドを拡張しています。

ダウンロード

ライセンスは MIT License になります。

nestalib:  nestalib-0.9.4.tar.gz
Nesta/IO:  nestaio-0.3.1.tar.gz
Dinio:  dinio-0.3.1.tar.gz

インストール

UNIX 系 OS 上では以下のようにインストールします。
nestalib をインストールした後に Nesta/IO と Dinio をインストールします。

Nesta/IO とDinio を同じコンピュータにインストールする場合はどちらかのポート番号を変更する必要があります。Nesta/IO と Dinio のポート番号はデフォルトで 11211 になっています。

1. nestalib のインストール
デフォルトではライブラリが /usr/local/lib にヘッダーファイルが /usr/local/include/nestalib にインストールされます。

$ tar zxvf nestalib-0.9.4.tar.gz
$ cd nestalib-0.9.4
$ ./configure
$ make
$ sudo make install

2. Nesta/IO のインストール

$ tar zxvf nestaio-0.3.1.tar.gz
$ cd nestaio-0.3.1
$ ./configure
$ make

3. Dinio のインストール

$ tar zxvf dinio-0.3.1.tar.gz
$ cd dinio-0.3.1
$ ./configure
$ make

Windows では展開したディレクトリに Visual Studio C++ 2008 Express(無償版) のプロジェクトファイルがあるのでそれをお使いください。

Nesta/IO の起動と終了

【起動方法】

$ cd nestaio-0.3.1
$ ./nestaio [-start] [-f conf.file]

【終了方法】

$ ./nestaio -stop [-f conf.file]

Dinio の起動と終了

【起動方法】

$ cd dinio-0.3.1
$ ./dinio [-start] [-f conf.file]

【終了方法】

$ ./dinio -stop [-f conf.file]

【その他の起動パラメータ】
以下のコマンドは Dinio を起動したコンピュータでしか実行できません。

$ ./dinio -status [-f conf.file]

$ ./dinio -add IPアドレス [ポート番号(11211) [スケールファクタ(100)]] [-f conf.file]

$ ./dinio -remove IPアドレス [ポート番号(11211)] [-f conf.file]

$ ./dinio -unlock IPアドレス [ポート番号(11211)] [-f conf.file]

$ ./dinio -hash キー値 [キー値 ...] [-f conf.file]

$ ./dinio -import ファイル名 [-f conf.file]

コンフィグレーション

コンフィグレーションは Dinio を展開したディレクトリの conf/dinio.conf を修正します。
conf/dinio.conf の修正を反映させるにはプログラムを再起動する必要があります。

パラメータ名 内容 デフォルト
dinio.daemon 数値 デーモンとして動作させる場合は 1 を指定します。
Windows では無効です。
1
dinio.username 文字列 ユーザーを切り替える場合のユーザー名を指定します。
Windows では無効です。
なし
dinio.port_no 数値 memcached コマンドを受け付ける TCP/IP のポート番号を指定します。 11211
dinio.backlog 数値 接続キューの数を指定します。 100
dinio.worker_threads 数値 ワーカスレッドの数を指定します。
CPU コア数 + 2 以上の値を推奨します。
8
dinio.dispatch_threads 数値 コマンドを実行するスレッドの数を指定します。
ワーカスレッドの数の2倍ぐらいの値を推奨します。
20
dinio.error_file 文字列 エラーログのファイル名を指定します。 標準エラー
dinio.output_file 文字列 出力ログのファイル名を指定します。 標準出力
dinio.trace_flag 数値 動作状況を標準出力に出力する場合は 1 を指定します。 0
dinio.datastore_timeout 数値 データストアからのレスポンスのタイムアウト時間をミリ秒で指定します。 3000
dinio.lock_wait_time 数値 データストアがロックされていた場合にロックが解除されるまでの最大待ち時間を秒で指定します。 180
dinio.active_check_interval 数値 データストアを監視するチェック間隔を秒で指定します。 60
dinio.auto_detach 数値 データストアが動作していない場合に自動的にコンシステント・ハッシュのリングから削除を行う場合は 1 を指定します。
データストアが削除されるとデータの再配分も自動的に行われます。
指定しない場合はデータストアのステータスが INACTIVE に変わるだけです。
0
dinio.pool_init_conns 数値 データストアとのコネクション数を指定します。
すべてのデータストアとのコネクションをここで指定された数分プールして利用します。
10
dinio.pool_ext_conns 数値 データストアとのコネクション数が dinio.pool_init_conns に達したときに拡張するコネクション数を指定します。コネクションは dinio.pool_init_conns に加えてここで指定した数まで拡張されます。 20
dinio.pool_ext_release_time 数値 拡張されたデータストアとのコネクションをクローズするまでの時間を秒数で指定します。
ここで指定された時間内にアクセスがない場合は拡張されたコネクションはクローズされます。
180
dinio.pool_wait_time 数値 プーリングされたデータストアとのコネクションを取得するまでの最大待ち時間を秒数で指定します。
ここで指定された時間内に空きコネクションがない場合はエラーになります。
10
dinio.server_file 文字列 データストアのサーバー情報を定義したファイル名を指定します。
サーバーのIPアドレス、ポート番号とサーバーの処理性能を示すスケールファクタを定義します。スケールファクタは標準を 100 として性能に応じて指定します。このスケールファクタが仮想ノード数になります。
./server.def
dinio.replications 数値 データストアのレプリケーション数を指定します。ここで指定した数だけ複製が作成されます。 2
dinio.replication_threads 数値 レプリケーションを実行するスレッドの数を指定します。レプリケーションは非同期で実行されます。
スレッド数にゼロを指定するとコマンドと同時にレプリケーションが実行されます。この場合はコマンドの応答時間が長くかかります。
3
dinio.replication_delay_time 数値 レプリケーションをバックエンドで非同期に実行する場合の遅延時間をミリ秒で指定します。
サーバーの処理性能が低い場合はこの値を調整します。
0
dinio.friend_file 文字列 データストアの情報を共有する Dinio のサーバー情報を定義したファイル名を指定します。
ファイルにはサーバーのIPアドレスとポート番号を記述します。
./friend.def
dinio.informed_port 数値 Dinio 間で情報のやり取りを行う TCP/IP のポート番号を指定します。 15432

ベンチマーク

Dinio のベンチマークを参考値として掲載しておきます。
ベンチマークプログラムには mcb を利用させていただきました。

ローカルホストに4つのデータストアを起動してレプリケーション数は標準の 2 で計測しました。書き込まれたデータは2箇所のデータストアに複製されます。

$ ./dinio
$ ./dinio -status

start 2011/01/21 09:42:45  running 4 datastore servers.
Status IP------------- PORT  #NODE #CONN #set------ #get------ #del------
[OK  ] 127.0.0.1       11221   100    10          0          0          0
[OK  ] 127.0.0.1       11222   100    10          0          0          0
[OK  ] 127.0.0.1       11223   100    10          0          0          0
[OK  ] 127.0.0.1       11224   100    10          0          0          0

【評価マシン】
MacBook Pro (CPU:Intel Core 2 Duo 2.26GHz, Memory:2GB)
Mac OS X 10.6 Snow Leopard (64-bit kernel)

【ベンチマーク内容】
・set:同時接続 100 でランダムなキーを生成し、データ長が約1,000バイトの set コマンドを1接続当たり 1,000回繰り返す。
・get:同時接続 100 でランダムなキーを生成し、get コマンドを1接続当たり 1,000回繰り返す。

command performance(#/sec)
$ ./mcb -c set -t 100 -n 1000 -l 1000 6,775
$ ./mcb -c get -t 100 -n 1000 8,984

制限事項


Author: YAMAMOTO Naoki
Last modified: 2011/02/11