はじめに
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
について調べていく - 個人で検証するには課金がドキドキ