カテゴリ: データベース

以前、Cassandraをインストールしたのですが、今回はThriftとPHPを使ってCassandraとの連携をしてみす。まずはThriftのインストールから。環境はLinuxのCentOS 5.4を使用しています。インストールの準備としてライブラリをインストールします。Thriftをインストールするが参考になりました。


# yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel


これができたらいよいよThriftのインストールに入ります。makeで結構時間がかかりました。なんかエラーがいくつか出てたけどとりあえず無視。コマンドの実行はスーパーユーザーで。


# cd /usr/local
# wget ftp://ftp.riken.jp/net/apache/incubator/thrift/0.2.0-incubating/thrift-0.2.0-incubating.tar.gz
# tar zxvf thrift-0.2.0-incubating.tar.gz
# cd thrift-0.2.0
# ./configure
# make
# make install


CassandraにアクセスするためのPHPプログラムを置いておくディレクトリをホームディレクトリに作成します(まぁ、phpコマンドが使えれば実際はどこでもいい)。

# mkdir ~/thrift


PHPからthriftにアクセスするためのコード類が入っているディレクトリを今作ったディレクトリにコピーする。

# cp -R /usr/local/thrift-0.2.0/lib/php/src ~/thrift


thriftのインターフェース(.thrift)をCassandraのディレクトリからコピーした後、thriftコマンドを実行すると、gen-phpディレクトリ(Cassandra用のthriftクライアント)が生成される。生成したthriftクライアントは~/thrift/src/packagesの中に入れておく。

# cd ~/thrift
# cp /usr/local/apache-cassandra-0.6.5/interface/cassandra.thrift ~/thrift/cassandra.thrift
# thrift --gen php cassandra.thrift
# mkdir ~/thrift/src/packages
# mv gen-php src/packages


環境の構築はこれでOK。とりあえず次の条件でデータをインサートしてみました。コードのinclude部分は各々の設定に変更する必要があります。

・Keyspace ⇒ bbs
・Column Family ⇒ bbs1
・Row ⇒ 1
・Column ⇒ email
・Value ⇒ foobar@example.com
[php]
//必要ファイルのインクルード(環境によって変える)
$GLOBALS['THRIFT_ROOT'] = '../src';
require_once $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/Cassandra.php';
require_once $GLOBALS['THRIFT_ROOT'].'/packages/cassandra/cassandra_types.php';

require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';

//おまじないというか設定というか
$socket = new TSocket('localhost', 9160);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocolAccelerated($transport);
//Cassandraクライアントの作成
$client = new CassandraClient($protocol);
//接続開始
$transport->open();

//キースペースの設定
$keyspace = 'bbs';
//行(Row)の設定
$keyUserId = "1";

//もろもろの設定
$columnPath = new cassandra_ColumnPath();
$columnPath->column_family = 'bbs1';
$columnPath->super_column = null;
$columnPath->column = 'email';

//タイムスタンプの設定
$timestamp = time();
//一貫性レベルの設定(ZEROは読み込み時:使用不可、書き込み時:一貫性非保障を意味する)
$consistency_level = cassandra_ConsistencyLevel::ZERO;

//valueの設定
$value = "foobar@example.com";
//データのインサート
$client->insert($keyspace, $keyUserId, $columnPath, $value, $timestamp, $consistency_level);
?>
[/php]ちゃんと挿入されたかどうかをコマンドラインから確認するとちゃんと入っていることがわかります。

cassandra> get bbs.bbs1['1']
=> (column=656d61696c, value=foobar@example.com, timestamp=1283608254)
Returned 1 results.


ちなみに上記のようにPHPで挿入した部分をコマンドベースで実現しようとすると次のようになります。

cassandra> set bbs.bbs1['1']['email']='foobar@example.com'
Value inserted.


本文中にもリンク入れましたが以下のサイトを参考にしました。
■今からはじめるCassandra入門
http://labs.unoh.net/2010/08/cassandra.html
■Thriftをインストールする
http://nakayama.ddo.jp/wordpress/?p=525
■Thriftインストールメモ
http://d.hatena.ne.jp/nokuno/20090726/1248603111

このエントリーをはてなブックマークに追加


最近KVSに興味を持ち始め、色々インストールしまくってます。新しい技術に触れるってのは楽しいっすね!今回はcouchDBをインストールしてみました。CouchDBはErlangという言語で書かれたドキュメント指向の非RDBMSです。特徴としては

RDBMSではないのでSQLがない。
DBとの通信はHTTP。
データは全てJSONというフォーマットで表現されるドキュメント。
問い合わせはMapReduceに基づいて記述される。

