Symfoware

Symfowareについての考察blog

Riakクラスターでノードが失われた時の挙動

Riakのクラスターを構成してみました。

Riakのクラスターを構成する手順(ノードの追加と削除)
http://symfoware.blog68.fc2.com/blog-entry-1161.html

せっかくなので、クラスター内のノードが失われた時の挙動について見てみます。




データ登録



サンプルとして、簡単なデータを100件ほど登録してみました。
使用したソースは以下のとおり。


  1. package com.fc2.blog68.symfoware;
  2. import com.basho.riak.client.IRiakClient;
  3. import com.basho.riak.client.RiakFactory;
  4. import com.basho.riak.client.bucket.Bucket;
  5. public class RiakSample {
  6.     
  7.     public static void main(String[] args) throws Exception {
  8.         
  9.         IRiakClient riakClient = RiakFactory.pbcClient("192.168.1.5", 8087);
  10.         
  11.         // バケットを作成
  12.         Bucket myBucket = riakClient.createBucket("myBucket").execute();
  13.         
  14.         // key001-value001からkey100-value100まで登録
  15.         for(int i = 1; i <= 100; i++) {
  16.             String num = String.format("%03d", i);
  17.             myBucket.store("key" + num, "value" + num).execute();
  18.         }
  19.         
  20.         // サーバーとの接続終了
  21.         riakClient.shutdown();
  22.     }
  23. }





プログラムを実行した後、Node 1、Node 2でそれぞれ「riak-admin vnode-status」を
実行してみました。結果は以下のようになります。


Node 1


# riak-admin vnode-status
Vnode status information
-------------------------------------------

VNode: 0
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]

VNode: 22835963083295358096932575511191922182123945984
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 91343852333181432387730302044767688728495783936
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 114179815416476790484662877555959610910619729920
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 182687704666362864775460604089535377456991567872
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 205523667749658222872393179600727299639115513856
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 274031556999544297163190906134303066185487351808
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 296867520082839655260123481645494988367611297792
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 365375409332725729550921208179070754913983135744
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 388211372416021087647853783690262677096107081728
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 456719261665907161938651510223838443642478919680
Backend: riak_kv_bitcask_backend
Status:
[{key_count,1},{status,[]}]

VNode: 479555224749202520035584085735030365824602865664
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]

VNode: 548063113999088594326381812268606132370974703616
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 570899077082383952423314387779798054553098649600
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 639406966332270026714112114313373821099470487552
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 662242929415565384811044689824565743281594433536
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 730750818665451459101842416358141509827966271488
Backend: riak_kv_bitcask_backend
Status:
[{key_count,8},{status,[]}]

VNode: 753586781748746817198774991869333432010090217472
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 822094670998632891489572718402909198556462055424
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 844930634081928249586505293914101120738586001408
Backend: riak_kv_bitcask_backend
Status:
[{key_count,7},{status,[]}]

VNode: 913438523331814323877303020447676887284957839360
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 936274486415109681974235595958868809467081785344
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 1004782375664995756265033322492444576013453623296
Backend: riak_kv_bitcask_backend
Status:
[{key_count,7},{status,[]}]

VNode: 1027618338748291114361965898003636498195577569280
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1096126227998177188652763624537212264741949407232
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 1118962191081472546749696200048404186924073353216
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1187470080331358621040493926581979953470445191168
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 1210306043414653979137426502093171875652569137152
Backend: riak_kv_bitcask_backend
Status:
[{key_count,9},{status,[]}]

VNode: 1278813932664540053428224228626747642198940975104
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 1301649895747835411525156804137939564381064921088
Backend: riak_kv_bitcask_backend
Status:
[{key_count,8},{status,[]}]

VNode: 1370157784997721485815954530671515330927436759040
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 1392993748081016843912887106182707253109560705024
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]






Node 2


# riak-admin vnode-status
Vnode status information
-------------------------------------------

VNode: 45671926166590716193865151022383844364247891968
Backend: riak_kv_bitcask_backend
Status:
[{key_count,7},{status,[]}]

