Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active June 12, 2019 08:34
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save voluntas/4243797 to your computer and use it in GitHub Desktop.
Save voluntas/4243797 to your computer and use it in GitHub Desktop.
Riak コトハジメ

Riak コトハジメ

更新

2013-05-03

バージョン

0.3.2

作者

@voluntas

環境

OS

CentOS 6.4 64bit

CPU

2 コア

MEM

2 GB

構成

3 ノード構成を作る準備

  • 10.0.0.1
  • 10.0.0.2
  • 10.0.0.3

インストール

パッケージを持ってきてインストールするだけでおk

$ curl -O http://downloads.basho.com.s3-website-us-east-1.amazonaws.com/riak/CURRENT/rhel/6/riak-1.3.1-1.el6.x86_64.rpm
$ sudo rpm -Uvh riak-1.3.1-1.el6.x86_64.rpm

/etc/riak/vm.args 設定

ノードの IP を変更します。

127.0.0.1 を自分の IP に変更します:

## Name of the riak node
## -name riak@127.0.0.1
-name riak@10.0.0.1

/etc/riak/app.config 設定

127.0.0.1 を自分の IP に変更します:

%% {pb_ip,   "127.0.0.1" },
{pb_ip,   "10.0.0.1" },

%% {http, [ {"127.0.0.1", 8098 } ]},
{http, [ {"10.0.0.1", 8098 } ]},

2i 使いたいので LevelDB にします:

%% {storage_backend, riak_kv_bitcask_backend},
{storage_backend, riak_kv_eleveldb_backend}, 

起動

パッケージで入れると init.d に追加されてるのでさくっと上がります

起動:

$ sudo /etc/init.d/riak start

クラスター構築

メインを 10.0.0.1 とすると残りの 2 台から以下のコマンドを実行します

クラスターに追加:

$ riak-admin cluster join riak@10.0.0.1
$ riak-admin cluster plan
$ riak-admin cluster commit

メンバーステータス:

[root@localhost ~]# riak-admin member-status
Attempting to restart script through sudo -H -u riak
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%      --      'riak@10.0.0.1'
valid      32.8%      --      'riak@10.0.0.2'
valid      32.8%      --      'riak@10.0.0.3'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

REST

Python

インストール:

$ pip install riak

実行:

>>> import riak

>>> client = riak.RiakClient(port=8081, transport_class=riak.RiakPbcTransport)

>>> bucket = client.bucket('employee')

>>> obj = bucket.new('jeremy', 'engineer')

>>> obj.add_index('age_int', 23)
<riak.riak_object.RiakObject object at 0x108e64450>

>>> obj.add_index('state_bin', 'CA')
<riak.riak_object.RiakObject object at 0x108e64450>

>>> obj.store()
<riak.riak_object.RiakObject object at 0x108e64450>

>>> obj1 = bucket.new('helena', 'scientist')

>>> obj1.add_index('age_int', 32)
<riak.riak_object.RiakObject object at 0x108eca0d0>

>>> obj1.add_index('state_bin', 'CA')
<riak.riak_object.RiakObject object at 0x108eca0d0>

>>> obj1.store()
<riak.riak_object.RiakObject object at 0x108eca0d0>

>>> results = client.index('employee', 'age_int', 23).run()
>>> [ obj.get().get_key() for obj in results ]
['jeremy']

>>> results = client.index('employee', 'age_int', 23, 32).run()
>>> [ obj.get().get_key() for obj in results ]
['jeremy', 'helena']

>>> results = client.index('employee', 'state_bin', 'CA').run()
>>> [ obj.get().get_key() for obj in results ]
['helena', 'jeremy']

Erlang

インストール:

$ git clone git://github.com/basho/riak-erlang-client.git
$ cd riak-erlang-client
$ make

実行:

$ erl -pa ebin -pa deps/*/ebin
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false] [dtrace]

Eshell V5.9.2  (abort with ^G)

1> {ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8081).
{ok,<0.33.0>}

2> Obj = riakc_obj:new(<<"employee">>, <<"jeremy">>, <<"engineer">>).
{riakc_obj,<<"employee">>,<<"jeremy">>,undefined,[],
           undefined,<<"engineer">>}

3> MetaData = dict:store(<<"index">>, [{"age_int", "23"}, {"state_bin", "CA"}], dict:new()).
{dict,1,16,16,8,80,48,
      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
      {{[],[],[],[],[],[],[],[],[],[],[],
        [[<<"index">>,{"age_int","23"},{"state_bin","CA"}]],
        [],[],[],[]}}}

4> Obj1 = riakc_obj:update_metadata(Obj, MetaData).
{riakc_obj,<<"employee">>,<<"jeremy">>,undefined,[],
           {dict,1,16,16,8,80,48,
                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                 {{[],[],[],[],[],[],[],[],[],[],[],[[...]],[],...}}},
           <<"engineer">>}

5> riakc_pb_socket:put(Pid, Obj1).
ok

6> Obj2 = riakc_obj:new(<<"employee">>, <<"helena">>, <<"scientist">>).
{riakc_obj,<<"employee">>,<<"helena">>,undefined,[],
           undefined,<<"scientist">>}

7> MetaData1 = dict:store(<<"index">>, [{"age_int", "32"}, {"state_bin", "CA"}], dict:new()). 
{dict,1,16,16,8,80,48,
      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
      {{[],[],[],[],[],[],[],[],[],[],[],
        [[<<"index">>,{"age_int","32"},{"state_bin","CA"}]],
        [],[],[],[]}}}

8> Obj3 = riakc_obj:update_metadata(Obj2, MetaData1).
{riakc_obj,<<"employee">>,<<"helena">>,undefined,[],
           {dict,1,16,16,8,80,48,
                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                 {{[],[],[],[],[],[],[],[],[],[],[],[[...]],[],...}}},
           <<"scientist">>}

9> riakc_pb_socket:put(Pid, Obj3).
ok

10> riakc_pb_socket:get_index(Pid, <<"employee">>, "age_int", "23").
{ok,[<<"jeremy">>]}

11> riakc_pb_socket:get_index(Pid, <<"employee">>, "age_int", "23", "32").
{ok,[<<"helena">>,<<"jeremy">>]}

12> riakc_pb_socket:get_index(Pid, <<"employee">>, "state_bin", "CA").
{ok,[<<"jeremy">>,<<"helena">>]}

メモ

  • riakc_pb_socket:ping(Pid) の戻り値は pong か例外のどっちか。
  • riakc_pb_socket:is_connected(Pid) というのもある boolean() 返す
  • ping と is_connected には Timeout が指定可能だがそれぞれ意味が違う
  • ping の Timeout は tcp 的な Timeout
  • is_connected の Timeout は gen_server:call の Timeout
  • 2i を使う際は MetaData の dict を更新する必要がある
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment