ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

CassandraのLINQProvider作ったよ( ̄∇  ̄ )

Friday, 23 April 2010 21:03 by sabro

今をときめくCassandraの、LINQプロバイダを作ってみました( ̄∇  ̄ )

Cassandraemon in CodePlex
Cassandraemon

こんな感じで、データを取ってこれます。

public class Product
{
	public int ID { get; set; }
	public string Name { get; set; }
}

	
using(var context = new CassandraContext("localhost", 9160, "KeySpace1"))
{
	var products = from x in context.ColumnList
		       where x.Key == "1" &&
			     x.ColumnFamily == "Product"
		       select x.ToObject<product>();
				   
	foreach(var p in products)
	{
		Console.WriteLine(p.ID.ToString());
	}
}

一応、更新系もサポートしています。より詳しい解説はドキュメントページを見てください。

まだとりあえずクエリ、更新処理が動いたことを確認できただけの段階です。全く使い込んでないのでバグもあるかも。ある程度使ってみて安定してきたら、ちゃんと正式版用意すると思います。

今後の開発方針ですが、さぶろーはセカンドライフ系サービスの開発が忙しいため、Cassandraemonに関しては、積極的なコミットはしない予定です。本家のバージョンアップで追加されたAPIくらいには対応したいですけどね。

ソースコード管理はMercurialなので、機能追加されねーって場合は、自分でForkして作ってみるのも一興かもしれません。

ちなみに、プロジェクト名の由来は、セカンドライフで絶賛稼働中の、拙作、萌え系アバターサービス「クリエモン」からです。

クリエモン

今までクリエモンのバックグラウンドではMySQLを使っていたのですが、メンテナンスが大変なのと、NoSQL使ってみたかったという理由から、Cassandraに切り替えることにしました。クリエモンで使うCassandraドライバなので、Cassandraemonというわけです。某国民的アニメとは全く関係ないのでご注意ください( ̄∇  ̄ )

Tags:   , , , ,
Categories:   .NET | NoSQL
Actions:   Permalink | Comments (63) | Comment RSSRSS comment feed

列指向データベース、CassandraとHBaseを比較

Thursday, 25 March 2010 16:52 by sabro

Cassandraが気になっていたんですが、同じ列指向データベースのHBaseはどうなんだろうと思って、簡単に比較してみました。

データの一貫性
NoSQL系は、そもそもRDBMSに比べて一貫性がゆるめに設計されている感じがあります。実際、Cassandraは、行ロックがなくトランザクションが使えません。複数のクライアントからの更新が被った場合は、タイムスタンプを見て最新のものを現在の値に設定するようになっています。結果整合性っていうみたいですね( ̄∇  ̄ ) ただ、まったく一貫性に関するオプションがないわけではなく、クエリ発行時にConsistencyLevelを指定することで、全てのレプリケーションノードに書込まれたことを保証したりは出来るみたいです。一方、HBaseの方は行ロック可能で、トランザクションを使うことができます。ただ制約も多いみたいで、いわゆる複数テーブルにまたがったようなのは無理ぽいみたいでした(自信なし)。まあしかしデータ一貫性では、HBaseの方に軍配が上がるようです。
運用の容易さ
Cassandraは運用の容易さを非常に重視してます。いわゆるマスターノードはなく、すべてのクラスタが同列に扱われていて、単一故障点がありません。他のノードの情報はGossipプロトコルをつかってP2P的な感じで伝搬するみたいです。それと比較してHBaseは、マスターノードがあります。マスターノードの2重化は出来るみたいなので、単一故障点はないですが、運用の難度はあがりますね。また、HBaseは、HadoopやZookeeperなどのコンポーネントに依存しているので、そちらのサーバも立てる必要があり、サーバ構成は複雑になります。運用容易さは基本的にはCassandraの勝ちですね。ただ、Cassandraにもテーブルスキーマ変更時に再起動が必要という欠点もあったりするみたいです。
ツール・ドキュメント
Cassandraは、ツールやドキュメントの整備はまだまだといった感じを受けます。一方、HBaseはそもそも、HDFSという柔軟なファイルシステムの上で動いているので、ストレージ製品を別途用意するがないですし、MapReduceとも楽に連携できます(Cassandraも最新のベータ版ではHadoopがあるみたいです)。このあたりの整備はHBaseに一日の長がありますが、Cassandraはコミュニティが活発なので、これからどんどん整備されていくんじゃないでしょうか。
データ構造・API
データ構造に関しては、Cassandra、HBaseはかなり似ています。まあ、同じ列指向データベースなんで当たり前なんですけどね。双方ともGoogleのBigTableをモデルにしているみたいです。データの取得、更新を行なうAPIはどちらもThriftに対応しているので、色んな言語のドライバを生成できます。生成されたドライバは、ネストの深いHashMapがあったりと、結構クセが強いですが、高機能なドライバも有志が作ってますんで、自分にあったものを探しましょう。

ざっと見て来ましたが、Cassandraはパフォーマンスの良さ、運用の容易さなどを重視していて、HBaseの方は、スケーリング性能を保ちつつのデータ一貫性、ツール整備など含めた完成度の高さを目指してるように感じました。

乱暴に結論を出すなら、Cassandraは、Webなどの比較的一貫性を求められない用途に、HBaseはスケーリングした上である程度一貫性が求められる場合や、MapReduceのデータ解析力を生かした、データウェアハウスなどの用途に使うかんじでしょうか( ̄∇  ̄ )

Tags:   ,
Categories:   NoSQL
Actions:   Permalink | Comments (42) | Comment RSSRSS comment feed

CassandraのC#ドライバをThriftで生成する

Wednesday, 17 March 2010 22:19 by sabro

Thriftは、特殊な言語で書かれたテンプレートから、C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C# などの、コードを生成できるフレームワークです。FaceBookによって作られたらしいです。

FaceBookは、Cassandraというストレージを採用しているんですが、それにC#でアクセスするためのドライバは、Thriftを使って生成するようになってます。

Thriftをインストールには、いくつかライブラリをいれておく必要があります。Installing the required packages on CentOS 5にあるように、CentOSでは以下のコマンドでおっけーみたいですね。

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

※ C#のコードを生成する場合には、あとMono 1.2.4以上を入れとく必要があるみたいなんで注意です。

Thriftのソースはここからダウンロード出来ます。解凍して、お決まりのパターンでコンパイルします。./configureには色々オプションもあるみたいですが、とりあえずデフォルトでやりました。あ、今回もPaco使いました。

# ./configure
# make
# paco -D make install

インストールが終わったら、Cassandraのパッケージに入っている「cassandra.thrift」のあるディレクトリへ移動して、以下のコマンドを実行します。

# thrift --gen csharp cassandra.thrift

すると、「./gen-csharp/Apache/Cassandra」以下にコードが生成されます。あとは、これをビルドしてやるわけですが、ここにあるコードは、Thrift.dllを参照しているので、それをどっっかから持ってこないといけません。

実は、それはダウンロードしたソースの中にあります。「thrift/lib/csharp/src」の中に、コードとslnファイルがあるので、それをVisualStudioなどで開いてビルドしてやると、Thrift.dllが生成されます。

Thrift.dllを参照して、生成されたコードをビルドしてやれば、Cassandraドライバの出来上がりです( ̄∇  ̄ )

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (45) | Comment RSSRSS comment feed

オブジェクトデータベースdb4oをちょっと調べてみた

Monday, 15 March 2010 14:44 by sabro

クリエモンでは、.NETの、DataReader系を使用した独自の永続化層を作って、MySQLへアクセスしてたんですが、ちょっと他のプロジェクトで使い回せるようなカタチになってなかったり、NoSQL系に興味が出てきたりしたので、別のやり方を模索しています。

FaceBook、Twitterなどの大手が採用しているCassandraと、Monoでも問題なく使えるオブジェクトデータベースdb4oが気になっていたので、今回はdb4o(ver7.4)を軽く調べてみました。

特徴

  • オブジェクト自体を検索条件として使える
  • より詳細なクエリも発行出来る構文もある
  • Linqでデータを取ってくることも可能
  • インデックスも使える
  • トランザクションもある
  • サーバ側も基本的には自分でコードを書く必要あり
  • レプリケーション可能、2台まで?
  • レプリケーションは、双方向も可能
  • クラスターは実装中ぽい
  • MySQL的なデュアルライセンス

オブジェクトデータベースということで、カラムとフィールドのマッピングが不要だったり、クエリもSQL不要だったりで、コードの記述量はかなり少なくて済む印象。Javaと.NETのみをターゲットにしていて、LINQにも対応するなど、かなり.NETと親和性は高めに感じました。

ただ、組み込み用途を主に意識しているようで、Webでの使用は若干の不安もありそう。レプリケーションは可能で、コードから設定するんだけど、2台までしか指定できなくなってます。ただ、2台のレプリケーションの設定をいくつも書けば、もっとたくさんでのレプリケーションも可能なのかも(未調査)。双方向のレプリケーションが可能なのはいい感じ。要するにマルチマスタで、コンフリクト時は、自分でイベントハンドラを書いて解消する仕組みになってます。クラスターっていうのもあるみたいだけど、まだ実験段階かな。

速度面は、PolePosition benchmarkっていうのを見たら、かなりパフォーマンスがいいってことだったけど、実際、Wikipediaの日本語記事データを70万件くらいインサートしてみたら、MySQLの方が速かったです。オブジェクトのネストが浅かったからですかね。 1項目インサートするごとに、ネットワークを繋ぎ直していたのが遅くなっていた原因でした。一度使ったコネクションを使い舞わすようにしたところ、驚くほどInsertがパフォーマンスアップしました。体感ですが、MySQLの数倍速いと思います。

総合的にみて、db4oはコードが簡潔に書けて非常に使いやすいですが、Webで大規模に使うには、まだちょっと不安が残るかなという感じをうけました。組み込み系を作るときは、ぜひ使ってみたいプロダクトですね。クリエモンで使うかどうかは、Cassandraの方も評価してみて、最終的な判断をしようと思います( ̄∇  ̄ )

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (39) | Comment RSSRSS comment feed