はじめに
EC2上にMySQL 5.5系のサーバーとMySQL Clusterのサーバーを構築してmysqlslapでベンチマークを取ってみた- ついでに
RDSでも同じようなベンチマークを取ってみた - 尚、
MySQL Clusterは複数台構成ではなく一台構成(複数台構成は別途検証を行う)
参考
構成
以下のような構成でベンチマークを行った。

MySQL と MySQL-Cluster に関しては EC2 インスタンス上に構築して同一ホスト上から mysqlslap を実行した。。RDS に関してはリモートホストの端末からmysqlslap を実行した。
準備
ベンチマークを取得する環境
ベンチマークを取得する環境は以下の通り。
| MySQL バージョン | インスタンスタイプ | 備考 |
|---|---|---|
| MySQL-Cluster-7.3 | m1.medium | MySQL 5.6.14-ndb-7.3.3-cluster-gpl |
| MySQL 5.5 | m1.medium | MySQL 5.5.34 |
| RDS | m1.medium | MySQL 5.6.13 or MySQL 5.5.8 を選択 |
ベンチマークスクリプト(というほどでもないけど)
ベンチマークには mysqlslap を利用する。
/usr/bin/mysqlslap --no-defaults --concurrency=50 --iterations=1 --number-int-cols=2 --number-char-cols=3 \ --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=key --auto-generate-sql-write-number=1000 \ --number-of-queries=100000 --host=localhost --port=3306 --user=root --csv=/tmp/bench_result.csv
上記のようなスクリプトを利用する。主なパラメータは以下のような感じ。詳細はこちら。
| パラメータ | 値 | 備考 |
|---|---|---|
| iterations | 3 | テストの試行回数 |
| concurrency | 50 | 並列度(シミュレートするクライアントの数) |
| number-int-cols | 2 | 使用する INT 型カラムの数 |
| number-char-cols | 3 | 使用する VARCHAR 型カラムの数 |
| auto-generate-sql-write-number | 1000 | 各スレッドで実行する行挿入の回数を指定 |
| number-of-queries | 10000 | 各クライアントのクエリー数 |
User Data を使って構築からベンチマークまで一発で
EC2 のインスタンスを起動する際に User Data を起動するインスタンスにパラメータとして渡すことが出来るのでそれを利用して AMI からの構築からベンチマークの取得まで一気に実行してしまう。以下のようなシェルスクリプトをそれぞれ書いてみた。
それぞれを保存して以下のようにして awscli を使って以下のようにインスタンスを起動する。(※スクリプト内で MySQL の root のパスワードを行っていないが、実際の運用ではちゃんとパスワードの設定をするように!)
id=`aws ec2 run-instances --image-id ami-xxxxxxx --count 1 --instance-type m1.medium --key-name ${key} --security-group-ids sg-xxxxxxx --subnet-id subnet-xxxxxxx --associate-public-ip-address --user-data file://path/to/script |jq '.Instances[]|.InstanceId' | sed 's/"//g'`
aws ec2 create-tags --resources $id --tags Key=Name,Value=${instance_name}
--user-data file://path/to/script で上記で作成したシェルスクリプトを渡している。また、インスタンスの名前を付けておきたいのでインスタンスの ID を取得後に create-tags でタグを設定している。
RDS の場合
RDS は手動でインスタンスを立ち上げる。awscli を使っても作成可能なので別の機会に試してみる。
MySQL 5.6.13 の設定。

MySQL 5.5.8 の設定。

上記のような設定。
ベンチマーク結果
以下のような結果となった。(3 回試行結果の平均値)
read
| MySQL バージョン | 結果(sec) | 備考 |
|---|---|---|
| MySQL-Cluster-7.3 | 292.00 | |
| MySQL 5.5 | 309.7 | MySQL 5.5.34 |
| RDS | 計測なう | MySQL 5.6.13 |
| RDS | 計測なう | MySQL 5.5.8 |
key
| MySQL バージョン | 結果(sec) | 備考 |
|---|---|---|
| MySQL-Cluster-7.3 | 19.88 | |
| MySQL 5.5 | 17.94 | MySQL 5.5.34 |
| RDS | 22.20 | MySQL 5.6.13 |
| RDS | 21.82 | MySQL 5.5.8 |
write
| MySQL バージョン | 結果(sec) | 備考 |
|---|---|---|
| MySQL-Cluster-7.3 | 35.06 | |
| MySQL 5.5 | 31.62 | MySQL 5.5.34 |
| RDS | 48.17 | MySQL 5.6.13 |
| RDS | 39.35 | MySQL 5.5.8 |
あれれれのれ。EC2 上の MySQL や MySQL-Cluster は特にチューニングも行っていないインストール仕立ての状態なので、ちゃんとチューニングされている(という認識でいる)RDS の方が良い結果が出るのではと予想していたが意外な結果となった。
おまけで奮発して RDS の db.m2.4xlarge を使ってベンチマークを取ってみた。
| 回数 | read | write |
|---|---|---|
| 1 | 435.873 | 24.091 |
| 2 | 482.095 | 20.121 |
| 3 | 473.345 | 22.222 |
| 平均 | 463.77 | 22.14 |
ん、期待したほどでは無い...。
最後に
- ベンチマークの結果は意外な結果となったけど
User Dataの使い方等知ることが出来て良かった - 引き続き、
RDSとMySQL-Clusterについて調べていく - 個人で検証するには課金がドキドキ