Key Value Storeについて
当ブログをご覧のみなさま、はじめまして。さくらインターネット研究所の大久保と申します。 私の方では研究所の活動の一つとして、最近SNSなど大規模なサイトのバックエンドデータベースとして用いられるKey Value Store(以下KVS)の調査、評価、性能試験を行っております。そこで、これから数回に分けてその内容をご紹介したいと思います。
KVSについて
まずはKVSについて簡単にご説明いたします。KVSはキーと値でのみ表現される単純なデータベースで、身近なところでは、PerlやPHPなどのスクリプト言語に搭載されている連想配列がイメージしやすいのではないかと思います。
Perlの連想配列の例
$profile{'name'} = 'ohkubo';
$profile{'age'} = 29;
$profile{'home'} = 'tokyo';
KVSはSQL(PostgreSQL等のRDBMS)のような複雑なデータ構造は表現できず、高機能な検索もできません。キーを与えると、それに紐づいた値を保存、取得できる単純な機能です。代わりにいくつかの実装では、分散KVSと呼ばれるネットワーク上に配置された複数のサーバにデータを分散させて格納できるものがあります。こちらは負荷分散、ストレージサーバの冗長化を図ることが可能で、非常に高いスケーラビリティを確保できます。分散KVSの概念図を以下に示しますが、キーのハッシュ値等で格納先のストレージサーバを選択し、ストレージサーバ側で別のノードにデータのレプリケーションを行う実装がポピュラーです。

図1 分散KVSの概念図
単純なデータ構造ゆえに高速であること、また分散処理も可能であることから、SQLと比較して桁違いに高いスループットを出すことができ、アクセス数の膨大なメジャーなSNSサイトでは一部のデータの格納先をSQLからKVSに移行しているそうです。測定条件等の詳細は次回以降の記事で説明したいと思いますが、参考までにSQLとKVSのスループットを簡単に比較したグラフを以下に示します。数倍から数十倍の処理能力を有することが見てとれるかと思います。

図2 SQLとKVSの性能比
KVSの実装ソフトウェア
KVSを実装しているソフトウェアを調べてみました。メジャーなものを以下にリストアップします。
機能 | |||||||
データ永続化 | × | ○ | ○ | ○ | ○ | ○ | ○ |
データ冗長化 | × | ○ | ○ | ○ | ○ | ○ | ○ |
データ分散 | × | × | × | ○ | ○ | ○ | ○ |
主な3つの機能について実装状況を示してみました。
「データ永続化」とは、ストレージサーバを再起動してもデータが失われないようにデータをメモリではなくHDD等に格納できる機能です。例えば、memcachedはメモリにデータを置くため、ストレージサーバを再起動するとデータが失われます。
「データ冗長化」とは、格納したデータがストレージサーバ側で自動的に複数のストレージサーバにコピーが作られる機能です。1台(または数台)のストレージサーバがダウンしてもデータが失われることはありません。
「データ分散」とは、キーのハッシュ値等を元にデータの格納先のサーバを振り分ける機能で、負荷分散を図ることができる機能です。なお、memcached、Tokyo Tyrantにはサーバ側での分散機能はありませんが、クライアント側のライブラリによって格納先サーバを分散させることも可能です。
memcachedプロトコルについて
KVSではデータがネットワーク上の離れたサーバ上に格納されますが、データ操作を実行するクライアント(アプリケーションサーバ等)からKVSへのアクセスはmemcachedプロトコルが良く用いられます。memcachedプロトコルをサポートしたクライアントライブラリは、C、Perl、PHP、その他多くの言語で実装されており、KVSの事実上標準プロトコルとなっています。
memcachedプロトコルは、デフォルトでTCP 11211番ポートを使用し、以下のようなテキストベースのプロトコルです。認証はなく、接続するといきなりデータ操作のコマンドを発行できます。以下はデータの保存、読出、削除を順番に行った例ですが、ソフトウェアによっては独自に拡張したコマンドを実装しているものもあります。
% telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set name 0 0 6
ohkubo
STORED
get name
VALUE name 0 6
ohkubo
END
delete name
DELETED
get name
END
quit
※ 青文字がクライアントからの入力。赤文字がサーバからのレスポンス。
参考までに、memcachedプロトコルの仕様書が以下のURLにあります。 http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
おわりに
今回はKVSの概要をご紹介させていただきました。次回は、上記で簡単に説明しましたがmemcachedプロトコルについてもう少し深くご紹介したいと思います。