という感じらしいです。らしいというのは本人もあんまり把握していないためです。よくわからんけど面白そうだから入れてみようという感じです。使ってりゃそのうちわかりますって。インストールは私の大好きな(楽な)yumで行いました。

インストールする



# yum install couchdb
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Setting up Install Process
No package couchdb available.
Nothing to do


むむ、パッケージがないとな?どうやらEPELというリポジトリの追加が必要なようです。なのでリポジトリを追加します。警告がでましたがとりあえず無視。


# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm を取得中
警告: /var/tmp/rpm-xfer.LSOq5u: ヘッダ V3 DSA signature: NOKEY, key ID 217521f6
準備中... ########################################### [100%]
1:epel-release ########################################### [100%]


再度挑戦。

# yum install couchdb


インストールログは省略しますが、無事インストールできました。早速起動してみましょう。


# service couchdb start
couchdb を起動中: [ OK ]


おぉ!起動したようです。psしてみましたがちゃんとプロセスあがっていました。動作確認もしてみます。CouchDBはHTTPでデータベースと通信するため、curlを使って動作確認してみます。


# curl http://127.0.0.1:5984/
{"couchdb":"Welcome","version":"0.10.2"}


データベースを作成する

データベースを作成してみます。成功すると最後に{"ok":true}と表示されます。


# curl -v -X PUT http://localhost:5984/testdatabase
* About to connect() to localhost port 5984
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 5984
> PUT /testdatabase HTTP/1.1
> User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: localhost:5984
> Accept: */*
>
< HTTP/1.1 201 Created
< Server: CouchDB/0.10.2 (Erlang OTP/R12B)
< Location: http://localhost:5984/testdatabase
< Date: Sat, 12 Jun 2010 09:08:59 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 12
< Cache-Control: must-revalidate
{"ok":true}
* Connection #0 to host localhost left intact
* Closing connection #0


ちゃんと作成されてることを確認します。

# curl http://localhost:5984/_all_dbs/
["testdatabase"]


おぉ、できてるようですね。

データベースを削除する

今度は今作ったtestdatabaseを削除してみようと思います。


# curl -v -X DELETE http://localhost:5984/testdatabase
* About to connect() to localhost port 5984
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 5984
> DELETE /testdatabase HTTP/1.1
> User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
> Host: localhost:5984
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: CouchDB/0.10.2 (Erlang OTP/R12B)
< Date: Sat, 12 Jun 2010 09:16:59 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 12
< Cache-Control: must-revalidate
{"ok":true}
* Connection #0 to host localhost left intact
* Closing connection #0


うまいこといってるようです。コチラに英語ですが、無料のCouchDBガイドがあります。ココには日本語のWikiがあります。参考にしてみてください。

このエントリーをはてなブックマークに追加


前回、CentOS 5.4にmongoDBをインストールしてみた。でmongoDBのインストールをしたのですが、今回はPHPを使ってデータをいじってみようかと思います。なお、サーバーにmongoDBのPHPドライバーがインストールされていることが前提です。まだの人は公式サイト(英語)を参考に入れてみてください。英語が苦手な人はコチラ をどうぞ。内容はほぼ一緒です。

また、この記事を書くのにPHP & MongoDB Sitting in a Tree: Part 1を参考にしました。PHPを使ってMySQLとmongoDBを扱う時のコードが比較されているので、とても参考になります。

データの取得

このコードはコネクションの確立からデータ挿入までを表したコードです。MySQLでDB接続したことある人ならわかると思いますが、コード量が少なく感じられると思います。
[php]
try {
//コネクションの確立
$link = new Mongo();
//DBの作成
$db = $link->mongoDB;
//コレクションの作成
$col = $db->user;
//コレクションへのデータの挿入(2件)
$doc = array('login' => '鈴木一郎', 'password' => 'suzuki', 'email' => 'suzuki@example.com');
$col->insert($doc, true);
$doc = array('login' => '佐藤一郎', 'password' => 'sato', 'email' => 'sato@example.com');
$col->insert($doc, true);
$id = $doc['_id'];
//データの取得と表示
$res = $col->find();
echo '挿入されたデータ:';
foreach($res as $doc) {
echo '
';
print_r($doc);
echo '
';
}

} catch (MongoConnectionException $e) {
die ('コネクションを確立できません。');
}
?>

[/php]実行するとこうなります。print_rで配列をそのまま表示させているだけなので見た目はアレですが、このように表示されます。ちゃんと挿入できてますね!

データの更新

findOne()メソッドで特定のemailのものを取り出してupdate()で更新しています。パスワードが「sato」だったものが「sato_updated」に変更されます。
[php]
try {
//コネクションの確立
$link = new Mongo();
//DBの作成
$db = $link->mongoDB;
//コレクションの作成
$col = $db->user;
//指定したemaiのものを一つだけ取得
$res = $col->findOne(array('email' => 'sato@example.com'));
//オブジェクトIDを取得
$id = $res['_id'];
//取得したオブジェクトIDをキーにして更新処理を行う
$col->update(array('_id' => $id), array('$set' => array('password' => 'sato_updated')));

echo "変更されたデータ:
";
print_r($res);
echo "
";
} catch (MongoConnectionException $e) {
die ('コネクションを確立できません。');
}
?>
[/php]実行するとちゃんとpasswordが更新されてます。

データの削除

データの削除については更新と同じです。更新の場合はupdate()を使いましたが、削除の場合はremove()を使うだけで他は変わりません。

[php]
$col->remove(array('_id' => $id), array('$set' => array('password' => 'sato_updated')));
[/php]挿入、更新、削除の3つの基本パターンを実装してみました。なれればMySQLよりもコード量少ないし直感的でコーディングしやすいような気がします。次回はもうちっと応用っぽいとこもやってみたいと思います。

このエントリーをはてなブックマークに追加


最近話題になっているmongoDBをCentOS5.4にインストールしてみました。CentOS5.4 にyumでMongoDBをインストールインストールを参考にさせていただきました。インストールと言ってもyumを使っているのでほぼオートマチックに終わってしまいましたが(´Д`υ)))ポリポリ

デフォルトのyumのリポジトリではインストールできないので/etc/yum.repos.d/MongoDB.repo/CentOS-Base.repoに以下のリポジトリを追加します。

[10gen]
name=10gen Repository
baseurl=http://downloads.mongodb.org/distros/centos/5.4/os/i386/
gpgcheck=0
enabled=1


リポジトリを追加後、mongoDBを検索してみるとなんかいっぱいでてきた。今回はstable版にします。

[root@user yum.repos.d]# yum search mongo
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
10gen | 951 B 00:00
10gen/primary | 2.1 kB 00:00
10gen 9/9
addons | 951 B 00:00
base | 1.1 kB 00:00
extras | 2.1 kB 00:00
update | 1.9 kB 00:00
================================================ Matched: mongo ================================================
mongo-snapshot.i386 : mongo client shell and tools
mongo-snapshot-debuginfo.i386 : Debug information for package mongo-snapshot
mongo-snapshot-server.i386 : mongo server, sharding server, and support scripts
mongo-stable.i386 : mongo client shell and tools
mongo-stable-debuginfo.i386 : Debug information for package mongo-stable
mongo-stable-server.i386 : mongo server, sharding server, and support scripts
mongo-unstable.i386 : mongo client shell and tools
mongo-unstable-debuginfo.i386 : Debug information for package mongo-unstable
mongo-unstable-server.i386 : mongo server, sharding server, and support scripts


さっそくインストールして起動する。yumは便利だ。

[root@user yum.repos.d]# yum install mongo-stable mongo-stable-debuginfo mongo-stable-server
[root@user yum.repos.d]# /etc/init.d/mongod start
Starting mongod: forked process: 3394
all output going to: /var/log/mongo/mongod.log
[ OK ]


起動した状態でmongoと打つと対話モードになる。試しにいくつかDBに保存してみました。

[root@user yum.repos.d]# mongo
> show dbs ←DB一覧を表示
admin
local
mongoDB
test
testMongoDB
> show collections ←コレクション覧を表示
admin
system.indexes
testMongoDB
> use testMongoDB  ←DBを選択
switched to db testMongoDB
> db.testMongoDB.save( { a:1 } )  ←保存
> db.testMongoDB.save( { b:2 } )  ←保存
> db.testMongoDB.find()  ←保存したのを確認
{ "_id" : ObjectId("4c0ba5c93dffb01c2597c606"), "a" : 1 }
{ "_id" : ObjectId("4c0ba5e33dffb01c2597c607"), "b" : 2 }


ちゃんと二つ格納されてますね。useとかsaveとかfindなどのコマンドは他にもたくさんあって公式サイトで紹介されているので気になる方は見てみてください。コマンドはMySQLに似ている印象を受けました。今回はここまで。続きはPHPとの連携をしてみようかと思います。

このエントリーをはてなブックマークに追加

↑このページのトップヘ