当ブログをご覧のみなさま、はじめまして。さくらインターネット研究所の大久保と申します。
私の方では研究所の活動の一つとして、最近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を実装しているソフトウェアを調べてみました。メジャーなものを以下にリストアップします。
機能 | memcached | memcachedb | Tokyo Tyrant | kumofs | kai | Flare | ROMA |
データ永続化 | × | ○ | ○ | ○ | ○ | ○ | ○ |
データ冗長化 | × | ○ | ○ | ○ | ○ | ○ | ○ |
データ分散 | × | × | × | ○ | ○ | ○ | ○ |
主な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プロトコルについてもう少し深くご紹介したいと思います。
KVSの比較調査はイイですね!
個人で作成されているkvsですが、okuyamaもあります~
http://d.hatena.ne.jp/okuyamaoo/20100315/1268673510
各種KVSの性能(安定性、スケーラビリティ、スループット)や
機能(アクセス制御, バージョニング, トランザクション)、
運用(冗長性、シームレスなノード追加・復旧、バックアップ)など
非常に興味深いので、KVSの勉強会したいですねー^^
KVSは様々な方面でかなり応用がききそうですね。
私はKVSをウェブサーバー等の代わりに使ったりする
のも(パフォーマンス的に)面白いと思っています。
http://www.real-unreal.info/item_51.html
さくらインターネットさんは実験するサーバーがまわりに沢山あるので、
分散型のパフォーマンスを計測しやすくていいですね。
これからも是非このような有用な資料を公開してください。
初めまして。
okuyamaを紹介頂きありがとうございます。
作者のokuyamaooと申します。
kvs勉強会良いですね。機能がシンプルだから
こそ、色々と勉強になります。
ver0.5.0をリリースしました。
本質とはずれますが、データ取得時にJavaScriptコードを
渡して実行出来るようにしてみました。
http://sourceforge.jp/projects/okuyama/releases/
もしよろしければ、私のブログになります。
http://d.hatena.ne.jp/okuyamaoo/
長文失礼いたしました。
>okuyamaooさん、tuguさん、
「okuyama」のご紹介ありがとうございます。
当方の調査不足で把握しておらず申し訳ございませんでした。
図を拝見させていただいた限り、キー分散、レプリケーションの
アーキテクチャはFlareとkumofsを組み合わせたような感じなの
かなぁと思いました。面白そうですね!
近々試させていただき、試験結果などある程度まとまった段階で
当ブログでご紹介させていただきたいと思います。
> 各種KVSの性能(安定性、スケーラビリティ、スループット)や
> 機能(アクセス制御, バージョニング, トランザクション)、
> 運用(冗長性、シームレスなノード追加・復旧、バックアップ)など
> 非常に興味深いので、KVSの勉強会したいですねー^^
弊社のサービスとしてKVSクラウドをPaaS的に提供できないかと
考えていまして、私もこの点、特に運用面には非常に興味が
あります。
今後ともよろしくおねがいします。
>cspdさん、
コメントありがとうございます。
なるほど、KVSをそのままWebサーバにしてしまうのは面白い
アイディアですね。mikioさんのTokyoTyrantだとHTTPにも
対応しているので、そのままいけちゃいますよね。ちょうど
KVSの応用事例を調べているところでしたので参考になりました。
あと、当方の検証環境は50台の物理サーバと50台の仮想サーバ、
計100台を使ってます。余り物のサーバです ^^;
今後こちらについてもご紹介させていただこうと思ってます。
検証環境うらやましい限りです。
KVSを使ったウェブサーバーを本日オープンソース化しました。
ご興味がおありでしたらソースをのぞいてみて下さい。
http://www.luxury-la.com/
分散kumofsとかのベンチマークとってみたいなー(ボソ
>cspdさん、
ありがとうございます。早速ダウンロードしてソースコードとドキュメントを
拝見させていただきました。かなりシンプルで面白いですね。
ベンチマークですが、当方でもkumofsとその他いくつかの分散KVSの性能比較をしているところです。
近々当ブログでご紹介させていただきますね。
>cspdさん
Readmeも見ましたー
自分もcspdさんの主張に賛成で、静的コンテンツに関しては
KVSベースのシステムに配置するのがあるべき姿かと考えています。
( ファイルシステムは不要で。。)
KVSを変えたり、パラメータチューニングを行うと更に高速になりそうですね。
KeepAliveやブラウザキャッシュ制御も考慮して、リバースプロキシーの
チューニングも大事そうですね。
ohkuboさん
> 弊社のサービスとしてKVSクラウドをPaaS的に提供できないかと
> 考えていまして、私もこの点、特に運用面には非常に興味が
> あります。
そうですね。自分も(Amazon SimpleDBのように)KVSクラウドを
PaaS的に提供するのは重要かと考えておりました。
そうすることで、データ と 処理(←非データ解析) が分離され、
スケールするシステムが組めるようになるので。
# クラウドを利用するシステムではスケーラビリティは非常に大事ですね。
利用する場所によってKVSの要件もかなり異なるので、
こういった部分も整理したいです。
Internet
***
KVSクラウド(静的コンテンツ)
***
VPSクラウド ** KVSクラウド(セッションデータ)
***
KVSクラウド(永続データ) – ※
前に okuyamaooさんと ※ の部分の要件で激論してました^^;
KVSの機能要件や利用方法などについて議論する
GoogleGroupも作成していただきました~
http://groups.google.co.jp/group/kvs-ja
ご案内まで。
tuguさん、okuyamaooさん
> KVSの機能要件や利用方法などについて議論する
> GoogleGroupも作成していただきました~
> http://groups.google.co.jp/group/kvs-ja
ありがとうございます。こちら早速参加させていただきました。
[…] たとえばちょっと専門的になりますが、HTML5 の Web Storage というものがあります。これは Webブラウザが保持するキーバリューストア(KVS)の一種なのですが、同期をとったところでサイトがちがいますのでストレージ内容は別のものになります。 […]