CassandraとRiakとRedis、どれが一番速いのかなーってことで性能を比較してみました。
後ほど詳しく書きますが、若干Redisに有利なベンチマークの取り方しています。
各ミドルウェアの条件と特徴はこれ。
アーキテクチャ比較
Cassandra
- version: 2.0.5
- 構成: cluster
- depend: Java, Python
- データモデル: カラム指向
- アーキテクチャ: Gossip
- ノード管理: 設定ファイル/コマンド/GUI
- 無停止ノード管理: 無停止
- CUIクライアント: cqlsh
- 管理ツール: 付属のweb ui
Cassandraのインストール〜クラスター構築はこちらをどうぞ。
Cassandra2系のクラスターをRHEL系LInuxに構築する
Riak
- version: 2.0.0pre11
- 構成: cluster
- depend: Erlang
- データモデル: Key-Value
- アーキテクチャ: Gossip
- ノード管理: コマンド/GUI
- 無停止ノード管理: 無停止
- CUIクライアント: erlangシェル
- 管理ツール: 付属のweb ui
Riakのインストール〜クラスター構築はこちらをどうぞ。
Riak2.0.0preをつかってみた
Redis
- version: 2.8.3
- 構成: master-slave
- depend: C
- データモデル: Key-Value
- アーキテクチャ: オンメモリ
- ノード管理: 設定ファイル/コマンド
- 無停止ノード管理: slave追加は無停止
- CUIクライアント: redis-cli
- 管理ツール: phpredmin, phpRedisAdmin
Redisのインストールはyumでrpm入れて終わりなので特に書きませんでした。
ベンチマーク条件
ベンチマークをとった条件はこんな感じです。
- スペック: CPU8コア、メモリ16GB
- 時間: 60分
- 構成: 3ノード
- 操作: 50スレッドで読み込み。2スレッドで書き込み。
- 初期key数: 120,000
- keyごとのサイズ: 80KB
- timeout: 500/1000/5000
Redis: 書き込みはmasterに, 読み込みはslave1とslave2から。
CassandraとRiak: 書き込みはnode1に, 読み込みはnode1〜3から。
Riakのstrageモードはbitcast。
Riak, Cassandraは2ノードにデータを保存。
使ったのはBasho Benchです。
RiakのBasho製なので、てっきりRiakに有利かと思ったのですが・・・
結果
Basho Benchでグラフを出力しました。
まずはRedisから。
Redis
で、Riak。
Riak
最後にCassandra。
Cassandra
これだけ見ると、一見Riakのパフォーマンスが良さそうなのですが・・・
詳しく数値を追ってみます。
スループット、レイテンシ
読み込み時のベンチマーク結果から検証します。
タイムアウトを0.5秒にしたときには、RiakとCassandraのスループット、レイテンシの中央値が良いです。
しかし特にRiakの方で99パーセンタイル以上のレイテンシが著しく高いです。
つまり、タイムアウトでエラーとなっている割合が多いことを示しています。
逆にRedisはレイテンシの中央値とmaxがそう変わらないので、タイムアウトエラーが少ないことがわかります。
タイムアウトを5秒にすると、Cassandraの99パーセンタイルのレイテンシがだいぶ低くなります。
Cassandra及びRiakはクラスター構成なので、問い合わせを受けたサーバにデータが存在していない場合、他のサーバに問い合わせるホップが発生します。
RedisはMaster-Slave構成のため、完コピだからこの辺は有利ですね。
ということを踏まえると、Cassandraのスループットは相当優秀です。オンメモリストレージのRedisと戦えるくらいの性能を示しています。
さて、次に書き込みの方ですが、
これを見るとやはりRedisが秀でているように見えます。
ですが、これは書き込み対象ノードを1つにしてしまったため、クラスター構成のCassandra及びRiakに不利なベンチマークの取り方となっています。
総括
適材適所、ですかね。
特性の違いが顕著にでました。