次に、Cassandraが持つ三つの一貫性レベルについて調べた結果が図4である。データのコピーはオリジナルも含めて、合計3台に保存した。書き込みの場合も読み込みの場合も、最大で2.2倍の性能差があった。

図4●一貫性レベルの違いによる性能の差
図4●一貫性レベルの違いによる性能の差
書き込み時も読み出し時も、一貫性のレベルを低く設定すると最大2.2倍のスループットが出た。Cassandraのノード数は6台、データのコピー数は3、検証用アプリケーションのスレッド数は120で検証した
[画像のクリックで拡大表示]

 ここで、検証した「ONE」「QUORUM」「ALL」という三つのモードについて、仕組みを簡単に解説しよう。

 処理の流れは書き込み時と読み出し時で微妙に異なる。書き込みの場合、ONEでは、キーのハッシュ値で決まる保存ノード(図5左のノードA)に書き込みが完了した時点でアプリケーションに制御が戻る。コピーの書き込みはその後実行される(保存ノードAに隣接するノードBとノードC)。QUORUMは、過半数のノード(今回の検証では2台)に書き込んだ時点、ALLは全ノード(同3台)に書き込んだ時点で、クライアントに制御が戻る。


図5●一貫性レベルの三つのモード(書き込み時、コピー数3の場合)
図5●一貫性レベルの三つのモード(書き込み時、コピー数3の場合)
一貫性の高さと、レイテンシーの小ささはトレードオフの関係にある。「One」を選ぶとレイテンシーは小さくなるがデータの一貫性が低くなり、「All」を選ぶと一貫性は高くなるがレイテンシーが大きくなる
[画像のクリックで拡大表示]

 読み込みの場合、ONEではコピーを持つ全ノードに一斉に読み出し要求を出し、最初に返ってきたデータをアプリケーションに渡す。QUORUMは過半数のノードから返答が来た時点で、最も新しいタイムスタンプを持つデータを渡す。ALLは全ノードの返答から最新データを選ぶ。


制御方式の組み合わせで性能高まる

 検証の結果、最も性能が高かったのがONEで、最低のALLと比較した結果が2.2倍だった。データの一貫性の高さよりも、性能向上を優先する場合は、ONEを選ぶのが有効だ。

 ただし実際に性能向上を重視し、読み出しと書き込みの両方でONEを選ぶと、アプリケーションは想定した動作をしない恐れがある。検証用アプリケーションで、ショッピングサイトの商品閲覧履歴をONEで書き込むと、まず1台のサーバーにデータが書き込まれ、コピーが残りの2台に書き込まれるのはその後になる。ONEを使った読み出し要求が書き込みの直後に届くと、コピーがまだ書き込まれていないサーバーの値が返される可能性がある。その場合「最近閲覧した商品」はブラウザーに表示されない。しかし、それでも利用者の不満は高くないと判断できれば、ONEで性能を高められる。

 書き込みと読み出しで異なるモードを使う方法もある。例えば、書き込みに比べて読み出しの回数が多い場合、書き込みにALLを使い、読み出しにONEを使う。書き込み時にコピーを全ノードに書き込むため、読み出しにONEを選んでもデータの一貫性に問題は出ない。読み出しの性能を優先的に上げたいときに、この方法を選ぶとよい。

 検証結果を見ると、過半数のノードに読み書きするQUORUMがALLの1.8倍と、ONEと比べても遜色ない性能があることも分かった。書き込みと読み出しの両方にQUORUMを使えば、データの一貫性はほぼ維持できる。半分以上のノードから読み出す際、最低1台は最新のデータが書き込まれている可能性が高いからだ。読み出しと書き込みのどちらも性能を高めたい場合、QUORUMが有効だと分かった。

著者から
Cassandraは発展途上だがSQL対応など今後に期待
小林 隆 (こばやし りゅう)氏

小林 隆 (こばやし りゅう)氏
ブレインパッド サービスイノベーション室

 Cassandraのノード数を増やしてもリニアには性能が向上しなかったのは、少し驚きだった。Cassandraのメーリングリストなどで理由を聞いてみたが、原因はよく分かっていない。なお米Yahoo! が論文として公開している「Yahoo! Cloud Serving Benchmark(YCSB)」の検証結果でも、負荷を上げたときのCassandraの挙動は、RDBや他のNoSQLとかなり違うことが示されている。

 ただしCassandraの技術開発のスピードを考えると、こうした性能に関する問題も今後は改善されるかもしれない。本稿執筆中の6月3日、Cassandraは最新版の0.8系(0.8.0)が公開された。検証に用いた0.7系が公開されてから半年しか経っていないが、大幅に機能が拡張された。例えば、SQLライクな問い合わせ言語が追加されている。今後の開発動向にも目が離せない状況だ。

 なおCassandraも含めたNoSQLは一般に、読み出しよりも書き込みの方が速いといわれている。今回は十分なメモリーを搭載したマシンで、大きなキャッシュ容量を設定したところ、読み出しのスループットも十分に上げられることが分かった。