VNode: 68507889249886074290797726533575766546371837952
Backend: riak_kv_bitcask_backend
Status:
[{key_count,7},{status,[]}]

VNode: 137015778499772148581595453067151533092743675904
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 159851741583067506678528028578343455274867621888
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 228359630832953580969325755111919221821239459840
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 251195593916248939066258330623111144003363405824
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 319703483166135013357056057156686910549735243776
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 342539446249430371453988632667878832731859189760
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]

VNode: 411047335499316445744786359201454599278231027712
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 433883298582611803841718934712646521460354973696
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]

VNode: 502391187832497878132516661246222288006726811648
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]

VNode: 525227150915793236229449236757414210188850757632
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 593735040165679310520246963290989976735222595584
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 616571003248974668617179538802181898917346541568
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 685078892498860742907977265335757665463718379520
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 707914855582156101004909840846949587645842325504
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 776422744832042175295707567380525354192214163456
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 799258707915337533392640142891717276374338109440
Backend: riak_kv_bitcask_backend
Status:
[{key_count,3},{status,[]}]

VNode: 867766597165223607683437869425293042920709947392
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 890602560248518965780370444936484965102833893376
Backend: riak_kv_bitcask_backend
Status:
[{key_count,7},{status,[]}]

VNode: 959110449498405040071168171470060731649205731328
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 981946412581700398168100746981252653831329677312
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 1050454301831586472458898473514828420377701515264
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1073290264914881830555831049026020342559825461248
Backend: riak_kv_bitcask_backend
Status:
[{key_count,4},{status,[]}]

VNode: 1141798154164767904846628775559596109106197299200
Backend: riak_kv_bitcask_backend
Status:
[{key_count,5},{status,[]}]

VNode: 1164634117248063262943561351070788031288321245184
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1233142006497949337234359077604363797834693083136
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1255977969581244695331291653115555720016817029120
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1324485858831130769622089379649131486563188867072
Backend: riak_kv_bitcask_backend
Status:
[{key_count,9},{status,[]}]

VNode: 1347321821914426127719021955160323408745312813056
Backend: riak_kv_bitcask_backend
Status:
[{key_count,6},{status,[]}]

VNode: 1415829711164312202009819681693899175291684651008
Backend: riak_kv_bitcask_backend
Status:
[{key_count,2},{status,[]}]

VNode: 1438665674247607560106752257205091097473808596992
Backend: riak_kv_bitcask_backend
Status:
[{key_count,1},{status,[]}]




key_countで表示された値を足すと、100か200になるんだろと思っていたのですが、

Node 1:152
Node 2:148

となり、合計300件のキーが登録されています。






Node 2の停止



Node 2(192.168.1.6)のriakを停止します。


# riak stop




停止した時の管理画面はこんな表示になりました。

241_01.png

241_02.png


先ほど登録したデータを検索するプログラムを実行してみます。


  1. package com.fc2.blog68.symfoware;
  2. import com.basho.riak.client.IRiakClient;
  3. import com.basho.riak.client.IRiakObject;
  4. import com.basho.riak.client.RiakFactory;
  5. import com.basho.riak.client.bucket.Bucket;
  6. public class RiakSample {
  7.     
  8.     public static void main(String[] args) throws Exception {
  9.         
  10.         IRiakClient riakClient = RiakFactory.pbcClient("192.168.1.5", 8087);
  11.         
  12.         // バケットを作成
  13.         Bucket myBucket = riakClient.createBucket("myBucket").execute();
  14.         
  15.         int notfound = 0;
  16.         
  17.         // key001からkey100まで検索
  18.         for(int i = 1; i <= 100; i++) {
  19.             String key = String.format("key%03d", i);
  20.             IRiakObject fetched = myBucket.fetch(key).execute();
  21.             
  22.             if (fetched == null) {
  23.                 notfound++;
  24.             } else {
  25.                 System.out.println(fetched.getValueAsString());
  26.             }
  27.             
  28.         }
  29.         
  30.         // サーバーとの接続終了
  31.         riakClient.shutdown();
  32.         
  33.         System.out.println(notfound);
  34.     }
  35. }





