NOSQLの新顔、分散KVS「okuyama」の機能

2011年2月10日(木)
岩瀬 高博

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」の全体構成(クリックで拡大)

以降は、各構成要素がどのような機能を提供するのかを解説します。

(1)クライアント

クライアントは、okuyama専用のクライアント・ライブラリです。okuyamaへのアクセスを実現します。

okuyamaへのアクセスを実現

  1. 実際にアプリケーションを実装する際に利用

    okuyamaは、memcachedプロトコルを使っても操作できますが(詳しくは後述)、こちらのクライアントを利用すれば、接続先になるマスター・ノードが障害を起こした場合の自動フェール・オーバーやオリジナルで備えている機能を、すべて利用することが可能です。処理性能も、専用プロトコルになるので、こちらのほうが高くなります。

    okuyamaクライアントを利用することで可能になるデータ操作は、以下の通りです。

    • データ登録およびTag登録:
      新規登録、更新といった概念はなく、要求されたデータを保存します。また、保存時にTagを登録することが可能です。Tagは、図2-1のように登録されます。

      図2-1: Tag登録

      図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のような、仕様が確定した問い合わせ方式はありません。

  2. マスター・ノード障害時のフェール・オーバーも、図2-2のようにクライアントが自動的に実施

    図2-2: マスター・ノード障害時のフェール・オーバー

    図2-2: マスター・ノード障害時のフェール・オーバー
株式会社神戸デジタル・ラボ

2006年神戸デジタル・ラボに入社。企業内業務アプリケーション開発に従事。
2008年末から大規模ECサイトのアプリケーション、インフラ周りの運用に従事。
2009年末に分散Key-Value Store”okuyama”をオープンソースとして公開。
2010年から各都道府県で開催されるオープンソースカンファレンスへの出展やセミナー登壇、「NOSQL afternoon in Japan」や、「JavaCloud Meeting Kansai」での登壇といった”okuyama”の普及活動の傍ら、”okuyama”を使ったアプリケーション開発などに従事し、現在に至る。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています