MyCassandra測定

Yahoo PNUTSの論文を読んでみて、
別にNoSQL使わなくてもMySQLでも性能は出るんじゃないかと思い、
CassandraのSSTableをMySQLに入れ替えたMyCassandraを実装しました。

シーケンシャルな書き込みを重視するCassandraですが、MyCassandraではMySQL同様に書き込みは更新も取り扱い、読み込み時はCassandraのようにMutationのマージ処理が必要ありません。

以下、iMac1ノード(Core 2 Quad, 4GBメモリ)上でとった簡単な測定
Cassandraは最新の0.6.2を、以下のようにMemtableのサイズを調整して測定。MyCassandraはソースが公開されている0.6.0を元に実装しました。

dbname Memtable
Cassandra.L 128M
Cassandra.M 64M
Cassandra.S 4M
Cassandra.N 0

また、MySQLのストレージエンジンにはInnoDBを用い、cnfファイルはmy-innodb-heavy-4G.cnfをそのまま使っています。
※測定結果でスターがついてるのはMemTableがいっぱいになりSSTableに非同期で古いMemTableを書き出しています。

1024 バイトのランダム文字列の単一カラムから成るN件のRowを順にputして、ランダムに全てのRowをgetする

put
db name\N 1000 10000 50000 100000
Cassandra.L 1.63 15.15 71.94 141.76
Cassandra.M 1.63 15.15 72.01 142.26
Cassandra.S 1.63 15.04 72.18* 142.45*
Cassandra.N 5.03* 44.70* 106.95* 203.20*
MyCassandra 1.61 14.82 70.49 136.72
get
db name\N 1000 10000 50000 100000
Cassandra.L 0.53 2.36 8.76 16.86
Cassandra.M 0.53 2.37 8.77 24.08
Cassandra.S 0.53 3.79 14.45* 27.08*
Cassandra.N 0.85* 3.87* 17.36* 29.96*
MyCassandra 0.69 4.03 17.21 32.89

512バイトのランダム文字列のカラムから成るN件のRowをランダムな順でそれぞれM回書き込んで読むこむ

M=5
db name\N 1000 10000
Cassandra.L 6.34 50.65
Cassandra.M 6.36 50.70
Cassandra.S 6.35 57.29*
Cassandra.N 16.90* 100.06*
MyCassandra 7.17 56.44

考察

特にindexingやbloom filterなどの最適化をしていないMyCassandraですが、少し最適化を加えればCassandraといい勝負ができそうな感じ。
やはり、データがオンメモリ(on MemTable)かどうかでgetのパフォーマンスに影響を与えるもよう。その点ではMyCassandraのMySQLの設定も大きく関わってくるような気がした。そもそもどのようなメモリ条件にすればCassandraとMyCassandraがイーブンになるかを調査する必要がある。

一方、MyCassandraはCassandraと比べると多くのヒープメモリを利用してるようでN=100000件に対してJVMのヒープサイズが1GBだと足りなかった。この問題を解決する必要がある。

今後は複数ノードで測定することと、YCSBを使った複雑なクエリに対して性能評価したい。