RiakにPHPで接続する(riak-php-client使用)

RiakにPHPから接続して、データの登録や検索を行なってみます。

Taste of Riak: PHP
http://docs.basho.com/riak/latest/dev/taste-of-riak/php/

こちらのドキュメントを参考にしました。



接続プログラムのダウンロード



接続に使用するためのプログラムをダウンロード、展開します。


# wget --no-check-certificate -O riak-php-client.zip https://github.com/basho/riak-php-client/archive/master.zip
# unzip riak-php-client.zip




riak-php-client-masterといフォルダで解凍されるので、riak-php-clientにリネームします。


# mv riak-php-client-master riak-php-client




riak-php-clientというフォルダと同じ階層に「sample.php」というファイルを作成し、
プログラムを書いていきます。




php5-curlのインストール



Riakへの接続は、curl経由で行うようです。
php5-curlがインストールされていない状態でプログラムを実行すると、こんなエラーが表示されます。


PHP Fatal error: Call to undefined function Basho\Riak\curl_init() in
/var/www/riak/riak-php-client/src/Basho/Riak/Utils.php on line 165




apt-getでインストールする場合はこんな感じになります。


# apt-get install php5-curl








簡単なサンプルプログラム



単純に値の登録、検索を行うサンプルは以下のとおり。
ちなみに、プログラムの実行はコマンドで行いました。


# php sample.php



ここが参考になると思います。
Ubuntu コマンドラインでPHPを実行する(php5-cli)


  1. <?php
  2. require_once('riak-php-client/src/Basho/Riak/Riak.php');
  3. require_once('riak-php-client/src/Basho/Riak/Bucket.php');
  4. require_once('riak-php-client/src/Basho/Riak/Exception.php');
  5. require_once('riak-php-client/src/Basho/Riak/Link.php');
  6. require_once('riak-php-client/src/Basho/Riak/MapReduce.php');
  7. require_once('riak-php-client/src/Basho/Riak/Object.php');
  8. require_once('riak-php-client/src/Basho/Riak/StringIO.php');
  9. require_once('riak-php-client/src/Basho/Riak/Utils.php');
  10. require_once('riak-php-client/src/Basho/Riak/Link/Phase.php');
  11. require_once('riak-php-client/src/Basho/Riak/MapReduce/Phase.php');
  12. # サーバーに接続
  13. $client = new Basho\Riak\Riak('192.168.1.5', 8097);
  14. # バケットを取得
  15. $myBucket = $client->bucket('test');
  16. # 「one」というキーで「1」という値を保存
  17. $val1 = 1;
  18. $obj1 = $myBucket->newObject('one', $val1);
  19. $obj1->store();
  20. # 「one」というキーのデータを検索
  21. $fetched1 = $myBucket->get('one');
  22. # 取得した結果を表示
  23. echo $fetched1->getData();




PHPからの接続ですが、Protocol Buffers経由では行えないらしく、http経由となります。
接続時に指定するポート番号は、Riakサーバーの/etc/riak/app.configで指定したhttpのポート番号を指定します。
デフォルトでは、8098になっているかと思いますが、私はhttpsにそのポートを割り当てたので、8097にしています。




