NOSQLの新顔、分散KVS「okuyama」の機能
NOSQLについて解説した前回の記事は、いかがだったでしょうか。今後のアプリケーションでは、増え続けるデータを扱うことが非常に多くなると思います。前回の記事が、こうしたケースに適した新たなストレージの1つとして、NOSQLを理解するきっかけになっていたら幸いです。
連載2回目の今回は、NOSQLの1つである「okuyama」の全体概要と、機能的な特徴を紹介します。
1. 「okuyama」の概要
okuyamaは、まだ聞きなれない方も多いかと思いますが、筆者が開発している分散キー・バリュー・ストアです。2009年12月ごろから開発を始めました。現在はSourceforge.jpにて公開しています。もともとは学習を兼ねて作成したため、一部のログ・ライブラリなどを除き、すべて1から実装しました。2010年1月にファースト・リリースを行い、現在はバージョン0.8.6となっています。
以降は、okuyamaの構成を詳しく紹介していきます。
2. 「okuyama」で何ができる?~機能的特徴とその仕組み
okuyamaの全体構成は、図1のようになっています。図を見ても分かるように、いくつものノード(図中の四角い箱)で構成されています。図の左から、クライアント、マスター・ノード、データ・ノードの3つで構成されています。それぞれのノードは、すべてネットワークで結ばれます。
マスター・ノードやデータ・ノードは、複数のノードで構成することが可能です。ノードに障害が起こった時のフェール・オーバーや負荷分散などは、すべてokuyama側で自動的に行います。ノードの追加によって性能を向上させられるスケールアウトの特性を備えています。
図1: 「okuyama」の全体構成(クリックで拡大) |
以降は、各構成要素がどのような機能を提供するのかを解説します。
(1)クライアント
クライアントは、okuyama専用のクライアント・ライブラリです。okuyamaへのアクセスを実現します。
okuyamaへのアクセスを実現
- 実際にアプリケーションを実装する際に利用
okuyamaは、memcachedプロトコルを使っても操作できますが(詳しくは後述)、こちらのクライアントを利用すれば、接続先になるマスター・ノードが障害を起こした場合の自動フェール・オーバーやオリジナルで備えている機能を、すべて利用することが可能です。処理性能も、専用プロトコルになるので、こちらのほうが高くなります。
okuyamaクライアントを利用することで可能になるデータ操作は、以下の通りです。
- データ登録およびTag登録:
新規登録、更新といった概念はなく、要求されたデータを保存します。また、保存時にTagを登録することが可能です。Tagは、図2-1のように登録されます。図2-1: Tag登録(クリックで拡大) - Keyを指定してデータ取得:
KeyとペアになるValueを取得します。 - 複数のKeyを指定してデータ取得:
複数のKeyを指定することで、存在するKeyとValueのペアのみを取得します。 - Tagを指定してKey群を取得:
データ登録時に登録したTagを利用して、Keyの集合を取得します。 - Tagを指定してValue群を取得:
データ登録時に登録したTagを利用して、Valueの集合を取得します。 - データを新規登録:
保存するKeyがまだ登録されていない場合に限って、登録に成功します。 - Keyを指定してデータを削除:
Keyが存在する場合はデータを削除します。 - Keyを指定して、データと現在のValueのバージョン番号を取得:
KeyとValueのペアを取得しますが、その際に現在のValueのバージョン番号も取得します。 - バージョン番号を指定してデータを更新:
KeyとValueのペアとバージョン番号を指定して、データを更新します。バージョン番号が一致しない場合は更新エラーになります。 - Keyを指定してデータ取得する際に、JavaScriptを実行:
通常のデータ取得時に、取得データに対してユーザーが指定したJavaScriptを実行します。JavaScript内で当該Valueにアクセスし、値の一致検索や更新などが行えます。 - Keyを指定してValueを加算:
Keyと加算したい数値を渡すことで、保存されているValueに加算処理を行います。Valueが数値ではない場合は0にクリアされます。 - Keyを指定してValueを減算:
Keyと減算したい数値を渡すことで、保存されているValueに減算処理を行います。Valueが数値ではない場合は0にクリアされます。
現在の実装済み言語は、Java、PHPの2種類になります。またプロトコル表に関しては筆者のブログにアップしており、随時更新しています。
なお、一部のプロダクトではSQLライクな問い合わせ言語が用意されているものもありますが、NOSQLには現状、RDBMSで利用できるSQLのような、仕様が確定した問い合わせ方式はありません。
- データ登録およびTag登録:
- マスター・ノード障害時のフェール・オーバーも、図2-2のようにクライアントが自動的に実施
図2-2: マスター・ノード障害時のフェール・オーバー