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を使った複雑なクエリに対して性能評価したい。