停止した直後の実行結果はこうなりました。


value001
value002
value003
value004
value005
value006
value007
value008
value009
value011
value012
value013
value015
value016
value019
value021
value022
value023
value024
value025
value026
value027
value028
value029
value030
value031
value032
value033
value034
value035
value038
value039
value040
value041
value042
value043
value044
value045
value048
value053
value057
value060
value061
value062
value065
value067
value069
value072
value074
value076
value077
value079
value082
value083
value085
value087
value089
value090
value091
value092
value094
value095
value096
value097
36




100件中、36件検索できないデータがあります。
あれっ?冗長構成取れてないのかなと思ったのですが、ほんの5秒後ぐらいに
再度同じプログラムを実行すると、


value001
value002
value003
value004
value005
value006
value007
value008
value009
value010
value011
value012
value013
value014
value015
value016
value017
value018
value019
value020
value021
value022
value023
value024
value025
value026
value027
value028
value029
value030
value031
value032
value033
value034
value035
value036
value037
value038
value039
value040
value041
value042
value043
value044
value045
value046
value047
value048
value049
value050
value051
value052
value053
value054
value055
value056
value057
value058
value059
value060
value061
value062
value063
value064
value065
value066
value067
value068
value069
value070
value071
value072
value073
value074
value075
value076
value077
value078
value079
value080
value081
value082
value083
value084
value085
value086
value087
value088
value089
value090
value091
value092
value093
value094
value095
value096
value097
value098
value099
value100
0




今度は全件検索可能に。
ダウン検知後、自動的に復旧が行われるようです。



テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/11/04(月) 23:33:23|
  2. Riak
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Riakのクラスターを構成する手順(ノードの追加と削除)

RiakをDebianにインストールしてみました。

RiakをDebian(wheezy)にインストールする
http://symfoware.blog68.fc2.com/blog-entry-1148.html

この環境を2台用意し、クラスター構成をとってみます。

240_01.png




クラスター構成の前提条件



Basic Cluster Setup
http://docs.basho.com/riak/latest/ops/building/basic-cluster-setup/

こちらを参考にしました。

クラスター構成を取るためには、pd_ipとhttpが外部から接続可能な状態であることが必要です。
/etc/riak/app.configの内容を確認し、pd_ipとhttpを
外部から接続可能(127.0.0.1からホストIPに変更)しておきます







Node 1(192.168.1.5)サーバーでの設定



1台目のサーバーで設定した内容となります。


初期状態で、管理画面のクラスター情報は以下の通り。

240_02.png

240_03.png

riak@127.0.0.1というノードがひとつ認識されています。



まず、riakが起動している場合は停止します。


# riak stop




次に、vm.argsを編集。
「-name riak@127.0.0.1」
となっている箇所を
「-name riak@192.168.1.5」
に変更しました。

※本当は「-name riak@node1.example.com」のような形式が良いのですが
テスト環境なので名前解決できない。


# vi /etc/riak/vm.args




1行目を編集。


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





編集が終わったらriakを起動します。


# riak start
riak failed to start within 15 seconds,
see the output of 'riak console' for more information.
If you want to wait longer, set the environment variable
WAIT_FOR_ERLANG to the number of seconds to wait.




既にriakを起動したことがある場合は、上記のエラーメッセージが表示されます。

ドキュメントを見てみると、

Single Nodes If a node is started singly using default settings
(as, for example, you might do when you are building your first test environment),
you will need to remove the ring files from the data directory after you edit etc/vm.args.
riak-admin cluster replace will not work as the node has not been joined to a cluster.




英語苦手なんですがデフォルトで起動したことがあるノードは、ringファイルを消せってことらしいです。
ringファイルは、/var/lib/riak/ring/にありますので、全部消します。


# rm -fr /var/lib/riak/ring/*




再度起動。


# riak start



これで起動してくれると思います。


