分散Key/Valueストア,Kaiを使ってみよう!

第1回  Kaiとは? ─Kaiのコンセプトとメカニズム

この記事を読むのに必要な時間:およそ 4 分

今回から数回にわたり,Kaiという分散Key/Valueストアについて解説させていただきます。

まず,第1回では井上がKaiのコンセプトをご紹介します。次回以降は,Kai開発者の一人である幾田さんがKaiの利用方法について解説します。最終回では,gooホームでKaiを運用している橋本さんから,Kaiの運用方法について紹介していただく予定です。なお,本連載が対象とするKaiのバージョンは0.4です。

Kaiとは

Kaiとは,分散型のKey/Valueストアです。Amazon.comが2007年に発表したDynamoというシステムに触発されて,そのオープンソース版として開発されています。Kaiをバックエンドに据えてWebサイトを構築することで,高いスケーラビリティやアベイラビリティを実現できます。2009年5月には,gooホームのバックエンドに導入され,運用実績も高まってきました。

Kaiは多数のデータを保存するストレージとして様々な用途に使えます。Kaiが参考にしたAmazon Dynamoでは,ショッピングカート,カタログ,セッション情報などを保存しているようです。

Kaiは,2008年5月に開始されたオープンソースプロジェクトで,sourceforge.netにホストされています。現在は主に3人の開発者によって開発が進められています。開発や運用に関する議論はメーリングリスト上で行われています。日本語のメーリングリストもありますので(というか,日本語がメインですが),興味のある方は気軽に購読してみてください。

なお,Kaiという名前は,開発者の一人の出身地(甲斐)からとりました。深く考えずに名付けたので,とても検索性が低いです。Kaiに関する情報を検索するときには,erlang, sourceforge, dynamoなどのキーワードと組み合わせてみてください。

Kaiの特徴

Kaiはコンピュータクラスタによって構成されるデータストアです。データ(値)はキーと対応づけられ,複製されてクラスタに保存されます。クライアントからのクエリは,クラスタ内部で分散的に処理されます。

Kaiには次のような特徴があります。それぞれについて説明します。

  • memcache APIを備えたKey/Valueストア
  • 高いスケーラビリティ(エラスティシティ)による低い運用コスト
  • 負荷分散と信頼性
  • 高いアベイラビリティ,短い応答時間,それなりの一貫性
  • アクターモデルによる並列プログラミング

以下では,6台のクラスタを用いて説明します。説明の便宜上,ノードがリング状に配置されていますが,物理的なネットワークとは関係ありません(リングの意味はConsistent Hashingと一緒に説明します)。

図1 Kaiクラスタの例

図1 Kaiクラスタの例

memcache APIを備えたKey/Valueストア

Kaiは,いわゆるKey/Valueストアのひとつです。ところで,最近はKey/Valueストアという言葉をよく耳にしますが,はっきりとした定義を聞いたことはありません。ここでは,ハッシュテーブルの機能を提供するサーバのことを,Key/Valueストアと呼ぶことにします。任意の値(ビット列)をキーに対応づけて保存し,そのキーを指定して値を取り出します。

RDBMSで用いられる関係データモデルと異なり,Key/Valueストアのデータモデルは非常に簡単です。あらゆるデータ(ビット列に変換されていれば,数値や文字列だけでなく,シリアライズされたオブジェクトであってもかまわない)を,正規化などなしにそのまま保存します。そして,使うときにはキーを指定してデータを取得し,必要であればオブジェクトに復元するなどして,利用します。キーには,空白と改行を含まなければ任意の文字列を指定できます。

Kaiのクライアントはmemcache APIによってデータを操作します。つまり,memcacheクライアントを利用できます。ご存じのように,memcachedは非常に多くのWebサイトで利用されているKey/Valueストアで,多くのクライアント実装が存在します。たとえば,Perl,Ruby,Python,PHP,Java,C#,C/C++,そしてErlangなどがあります。テキストベースのプロトコルなので,telnetから操作することもできます。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3     (保存コマンド)
bar               (データ)
STORED            (結果)
get foo           (取得コマンド)
VALUE foo 0 3     (データ)
bar               (データ)

Kaiは,memcache APIのうち,基本的な操作(執筆時点ではget(s),set,delete,quit,stats,version)をサポートします。なお,Kaiはキャッシュではなく永続的なストレージなので,memcachedのように期限(expiration time)を指定することはできません(期限には必ず"0"を指定します)。

memcachedの詳細については,過去の連載memcachedを知り尽くすを参考にしてください。

著者プロフィール

井上武(いのうえたける)

NTT 未来ねっと研究所 研究主任。オーバレイマルチキャスト,分散データベース,RESTful Web サービスなど,大規模分散システムの研究に幅広く従事。

コメント

コメントの記入