NoSQL システムは従来型の SQL システムよりも パフォーマンスがよい,とする見方がある。一方で SQL が今もなお,高いスケーラビリティを要する大規模アプリケーションのための成長性を持ったソリューションである,と主張する2つの SQL ソリューションがある。そのひとつは MySQL ベースとプラグインとしての NoSQL レイヤの組み合わせであり,もうひとつが VoltDB である。
MySQL と HandlerSocket
Yoshinori Matsunobu 氏はかって MySQL の社員として Sun/Oracle に在籍していたが,現在は DeNA においてデータベースおよびインフラストラクチャに関する主席アーキテクトの職にある。氏はプラグインを使用して,32GB RAM を持つ 2.53 GHz 8 コア Nehalem サーバにおける毎秒クエリ数 (query per second/qps) を 750,000 以上にまで向上する MySQL/InnoDB ソリューション を開発した。同じサーバでプラグインを使用しない場合の MySQL の qps は 100,000 程度であり,memcached を使用すれば 400,000 程度まで改善されている。氏は RDBMS をプロファイリングしたときに,処理時間の大部分が MYSQLparse( ) や MYSQLlex(),make_join_statistics(),JOIN::optimize( ) といった SQL のオーバーヘッドで消費されていることに気が付いたと言い,次のように記している。
パフォーマンス低下の大部分は "InnoDB(ストレージ)" レイヤではなく,明らかに SQL レイヤで起きています。MySQL は memcached/NoSQL ならば必要ないような ... 多くの処理を行っているのです。
SQL レイヤでは SQL 文の解析,テーブルのオープン/ロック/アンロック/クローズ,同時実行に関する問題解決などが処理される。Matsunobu 氏のソリューションは,外部に NoSQL レイヤを追加してこれを迂回する,というものだ。
MySQL 内部に NoSQL ネットワークサーバを実装する方法が最良のアプローチである,と私たちは考えました。つまり,ネットワークサーバを MySQL のプラグイン (デーモンプラグイン) として作成し,所定のポートを listen して NoSQL プロトコルないし API を受け入れ,MySQL 内部のストレージエンジン API を経由して直接 InnoDB にアクセスする,というやり方です。NDBAPI と似たアプローチですが,InnoDB を操作できる点が違います。
氏のチームは HandleSocket プラグインを追加した。これは本体とは別のポートを listen して主キー検索やインデックス検索,挿入/更新/削除などの単純なクエリを受け取り,SQL レイヤをバイパスすることによって MySQL を NoSQL データベースのように動作させるものだ。この変更によってシステムのパフォーマンスは,リモートホストに対する処理能力において 750K qps 以上にまで向上する。通常の SQL ポートは複雑なクエリの受信と処理に引き続き利用できるため,システムのコア部分は依然として SQL データベースである。Matsunobu 氏によると,DeNA は事業ベースでの SQL/NoSQL 混在ソリューションに成功すると同時に,数台の memcached および MySQL スレーブサーバを廃止した,とのことだ。
VoltDB
もうひとつの有望な SQL ソリューションは,トランザクションデータ完全性を確保する,オープンソースのインメモリ分散 OLTP SQL DBMS である VoltDB だ。これは Ingres と Postgres のアーキテクトとして有名な Mike Stonebraker 氏の設計によるシステムで,その主要な機能は次のようなものだ。
- データを (ディスクではなく) メモリ上に保持することによってバッファ管理を不要とし,スループットを最大化する。
- データおよびそれを処理する SQL エンジンは,サーバクラスタ内の CPU コアそれぞれに分散される。
- 単一スレッドの各パーティションが自立的に動作することにより,ロックとラッチの必要性を排除する。
- クラスタ内の高可用性のため,データは自動的に複製される。これによりログ処理も不要となる。
- クラスタにサーバを追加するだけで,パフォーマンスはほぼ直線的にスケールアウトする。
開発者によって公表されたシステムのパフォーマンスは,NoSQL ソリューションの候補となり得るレベルのものだ。
- シングルノードで 53,000 トランザクション/秒 (transactions per second / TPS) の処理能力を持つ。同一のハードウェア上での他の DBMS の処理能力は 1,155 TPS である。スケーラビリティはほぼ線形であり,12 ノードからなるクラスタで上記処理を実行した場合の処理能力は 560,000 TPS であった。
- ユーザによるオンラインゲームのベンチマークでは,12 ノードの VoltDB クラスタで130万TPS を記録している。
- VoltDB は NoSQL の key-value ストアに対応するベンチマークも行っている。それによると,さまざまな key-value ストアのワークロードにおいて,NoSQL と同等以上のパフォーマンスがあった。
パフォーマンス以外の VoltDB のメリットとしては,優れた資産である SQL クライアントとの通信が可能な点がある。
先日発表された VoltDB Enterprise Edition にはプロビジョニング,モニタリング,DB クラスタなどの機能が実装されている。無料のコミュニティ版に加えて,Enterprise Edition ではサポートが付属する。