管理画面を見てみると、ちゃんとriak@192.168.1.5のノードとして認識されています。

240_04.png

240_05.png


これで1台目のサーバーでの作業は終了です。







Node 2(192.168.1.6)サーバーでの設定



Node 1で行ったのと同じ作業を行い、管理画面でノードが1つ(自分自身)認識されている状態にします。

240_06.png

240_07.png


Node 2のサーバーで、riak-admin cluster join [riak-name]コマンドを実行します。
実行すると、こんなメッセージが表示されました。


# riak-admin cluster join riak@192.168.1.5
Success: staged join request for 'riak@192.168.1.6' to 'riak@192.168.1.5'





この状態では、まだクラスターへの追加は確定していません。
riak-admin cluster planで、保留中の情報を表示できます。


# riak-admin cluster plan
=============================== Staged Changes ================================
Action         Details(s)
-------------------------------------------------------------------------------
join         'riak@192.168.1.6'
-------------------------------------------------------------------------------


NOTE: Applying these changes will result in 1 cluster transition

###############################################################################
                         After cluster transition 1/1
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid     100.0%     50.0%    'riak@192.168.1.5'
valid     0.0%     50.0%    'riak@192.168.1.6'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Transfers resulting from cluster changes: 32
32 transfers from 'riak@192.168.1.5' to 'riak@192.168.1.6'





riak-admin cluster commitで変更を確定します。


# riak-admin cluster commit
Cluster changes committed





再度、riak-admin cluster planを実行していると、保留中の情報が無いことが表示されます。


# riak-admin cluster plan
There are no staged changes





管理画面を見てみると、2つのノードが表示されています。

240_08.png

240_09.png








クラスターからノードの除去



Node 2をクラスターから除去してみます。
Node 2のサーバーで、riak-admin cluster leaveを実行します。


# riak-admin cluster leave
Success: staged leave request for 'riak@192.168.1.6'




cluster joinと同じく、コマンドを実行しただけでは変更は確定しません。
riak-admin cluster planを実行すると、未確定の変更情報が表示されます。


# riak-admin cluster plan
=============================== Staged Changes ================================
Action         Details(s)
-------------------------------------------------------------------------------
leave         'riak@192.168.1.6'
-------------------------------------------------------------------------------


NOTE: Applying these changes will result in 2 cluster transitions

###############################################################################
                         After cluster transition 1/2
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
leaving    50.0%     0.0%    'riak@192.168.1.6'
valid     50.0%    100.0%    'riak@192.168.1.5'
-------------------------------------------------------------------------------
Valid:1 / Leaving:1 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Transfers resulting from cluster changes: 32
32 transfers from 'riak@192.168.1.6' to 'riak@192.168.1.5'

###############################################################################
                         After cluster transition 2/2
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid     100.0%     --     'riak@192.168.1.5'
-------------------------------------------------------------------------------
Valid:1 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes





riak-admin cluster commitを実行して変更内容を確定します。


# riak-admin cluster commit
Cluster changes committed





管理画面を見てみると、クラスターからの除去の様子がわかります。

240_10.png


しばらく待つと、Node 2がクラスターから除去されました。

240_11.png



Node 2のサーバーでは、クラスターから外れた後、riakもシャットダウンされます。


# riak ping
Node 'riak@192.168.1.6' not responding to pings.








管理画面からのノードの追加、削除




/etc/riak/app.configでhttpsプロトコル有効、riak_controlのenabledをtrueにしていると、
ブラウザから管理画面の表示が行えます。

https://192.168.1.5:8098/admin#/cluster
にアクセスし、ノードを追加してみます。

追加したいriakのノード名、例えばriak@192.168.1.6を入力して、JOIN NODEをクリック。

240_12.png


コマンドでノードを追加した時と同じく、一旦保留状態になります。
「This plan is correct.」にチェックをつけてCOMMITをクリック。

240_13.png


動機が始まりました。

240_14.png



