このエントリーをはてなブックマークに追加

Riakを使ってみる

今までまったく使ったことないのに、なんとなくRiak meet upRiak Source Code Readingに参加表明してみたりしたので、Riakを使ってみる。

FreeBSDで使う

残念ながらportsにはないようで。Downloadからbinaryパッケージは取れるけど、makeする。

% curl -O
http://s3.amazonaws.com/downloads.basho.com/riak/1.2/1.2.1/riak-1.2.1.tar.gz
% gzip -dc riak-1.2.1.tar.gz | tar xvf -
% cd riak-1.2.1
% gmake rel  # gmake必須

でOK。もちろん、erlangは事前にインストール済み。あと、gitも必要。

起動

% ./rel/riak/bin/riak start
% ./rel/riak/bin/riak ping
pong

status

% ./rel/riak/bin/riak-admin
================================= Membership =========
Status     Ring    Pending    Node
------------------------------------------------------
valid     100.0%      --      'riak@127.0.0.1'
------------------------------------------------------
Valid:1 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

設定

app.config

rel/etc/app.config にある。

重要なところとしてはこの二つかな。

  • port指定

    {riak_api, [
        {pb_ip,   "{{pb_ip}}" },
    
  • backend DBの指定

    {riak_kv, [
      {storage_backend, riak_kv_eleveldb_backend},
    

クラスター

一つのマシンでもクラスター試せる。

# devrelを指定するとdev以下にインスタンスが4つコピーされる
% make devrel

# 起動(4つあるけど今回は三つ使う)
% ./dev/dev1/bin/riak start
% ./dev/dev2/bin/riak start
% ./dev/dev3/bin/riak start

# Clusterにjoinさせる
% ./dev/dev2/bin/riak-admin cluster join dev1@127.0.0.1
% ./dev/dev3/bin/riak-admin cluster join dev1@127.0.0.1

# Success: staged join request for 'dev2@127.0.0.1' to 'dev1@127.0.0.1'
# とか出たら成功

この状態では

% ./dev/dev1/bin/riak-admin  member-status
================================= Membership ==================
Status     Ring    Pending    Node
---------------------------------------------------------------
joining     0.0%      --      'dev2@127.0.0.1'
joining     0.0%      --      'dev3@127.0.0.1'
valid     100.0%      --      'dev1@127.0.0.1'
---------------------------------------------------------------
Valid:1 / Leaving:0 / Exiting:0 / Joining:2 / Down:0

となってる。 Joiningとなってるね。

ここで、Ringのメンテナンスを行う

% bin/riak-admin cluster plan
# NOTE: Applying these changes will result in 1 cluster transition
# などずらずらっと出て、

% bin/riak-admin cluster commit
# Cluster changes committed
# で完了。

%./dev/dev1/bin/riak-admin  member-status
================================= Membership ====
Status     Ring    Pending    Node
-------------------------------------------------
valid      20.3%     32.8%    'dev2@127.0.0.1'
valid      17.2%     32.8%    'dev3@127.0.0.1'
valid      62.5%     34.4%    'dev1@127.0.0.1'
-------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

落としてみる

# アー!
% kill -9 92074

%./dev/dev1/bin/riak-admin  member-status
================================= Membership======
Status     Ring    Pending    Node
--------------------------------------------------
valid      32.8%      --      'dev2@127.0.0.1'
valid      32.8%      --      'dev3@127.0.0.1'
valid      34.4%      --      'dev1@127.0.0.1'
--------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

# あれ…?

% ./rel/riak2/bin/riak attach
No running Erlang on pipe
/tmp//home/hoge/src/riak-1.2.1/rel/riak2/erlang.pipe.1: Device not configured
%./rel/riak2/bin/riak ping
pong
# なんで返ってくるんだ…?

%./rel/riak2/bin/riak-admin test
Successfully completed 1 read/write cycle to 'riak2@127.0.0.1'

うーん、なぞ。

追記

その後、 @itawasa さんに相談したところ、かなり勘違いをしていたことが分かりました。

実はrun_erl(riak-1.2.1/dev/dev2/erts-5.9.2/bin/run_erl)をkillしてたんですね。でも、このrun_erlは単なる呼び出しスクリプトであり、killするならばerlang VM自体、つまり [beam.smp] を落とす必要がありました。

ということで、killしたところ、ちゃんと返ってこなくなりました。大変失礼しました。

参考文献