分散Key/Valueストア,Kaiを使ってみよう!

第2回 Kai の基礎 ─Kaiのインストールと基本的な使い方

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

保存データを永続化する

Kaiでは,データをディスク上に保存する事で永続化する事もできます。

これにより,一度Kaiのクラスタ全体を停止したとしても,再起動した際に,停止前に保存したデータを再び利用する事ができます。

ただし,後述のようにクラスタ構成によってデータを複製することにより,データの保存先にメモリを指定しても,クラスタ全体としてはデータが永続化されています。

基本的にKaiで保存先にディスクを指定するのは,念には念を入れたい場合や,何らかの事情でクラスタ全体を停止したい場合となります。

では,まず始めに kai.config を元に,次のような設定ファイルを作成し,kai_dets.configという名前で保存してください。

リスト2 kai_dets.config

[{kai, [
    {rpc_port, 11011},
    {rpc_max_processes, 30},
    {memcache_port, 11211},
    {memcache_max_processes, 10},
    {max_connections, 32},
    {n, 1},
    {r, 1},
    {w, 1},
    {number_of_buckets, 1024},
    {number_of_virtual_nodes, 128},
    {store, dets},
    {dets_dir, "/path/to/kai-0.4.0/data"},
    {number_of_tables, 256}
]}].

kai_dets.configが,元となるkai.configと異なる点は次の通りです。

設定名変更前の値変更後の値
storeetsdets
dets_dir "/path/to/kai-0.4.0/data"

Erlangには,Erlang VM上のプロセス間でデータを共有する手段として,etsとdetsというデータストレージがあり,それぞれ,etsはメモリ上,detsはディスク上にデータを保存します。

Kaiは,内部のデータストレージとしてetsとdetsを採用しており,環境変数storeで,どちらのデータストレージを使うのかをノード毎に指定する事ができます。

また,環境変数storeにdetsを指定した場合,必ず環境変数dets_dirでKaiにディスク上のデータの保存先を指定する必要があります。

次に,dets_dirで指定した保存先のディレクトリを作成します。

$ mkdir -p /path/to/kai-0.4.0/data

以上で,データを永続化する準備が整いましたので,Kaiを起動します。

$ erl -pa ebin -config kai_dets -eval 'application:start(kai).'
Erlang R13B (erts-5.7.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.1  (abort with ^G)
2009-05-24 01:46:49.832265 [info] (<0.43.0>) ./kai_hash.erl:183: {update,
                                                                  [{{{192,168,1,2},11011},
                                                                    [{number_of_virtual_nodes,
                                                                      128}]}],
                                                                  []}
1>

筆者がMac OSX 10.5上でこれを試したところ,EMFILEエラーが発生しました。その場合,プロセスが開けるファイル数の上限に達しているので,設定ファイル内の環境変数number_of_tablesを 256から128などに変更して回避してください。

それでは,本当に保存データが永続化されているか試してみましょう。

まず始めに,起動したばかりのKaiにデータを保存します。次のようなPerl Scriptを用意し,kai_test_dets.plという名前で保存してください。

リスト3 kai_test_dets.pl

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More tests => 1;
use Cache::Memcached;

my $mem = Cache::Memcached->new({
    servers => ['127.0.0.1:11211'],
});

$mem->set(foo => 'bar', 0,);
is $mem->get('foo'), 'bar';

用意したPerl Scriptを実行し,データをKaiに保存してください。

$ /path/to/kai_test_dets.pl
1..1
ok 1

次に,Kaiを停止してから再起動します。

1> q().
ok
$ erl -pa ebin -config kai_dets -eval 'application:start(kai).'

最後に,再起動したKaiから停止前に保存したデータを取得できる事を確認します。

次のようなPerl Scriptを用意し,kai_test_dets_get.plという名前で保存してください。

リスト4 kai_test_dets_get.pl

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More tests => 1;
use Cache::Memcached;

my $mem = Cache::Memcached->new({
    servers => ['127.0.0.1:11211'],
});

is $mem->get('foo'), 'bar';

用意したPerl Scriptを実行し,データを取得してください。

$ /path/to/kai_test_dets_get.pl
1..1
ok 1

このような実行結果となれば,停止前に保存したデータの取得が正常に行えています。

著者プロフィール

幾田雅仁(いくたまさひと)

酪農,ゴルフのキャディさん,某大手パソコン通信の下請け,某大手ポータルサイトなどを経て,決済代行を生業とする株式会社ゼロに入社。

p2p?なにそれ?美味しいの?の状態で,Erlang 分散処理勉強会に参加し,Kai のプレゼンを見て感銘を受け,無理矢理開発に参加し,現在に至る。