逆にクラスターから指定したノードを除去するには、ActionsのHIDEをクリックして、詳細を表示。
「Allow this node to leave normally.」が選択されている状態で、STAGEをクリックします。

240_15.png


一旦保留中の状態になるので、「This plan is correct.」をチェックしてCOMMITをクリック。

240_16.png


クラスターからの削除が始まりました。

240_17.png

テーマ:サーバ - ジャンル:コンピュータ

  1. 2013/11/04(月) 20:29:44|
  2. Riak
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Riakの情報をGUIで表示するJavaアプリケーション riak-admin

Riakの情報をGUIで表示するツールがいくつか紹介されています。

http://docs.basho.com/riak/latest/dev/advanced/community-projects/

Java製のriak-adminというGUIツールがある様子。
https://bitbucket.org/harmen/riak-admin/

ダウンロードして動かそうとしたのですが、どうもRiak1.4.2には対応していないようで、
データベースへの接続すらできませんでした。


しょうがないのでForkして動くように手直ししています。
※仕様が変わってしまったかも。

https://bitbucket.org/symfo/riak-admin/



依存ソース



RiakのJava-APIを使用したかったのですが、
・Protocol Buffers接続だと、ノードのステータスが取れない?
・http接続だと、Bucketの一覧が取れない?
という問題を解決出来なかったので、http経由で自力でデータを取得しています。

いい勉強になりました。


JSON変換では、http://www.json.org/を使用しています。





使い方



https://bitbucket.org/symfo/riak-admin/downloads

こちらに実行可能なjarファイルを登録しています。
ダブルクリックするか、コマンドで「java -jar riak-admin-0.2.jar」を実行すると起動します。

起動した画面はこんな感じ。

239_01.png


Add databaseボタンを押すと、URLの入力画面が表示されます。
RiakのURLを入力して了解をクリック。データベースに接続します。

239_02.png

239_03.png


データベースのURLをクリックすると、Add bucketボタンが押せるようになります。
押したらbucketの入力ダイアログが表示されるので、名前を入力して了解。

239_04.png

239_05.png


bucketを選択すると、登録されているデータの一覧が表示されます。
New object、Edit object、Delete object(s)で簡単なデータ操作が可能です。

239_06.png

239_07.png

239_08.png

239_09.png


bucketに100件以上データが登録されていたら、表示を省略します。
スクロールに合わせて表示するなどが今後の課題です。

239_10.png



後は、ノード情報の表示とかも行えていないです。
これも今後の課題です。(オリジナルでは表示していた風なので)


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/11/03(日) 20:11:24|
  2. Riak
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

RiakのLink機能をPythonクライアントで操作する

RiakのLink機能をJavaで試してみました。
RiakのLink機能をJavaクライアントで操作する

今度はPythonで試してみます。

Pythonクライアントのインストールはこちら。
RiakにPythonで接続する(riak-python-client使用)




サンプル



Javaと同様のことをやってみました。


  1. # -*- coding:utf-8 -*-
  2. import riak
  3. #riakサーバーに接続
  4. myClient = riak.RiakClient(host='192.168.1.5', pb_port=8087, protocol='pbc')
  5. #バケットを作成
  6. myBucket = myClient.bucket('test')
  7. anko = myBucket.new('anko', data=[u'Ⅳ号戦車D型'])
  8. anko.store()
  9. class2 = myBucket.new('class2', data=[u'高校二年生'])
  10. class2.store()
  11. member = myBucket.new('nishizumi', data=[u'西住 みほ'])
  12. member.add_link(anko)
  13. member.add_link(class2)
  14. member.store()
  15. #登録したデータを取得
  16. fetched = myBucket.get('nishizumi')
  17. print(fetched.data[0])
  18. #取得したデータに関連しているリンク情報を取得
  19. for link in fetched.links:
  20.     print('--------------')
  21.     # 結果はタプル 0:Bucket 1:Keyとなっている
  22.     print('Bucket:%s Key:%s' % (link[0], link[1]))
  23.     link_fetch = myClient.bucket(link[0]).get(link[1])
  24.     print(link_fetch.data[0])




