今回からKaiの使い方を説明させて頂きます、
第2回目となる今回は、
Erlang のインストール
Kaiは、
Erlangは古くから存在する枯れた言語であるため、
プラットフォームとパッケージコマンドの例は、
プラットフォーム | パッケージコマンド例 |
---|---|
Fedora | yum install erlang |
Ubuntu, Debian | apt-get install erlang |
FreeBSD | portinstall erlang |
Mac OSX | port install erlang |
また、
ここでは、
なお、
もし、
Erlangのソースコードは、
ダウンロードページからR13Bのソースコード
Erlang のコンパイルは、
CentOS 5.
なお、
また、
$ wget http://www.erlang.org/download/otp_src_R13B.tar.gz $ tar -zxvf otp_src_R13B.tar.gz $ cd otp_src_R13B $ ./configure --enable-threads --enable-kernel-poll --enable-smp-support --enable-hipe --disable-jinterface --prefix=/usr/local/erlang $ make $ sudo make install
無事インストールが終わるとerlコマンドでErlang VMが起動し、
$ /usr/local/erlang/bin/erl
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)
1> q(). <- 終了コマンド
ok
これ以降は、
以上で、
Kaiのインストール
本連載が対象とするKaiのバージョンは、
Kaiのソースコードは、
KaiのプロジェクトページのタブメニューからDownload > Browse All Packagesと辿り、
現在のところ、
また、
$ svn co https://kai.svn.sourceforge.net/svnroot/kai/tags/0.4.0/ kai-0.4.0
$ cd kai-0.4.0
$ make <- FreeBSD であれば gmake
Makefileのターゲットとしてinstallは定義されていませんので、
また、
以上で、
スタンドアローン(単一ノード)で試す
本連載の第1回で述べたように、
スタンドアローンで起動したKaiは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] () ./kai_hash.erl:183: {update, [{{{192,168,1,2},11011}, [{number_of_virtual_nodes, 128}]}], []} 1>
この状態で、
ここで利用したerlコマンドの引数の意味は, 次の通りです。
引数 | 説明 |
---|---|
-pa | Erlang VMが参照するオブジェクトコードのパスを指定できます。 Kaiのコンパイル済みコードファイルは、 |
-config | 設定ファイル名を指定できます。 設定ファイルには、 |
-kai | Kaiが参照する設定を指定できます。 ここで指定された値は、 必ず "-kai name value" の形式で指定します |
n r w | 本連載第1回で説明のあったQuorumベースプロトコルの値を設定できます。 ここでは、 |
-eval | Erlang VM起動直後に評価する式を指定できます。 Kaiは、
|
では、
Telnetを使用する接続する例は、
次のようなPerl Scriptを用意し、
#!/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;
ソースコードをご覧いただければ分かるとおり、
ただしKaiでは、
なお、
では、
$ /path/to/kai_test.pl 1..3 ok 1 ok 2 ok 3
このような実行結果となれば、
保存データを永続化する
Kaiでは、
これにより、
ただし、
基本的にKaiで保存先にディスクを指定するのは、
では、
[{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_
設定名 | 変更前の値 | 変更後の値 |
---|---|---|
store | ets | dets |
dets_ | "/path/ |
Erlangには、
Kaiは、
また、
次に、
$ mkdir -p /path/to/kai-0.4.0/data
以上で、
$ 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.
それでは、
まず始めに、
#!/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を実行し、
$ /path/to/kai_test_dets.pl 1..1 ok 1
次に、
1> q(). ok $ erl -pa ebin -config kai_dets -eval 'application:start(kai).'
最後に、
次のようなPerl Scriptを用意し、
#!/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
このような実行結果となれば、
Erlang VMのコンソールをDetacheする
今のままでは、
erlコマンドには、
それぞれの引数の意味は次のとおりです。
引数 | 説明 |
---|---|
-sname | Erlangノードの名前を指定できます。名前を付ける事で、 |
-detached | Erlang VM起動後、 |
-remsh | 操作する対象のErlangノードの名前を指定できます。-detachedと同様に-snameと共に使用する必要があります。 |
では、
次のコマンドを実行すると、
$ erl -sname kai -pa ebin -config kai -eval 'application:start(kai).' -detached
-sname kaiを指定すると、
毎回、
この起動スクリプトをstart_
#!/bin/sh
ROOT='/path/to/kai-0.4.0'
ERL='/usr/bin/env erl'
for n in $@
do
${ERL} -sname ${n} \
-pa ${ROOT}/ebin \
-config ${ROOT}/${n} \
-eval 'application:start(kai).' \
-detached
done
変数ROOTには、
起動スクリプトの第一引数は、
次に、
$ erl -sname kai_controller -remsh kai@centos 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) (kai@centos)1> q(). <- プロンプトが接続元 kai_controller@centos ではなく、接続先となる事に注意 ok (kai@centos)2> User switch command <- q(). で接続先が終了してしまい、コンソールが操作できない為、Ctrl+G でメニューを呼び出す --> q <- q で kai_controller@centos を終了させる
このコマンドもスクリプトにしておくと便利です。erlコマンドの引数に習って、
#!/bin/sh
ERL='/usr/bin/env erl'
${ERL} -sname kai_controller -remsh $1@`hostname -s`
なお、
クラスタを構築する
Kaiは、
今回は、
ここでは、
まず始めに、
#!/bin/sh
for n in $@
do
cat <<__END_OF_CONFIG__ > kai${n}.config
[{kai, [
{rpc_port, 1101${n}},
{rpc_max_processes, 30},
{memcache_port, 1121${n}},
{memcache_max_processes, 10},
{max_connections, 32},
{n, 3},
{r, 2},
{w, 2},
{number_of_buckets, 1024},
{number_of_virtual_nodes, 128},
{store, ets}
]}].
__END_OF_CONFIG__
done
次に、
$ /path/to/make_kai_config.sh 1 2 3
スタンドアローンの例とは異なり、
また、
次に、
$ /path/to/start_kai.sh kai1 kai2 kai3
このままでは、
あるノードAに、
NodeA、
$ /path/to/remsh.sh kai1 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) (kai1@centos)1> kai_rpc:check_node({{127,0,0,1}, 11011}, {{127,0,0,1}, 11012}). ok (kai1@centos)2> kai_rpc:check_node({{127,0,0,1}, 11012}, {{127,0,0,1}, 11013}). ok (kai1@centos)3> kai_rpc:check_node({{127,0,0,1}, 11013}, {{127,0,0,1}, 11011}). ok (kai1@centos)4>
「ここでは、
最後に、
(kai1@centos)4> kai_rpc:node_list({{127,0,0,1}, 11011}). {node_list,[{{192,168,1,2},11012}, {{192,168,1,2},11011}, {{192,168,1,2},11013}]} (kai1@centos)5> kai_rpc:node_list({{127,0,0,1}, 11012}). {node_list,[{{192,168,1,2},11012}, {{192,168,1,2},11011}, {{192,168,1,2},11013}]} (kai1@centos)6> kai_rpc:node_list({{127,0,0,1}, 11013}). {node_list,[{{192,168,1,2},11012}, {{192,168,1,2},11011}, {{192,168,1,2},11013}]} (kai1@centos)7> User switch command --> q
このように、
次回の予告
以上で、
次回は、