- 更新
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
ノードの IP を変更します。
127.0.0.1 を自分の IP に変更します:
## Name of the riak node
## -name riak@127.0.0.1
-name riak@10.0.0.1
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
インストール:
$ 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']
インストール:
$ 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 を更新する必要がある