昔のドキュメントを見ると、get_linksでリンク情報が取得できたようなのですが、
この機能は削除されたようです。
Tutorial (old)


また、Unicodeオブジェクトを直接登録することが出来なかったので、
一旦リストとして登録しています。

登録しようとすると、こんなエラーになりました。


Traceback (most recent call last):
File "sample.py", line 11, in <module>
    key = myBucket.new('dic', data=val)
File "/usr/local/lib/python2.7/dist-packages/riak-2.0.1-py2.7.egg/riak/bucket.py", line 157, in new
    raise TypeError('Unicode data values are not supported.')





プログラムを実行してみると、以下の結果が表示されます。


$ python sample.py
西住 みほ
--------------
Bucket:test Key:anko
Ⅳ号戦車D型
--------------
Bucket:test Key:class2
高校二年生

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/10/28(月) 21:16:47|
  2. Riak
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

RiakのLink機能をJavaクライアントで操作する

RiakにはLinkという機能があるようです。

http://docs.basho.com/riak/latest/tutorials/fast-track/Links-and-Link-Walking/

どんなものか、Javaのクライアントから操作してみようと思います。

Javaクライアントの導入はこちら。
RiakにJavaで接続する(riak-java-client使用)




サンプルプログラム



Javaでリンクを設定するプログラムはこんな感じになりました。


  1. package com.fc2.blog68.symfoware;
  2. import com.basho.riak.client.IRiakClient;
  3. import com.basho.riak.client.IRiakObject;
  4. import com.basho.riak.client.RiakFactory;
  5. import com.basho.riak.client.RiakLink;
  6. import com.basho.riak.client.bucket.Bucket;
  7. import com.basho.riak.client.builders.RiakObjectBuilder;
  8. public class RiakLinkSample {
  9.     
  10.     public static void main(String[] args) throws Exception {
  11.         
  12.         // Riakサーバーに接続
  13.         IRiakClient riakClient = RiakFactory.pbcClient("192.168.1.5", 8087);
  14.         // バケットを作成
  15.         Bucket myBucket = riakClient.createBucket("myBucket").execute();
  16.         
  17.         //キーとなる情報を作成
  18.         myBucket.store("anko", "Ⅳ号戦車D型").execute();
  19.         myBucket.store("class2", "高校二年生").execute();
  20.         
  21.         //データを登録
  22.         RiakObjectBuilder ob = RiakObjectBuilder.newBuilder("myBucket", "nishizumi");
  23.         ob.withValue("西住 みほ");
  24.         ob.addLink("myBucket", "anko", "tank");
  25.         ob.addLink("myBucket", "class2", "class");
  26.         myBucket.store(ob.build()).execute();
  27.         
  28.         // 登録したデータを検索
  29.         IRiakObject obj = myBucket.fetch("nishizumi").execute();
  30.         System.out.println( obj.getValueAsString());
  31.         
  32.         // リンク情報を表示
  33.         for(RiakLink objLink : obj.getLinks()) {
  34.             System.out.println("--------------");
  35.             System.out.println(objLink.getBucket());
  36.             System.out.println(objLink.getKey());
  37.             System.out.println(objLink.getTag());
  38.             
  39.             // 取得したリンク情報を元に、データを取得
  40.             Bucket linkBucket = riakClient.createBucket(objLink.getBucket()).execute();
  41.             String tankName = linkBucket.fetch(objLink.getKey()).execute().getValueAsString();
  42.             System.out.println(tankName);
  43.             
  44.         }
  45.         
  46.         // サーバーとの接続終了
  47.         riakClient.shutdown();
  48.     }
  49. }




実行してみると、こんな結果が表示されると思います。


西住 みほ
--------------
myBucket
anko
tank
Ⅳ号戦車D型
--------------
myBucket
class2
class
高校二年生





リンクが設定されていると、自動的にリンク先の情報も取得してくれると思っていましたが、
どうやらどうじゃないみたいです。

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/10/27(日) 18:01:00|
  2. Riak
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