今回から数回にわたり,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と一緒に説明します)。
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を知り尽くす」を参考にしてください。

