案件のついでにMySQL準同期レプリケーションを東京とシンガポールでやってみて、性能評価してみました。
準同期レプリケーションとはマスター側更新処理のcommit前にデータをスレーブに送ってackが返ってくるのを待って処理するという仕組みです。
なので普通にローカルでcommit(非同期レプリケーション)と比べると、処理が増えるしNWの影響も受ける形になります。
それをNW遅延が起こる環境(ex別の国)でやったらどうなの?(つまりNW影響はどの程度?)というのが今回の性能評価の目的です。
環境
- Amazon EC2 Microインスタンス@東京リージョン
- Amazon EC2 Microインスタンス@シンガポールリージョン
- 両リージョン間はおおよそ90~100ms程度
- MySQLは5.5.32、uname的にはこんなかんじ
Linux TOKYO 3.4.43-43.43.amzn1.x86_64 #1 SMP Mon May 6 18:04:41 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
手順
- 今回はmysqlslapを使って約1万件の単純なデータを突っ込み時間測定。
- 次にmysqlslapを使って約10万件の単純なデータを突っ込み時間測定。
- 準同期の環境をつくります。構築手順は割愛。
- 東京リージョンをMasterにしたので、東京側でmysqlslapを使って約1万件の単純なデータを突っ込み時間測定。
- 同様に東京側でmysqlslapを使って約10万件の単純なデータを突っ込み時間測定。
なお1万件の場合は5回、10万件の場合は3回実施した結果のアベレージをとります。
結果
Semisyncなし
1万件:68.088 sec
10万件:703.531 sec
SemiSyncあり
1万件:83.536 sec
10万件:785.457 sec
1万件で約1.2倍、10万件で1.1倍程度の違いが認められました。
当たり前ですが大きめの処理は要注意なものの、個人的には思ったよりはNW影響は受けない?と感じました。
とはいえ検証しているのがMicroなので瞬間によって状況も違うと思われ、一概にはいえませんけども。
そのうち気が向いたら東京リージョンの別サイト間や異なるクラウドでやってみようかと思います。
テスト結果のグラフです。クリックすると拡大されます。
おまけ(mysqlslapのコマンド)
1万件データを突っ込んだとき
mysqlslap --host=localhost --port=3306 --create-schema=mysqlslap -a --no-drop --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --number-int-cols=2 --number-char-cols=2 --auto-generate-sql-secondary-indexes=3 --auto-generate-sql-execute-number=100 --auto-generate-sql-write-number=100 -c 100 -e InnoDB
10万件データを突っ込んだとき
mysqlslap --host=localhost --port=3306 --create-schema=mysqlslap -a --no-drop --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --number-int-cols=2 --number-char-cols=2 --auto-generate-sql-secondary-indexes=3 --auto-generate-sql-execute-number=1000 --auto-generate-sql-write-number=1000 -c 100 -e InnoDB
※ 終わった後にDropせずにおいておいて、ちゃんと同期しているかは軽く確認もしました。