%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
%% ex: ft=erlang ts=4 sw=4 et
[
%% Riak Client APIs config
{riak_api, [
            %% pb_backlog is the maximum length to which the queue of pending
            %% connections may grow. If set, it must be an integer >= 0.
            %% By default the value is 5. If you anticipate a huge number of
            %% connections being initialised *simultaneously*, set this number
            %% higher.
            %% {pb_backlog, 64},

            %% pb is a list of IP addresses and TCP ports that the Riak
            %% Protocol Buffers interface will bind.
            {pb, [ {"0.0.0.0", 8087 } ]}
            ]},

%% Riak Core config
{riak_core, [
             %% Default location of ringstate
             {ring_state_dir, "/var/lib/riak/ring"},

             %% Default ring creation size. Make sure it is a power of 2,
             %% e.g. 16, 32, 64, 128, 256, 512 etc
             %{ring_creation_size, 64},

             %% http is a list of IP addresses and TCP ports that the Riak
             %% HTTP interface will bind.
             {http, [ {"0.0.0.0", 8097 } ]}, %% ここのポート番号

             %% https is a list of IP addresses and TCP ports that the Riak
             %% HTTPS interface will bind.
             {https, [{ "0.0.0.0", 8098 }]},

             %% Default cert and key locations for https can be overridden
             %% with the ssl config variable, for example:
             {ssl, [
                     {certfile, "/etc/riak/cert.pem"},
                     {keyfile, "/etc/riak/key.pem"}
                    ]},

             %% riak_handoff_port is the TCP port that Riak uses for
             %% intra-cluster data handoff.
             {handoff_port, 8099 },









値の削除



値の削除は、フェッチしたオブジェクトに対してdeleteを実行します。


  1. <?php
  2. require_once('riak-php-client/src/Basho/Riak/Riak.php');
  3. require_once('riak-php-client/src/Basho/Riak/Bucket.php');
  4. require_once('riak-php-client/src/Basho/Riak/Exception.php');
  5. require_once('riak-php-client/src/Basho/Riak/Link.php');
  6. require_once('riak-php-client/src/Basho/Riak/MapReduce.php');
  7. require_once('riak-php-client/src/Basho/Riak/Object.php');
  8. require_once('riak-php-client/src/Basho/Riak/StringIO.php');
  9. require_once('riak-php-client/src/Basho/Riak/Utils.php');
  10. require_once('riak-php-client/src/Basho/Riak/Link/Phase.php');
  11. require_once('riak-php-client/src/Basho/Riak/MapReduce/Phase.php');
  12. # サーバーに接続
  13. $client = new Basho\Riak\Riak('192.168.1.5', 8097);
  14. # バケットを取得
  15. $myBucket = $client->bucket('test');
  16. # 「one」というキーで「1」という値を保存
  17. $val1 = 1;
  18. $obj1 = $myBucket->newObject('one', $val1);
  19. $obj1->store();
  20. # 「one」というキーのデータを検索
  21. $fetched1 = $myBucket->get('one');
  22. # 取得した結果を表示
  23. echo $fetched1->getData() . "\n";
  24. # 削除実行
  25. $fetched1->delete();
  26. # 再度検索して表示
  27. $fetched1 = $myBucket->get('one');
  28. # 取得した結果を表示
  29. if ($fetched1->getData()){
  30.     echo $fetched1->getData() . "\n";
  31. } else {
  32.     echo "データが見つかりません\n";
  33. }




実行結果は以下の通り。


# php sample.php
1
データが見つかりません








オブジェクトの登録



クラスオブジェクトを直接登録することができます。


  1. <?php
  2. require_once('riak-php-client/src/Basho/Riak/Riak.php');
  3. require_once('riak-php-client/src/Basho/Riak/Bucket.php');
  4. require_once('riak-php-client/src/Basho/Riak/Exception.php');
  5. require_once('riak-php-client/src/Basho/Riak/Link.php');
  6. require_once('riak-php-client/src/Basho/Riak/MapReduce.php');
  7. require_once('riak-php-client/src/Basho/Riak/Object.php');
  8. require_once('riak-php-client/src/Basho/Riak/StringIO.php');
  9. require_once('riak-php-client/src/Basho/Riak/Utils.php');
  10. require_once('riak-php-client/src/Basho/Riak/Link/Phase.php');
  11. require_once('riak-php-client/src/Basho/Riak/MapReduce/Phase.php');
  12. class Player {
  13.     var $name;
  14.     var $number;
  15. }
  16. # サーバーに接続
  17. $client = new Basho\Riak\Riak('192.168.1.5', 8097);
  18. # バケットを取得
  19. $myBucket = $client->bucket('test');
  20. $player = new Player();
  21. # 背番号1を登録
  22. $player->number = 1;
  23. $player->name = '前田 智徳';
  24. $obj = $myBucket->newObject($player->number, $player);
  25. $obj->store();
  26. # 背番号2を登録
  27. $player->number = 2;
  28. $player->name = '東出 輝裕';
  29. $obj = $myBucket->newObject($player->number, $player);
  30. $obj->store();
  31. $riakObject = $myBucket->getBinary(1);
  32. # 取得した結果を表示
  33. echo $riakObject->getData() . "\n";
  34. # オブジェクトに変換
  35. $player = json_decode($riakObject->getData());
  36. echo $player->name . "\n";




実行結果は以下の通り。


# php sample.php
{"name":"\u524d\u7530 \u667a\u5fb3","number":1}
前田 智徳





RiakにPythonで接続する(riak-python-client使用)

RiakにPythonから接続して、データの登録や検索を行なってみます。

Taste of Riak: Python
http://docs.basho.com/riak/latest/dev/taste-of-riak/python/

こちらのドキュメントを参考にしました。



riak-python-clientのインストール



Ubuntu 12.04のPython 2.7.3から接続を試してみます。
easy_installでriak-python-clientをインストールしました。


$ sudo easy_install riak




riak 2.0.1 がインストール出来ました。








データの登録・検索サンプル




使い方はとても簡単。
サーバーに接続してバケットを作成。
バケットか登録用のオブジェクトを作成し、storeで保存完了です。


  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. #oneというキーで1という値を登録
  8. val = 1
  9. key = myBucket.new('one', data=val)
  10. key.store()
  11. #登録したoneの値を取得し、表示
  12. fetched = myBucket.get('one')
  13. print(fetched.data)









データの削除・存在確認



データの削除は、キーオブジェクトに対してdeleteを実行します。
取得したキーオブジェクトに対してexistsとすることで、そのキーに対するデータが存在しているか
確認できます。


  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. #oneというキーで1という値を登録
  8. val = 1
  9. key = myBucket.new('one', data=val)
  10. key.store()
  11. #登録したoneの値を取得し、表示
  12. fetched = myBucket.get('one')
  13. print(fetched.data)
  14. #データの削除
  15. fetched.delete()
  16. #削除したデータを再度検索して表示
  17. fetched = myBucket.get('one')
  18. print(fetched.data)
  19. #データの存在チェック
  20. print(fetched.exists)





実行結果はこのようになりました。


$ python sample.py
1
None
False











オブジェクトの登録



辞書型のオブジェクトを用意し、それを値として登録するだけです。


  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. #dicというキーで辞書型のオブジェクトを登録
  8. val = { u'Python' : u'パイソン', u'Ruby' : u'ルビー' }
  9. key = myBucket.new('dic', data=val)
  10. key.store()
  11. #登録したdicの値を取得し、表示
  12. fetched = myBucket.get('dic')
  13. print(fetched.data['Python'])
  14. print(fetched.data['Ruby'])




実行結果はこのようになりました。


$ python sample.py
パイソン
ルビー






もちろん、辞書型の中にリストを含めることもできます。


  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. #dicというキーで辞書型のオブジェクトを登録
  8. val = { u'Python' : [u'パイソン', u'ぱいそん'] }
  9. key = myBucket.new('dic', data=val)
  10. key.store()
  11. #登録したdicの値を取得し、表示
  12. fetched = myBucket.get('dic')
  13. for data in fetched.data['Python']:
  14.     print(data)





実行結果はこのようになります。


$ python sample.py
パイソン
ぱいそん











画像の登録



画像ファイルを登録するサンプルは以下のようになりました。


  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. #sample.pngというキーで画像を登録
  8. pngdata = open('sample.png', 'rb').read()
  9. key = myBucket.new('sample.png')
  10. key.content_type = 'image/png'
  11. key.encoded_data = pngdata
  12. key.store()




この画像を登録してみます。

237_01.png


RiakにJava APIを使用して画像を登録する
ここと同様に、ブラウザで画像を表示してみます。

237_02.png





【参考URL】

Taste of Riak: Python
http://docs.basho.com/riak/latest/dev/taste-of-riak/python/

ひとりでやるRiak Advent Calendar 2012 day2 - Pythonクライアント
http://kuenishi.hatenadiary.jp/entry/2012/12/02/223428

RiakのCountersをJava APIから使用する

Riakにriak-java-clientからデータの登録を行ってみました。

RiakにJavaで接続する(riak-java-client使用)


ドキュメントを見ていると、Countersという番号を管理する専用機能がある模様。

HTTP Counters
http://docs.basho.com/riak/latest/dev/references/http/counters/

Java APIから使用してみます。




サンプル



試行錯誤の末、サンプルはこのようになりました。


  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 RiakCountersSample {
  6.     
  7.     public static void main(String[] args) throws Exception {
  8.         
  9.         
  10.         // Riakサーバーに接続
  11.         IRiakClient riakClient = RiakFactory.pbcClient("192.168.1.5", 8087);
  12.         
  13.         // バケットを作成
  14.         // この時、allowSiblings(true)を指定
  15.         Bucket myCounter = riakClient.createBucket("myCounter").allowSiblings(true).execute();
  16.         
  17.         // 現在の値を確認
  18.         System.out.println("1:" + myCounter.counter("my_counter").execute());
  19.         
  20.         // 10増加した後の値を確認
  21.         System.out.println("2:" + myCounter.counter("my_counter").increment(10l).returnValue(true).execute());
  22.         
  23.         // もう一回値を確認
  24.         System.out.println("3:" + myCounter.counter("my_counter").execute());
  25.         
  26.         // 5減らした後の値を確認
  27.         System.out.println("4:" + myCounter.counter("my_counter").increment(-5l).returnValue(true).execute());
  28.         
  29.         // もう一回値を確認
  30.         System.out.println("5:" + myCounter.counter("my_counter").execute());
  31.         
  32.         
  33.         // サーバーとの接続終了
  34.         riakClient.shutdown();
  35.         
  36.     }
  37. }




createBucket時、allowSiblings(true)を指定していないと、実行時に以下のエラーとなります。


Exception in thread "main" com.basho.riak.client.RiakException: com.basho.riak.pbc.RiakError:
"Counters require bucket property 'allow_mult=true'"




プログラムを数回実行してみると、値が増減している様子がわかるかと思います。


1:35
2:45
3:45
4:40
5:40






【参考URL】

HTTP Counters
http://docs.basho.com/riak/latest/dev/references/http/counters/

Riak doc の Vector Clocks を意訳してみた
http://qiita.com/na_ga/items/db6d7381f382e8cd714a

RiakにJava APIを使用して画像を登録する

Riakにriak-java-clientを使用してデータの登録を行ってみました。

RiakにJavaで接続する(riak-java-client使用)

普通の文字列データ(json含む)ではなく、画像ファイルを登録してみます。




サンプル



この画像を登録してみます。

236_01.png


サンプルはこんな感じになりました。


  1. package com.fc2.blog68.symfoware;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import com.basho.riak.client.IRiakClient;
  5. import com.basho.riak.client.IRiakObject;
  6. import com.basho.riak.client.RiakFactory;
  7. import com.basho.riak.client.bucket.Bucket;
  8. import com.basho.riak.client.builders.RiakObjectBuilder;
  9. public class RiakImageSample {
  10.     
  11.     public static void main(String[] args) throws Exception {
  12.         
  13.         // 登録する画像のバイナリデータを取得
  14.         File file = new File("image.jpg");
  15.         byte[] data = new byte[(int)file.length()];
  16.         FileInputStream is = new FileInputStream(file);
  17.         is.read(data);
  18.         is.close();
  19.         
  20.         // Riakサーバーに接続
  21.         IRiakClient riakClient = RiakFactory.pbcClient("192.168.1.5", 8087);
  22.         // バケットを作成
  23.         Bucket myBucket = riakClient.createBucket("myBucket").execute();
  24.         
  25.         // RiakObjectBuilderで、登録するデータを作成していく。
  26.         // 引数はBucket名とキーの名前
  27.         RiakObjectBuilder ob = RiakObjectBuilder.newBuilder("myBucket", "image.jpg");
  28.         // ContentTypeを明示
  29.         ob.withContentType("image/jpeg");
  30.         // 取得しておいた画像のバイナリデータを設定
  31.         ob.withValue(data);
  32.         // 登録用のオブジェクトを作成
  33.         IRiakObject obj = ob.build();
  34.         
  35.         // 保存実行
  36.         myBucket.store(obj).execute();
  37.         
  38.         // サーバーとの接続終了
  39.         riakClient.shutdown();
  40.         
  41.     }
  42. }






ブラウザでの表示



ブラウザでデータが登録できたか確認してみます。
データを参照するためのURLは以前調べておきました。
Riakに登録されているデータをhttp(s)経由で参照する

myBucketというBucketにimage.jpgというキーで登録したので、URLは

https://[サーバーIP]:8098/buckets/myBucket/keys/image.jpg

となります。

ブラウザで見てみると、見事画像が表示されました。

236_02.png





【参考URL】

ひとりでやるRiak Advent Calendar 2012 day2 - Pythonクライアント
http://kuenishi.hatenadiary.jp/entry/2012/12/02/223428

Javaクライアント Low Level API (1)
http://blog.basho.co.jp/post/50412217053/java-low-level-api-1

Riakに登録されているデータをhttp(s)経由で参照する

Riakをインストールして、Webの管理画面を表示させたのですが、
どうもクラスター関連の画面しか表示されません。
他のページを見るとページが表示できないエラーが発生します。

例えば、このページからbucketsのリンクをたどると

235_01.png


エラーになります。

235_02.png


何かインストール時に不備があったのかな?と思っていたのですが、どうやらURLのフォーマットが
変更になったようで、その変更にトップページが追随できてない模様。

直接URLを入力したら表示出来ました。




buckets



登録されているBucketの一覧を取得するURLは以下の通り。

https://[サーバーIP]:8098/buckets?buckets=true

こんな感じで、登録されているBucketの一覧が表示されます。

235_03.png





keylist



バケットに登録されているキーの一覧を取得するURLは以下の通り。

https://[サーバーIP]:8098/buckets/[バケット名]/keys?keys=true

こんな感じで、登録されているキーの一覧が表示されます。

235_04.png





値の取得



バケットに登録されているキーの値を取得するURLは以下の通り。

https://[サーバーIP]:8098/buckets/[バケット名]/keys/[キー名]

こんな感じで、登録されている値が表示されます。

235_05.png





オフィシャルサイトに新旧URL合わせて掲載されています。

http://docs.basho.com/riak/latest/dev/references/http/

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