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

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

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

スタンドアローン(単一ノード)で試す

本連載の第1回で述べたように,スケーラビリティやアベイラビリティ,信頼性などのKaiの利点は,複数ノードでクラスタを構築してこそ発揮されるのですが,説明を簡略化する為に,スタンドアローン(単一ノード)で説明します。

スタンドアローンで起動したKaiはmemcachedと似た動作をします。

次のコマンドを実行すると,Kaiが起動します。

なお,コマンドは,必ずKaiをコンパイルしたディレクトリで実行してください。また,TCPポート11211をListenするので,memcachedが既に起動している場合は,予め停止しておいてください。

$ erl -pa ebin -config kai -kai n 1 -kai r 1 -kai w 1 -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-20 21:58:29.439952 [info] (<0.43.0>) ./kai_hash.erl:183: {update,
                                                                  [{{{192,168,1,2},11011},
                                                                    [{number_of_virtual_nodes,
                                                                      128}]}],
                                                                  []}
1>

この状態で,TCPポート11211をListenしています。Erlang VMのコンソールを終了するとKaiも終了してしまうので気をつけてください。

ここで利用したerlコマンドの引数の意味は, 次の通りです。

引数説明
-paErlang VMが参照するオブジェクトコードのパスを指定できます。
Kaiのコンパイル済みコードファイルは,"./ebin" 配下に存在する為 "ebin" を指定します。
-config設定ファイル名を指定できます。
設定ファイルには,アプリケーションが参照する設定が記述されています。 ここでは,"./kai.config" を使用する為 "kai" を指定します。MemcachedプロトコルをTCPポート11211でListenする設定などが記述されています。kai.configの設定項目については,本連載の第3回で説明します。
-kaiKaiが参照する設定を指定できます。
ここで指定された値は,-configで指定されて読み込まれた設定ファイルの設定値を上書きするため,一時的な設定値を試す際などに使用できます。
必ず "-kai name value" の形式で指定します
n r w本連載第1回で説明のあったQuorumベースプロトコルの値を設定できます。
ここでは,スタンドアローンで動作させる為に,N:R:W = 1:1:1 を指定します。Quorumに設定する値は,本連載の第3回で説明します。
-evalErlang VM起動直後に評価する式を指定できます。
Kaiは,Erlang VMのコンソール上で次の式を評価する事で起動します。
"application:start(kai)."

では,動作確認のため,データ(Key/Value のペア)を保存後に取得してみます。

Telnetを使用する接続する例は,本連載の第1回を参照いただくとして,ここではPerlのCache::Memcachedを使用して説明します。

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

リスト1 kai_test.pl

#!/usr/bin/env perl

use strict;
use warnings;

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

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

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

$mem->delete('foo');
ok !$mem->get('foo');

my $nested_value = {
    hash_ref  => {qw(a b c d)},
    array_ref => [1..5],
};

$mem->set(baz => $nested_value, 0);
is_deeply $mem->get('baz'), $nested_value;

ソースコードをご覧いただければ分かるとおり,memcached専用のクライアント経由でデータを保存・取得・削除できるため,既にmemcachedをご利用されている方であれば,Perl以外の他の言語であっても,容易にクライアントサイドを実装できるのではないでしょうか。

ただしKaiでは,addやreplaceをサポートしていない点と,期限(expiration time)として必ず0を指定する必要がある点を注意してください。

なお,将来的には,getsやcasに対応する予定です。

では,実行してみましょう。

$ /path/to/kai_test.pl
1..3
ok 1
ok 2
ok 3

このような実行結果となれば,memcachedプロトコルを用いたデータの保存・取得・削除が正常に行えています。

著者プロフィール

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

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

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