更新: | 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 [email protected] -name [email protected]
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 [email protected] $ 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% -- '[email protected]' valid 32.8% -- '[email protected]' valid 32.8% -- '[email protected]' ------------------------------------------------------------------------------- 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 を更新する必要がある