はじめに
2017年4月19日に、Percona XtraDB Cluster (以下: PXC) 5.7 の最新バージョンである 5.7.17-29.20 がリリースされました。
上記のリリースノートを読むと、衝撃的な記述があります。曰く、「パフォーマンスが10倍近くまで改善された」という内容です。
This release was focused on performance and scaling capability with increasing workload threads.
Tests show up to 10 times increase in performance.
こちらについては、公式ブログである Percona Performance Blog に投稿された以下の記事でも、実際のベンチマーク結果と共に解説されています。たしかにベンチマーク結果を見る限りでは、スコアが10倍近く伸びていることが分かります。
“Performance improvements in Percona XtraDB Cluster 5.7.17-29.20”
https://www.percona.com/blog/2017/04/19/performance-improvements-percona-xtradb-cluster-5-7-17/
検証
しかしながら、ここまでの情報をみても「本当か?」という思いが拭い切れないと思います。そこで、手元のDocker環境で、実際に PXC 5.7.17 のパフォーマンスを計測してみました。
※ 以下の記事の「2. Docker, docker-compose をセットアップ」、および設定ファイルの配置まで完了しているものとします
Dockerで Percona XtraDB Cluster 環境を構築する方法
1. sysbench1.0 と Percona-Server-client のインストール
Percona Serverのyumリポジトリを利用して、ベンチマークツールであるsysbenchをインストールします。また、あわせてPercona Server 5.7のクライアントもインストールします。
※ クライアントはインストール済みのものを使用しても構いません
1 2 3 |
# yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm # yum install -y sysbench # yum install -y Percona-Server-client-57 |
2. 2種類のymlファイルを用意する
以下、5.7.16 用と 5.7.17 用の、2つのdocker-compose.ymlを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# cat << EOT >> ./5.7.16_docker-compose.yml version: '2' services: node01: image: percona/percona-xtradb-cluster:5.7.16 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_NAME=demo - XTRABACKUP_PASSWORD=password volumes: - ./node1_conf.d:/etc/mysql/conf.d ports: - "13306:3306" node02: image: percona/percona-xtradb-cluster:5.7.16 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_JOIN=node01 - CLUSTER_NAME=demo - XTRABACKUP_PASSWORD=password volumes: - ./node2_conf.d:/etc/mysql/conf.d ports: - "13307:3306" depends_on: - node01 node03: image: percona/percona-xtradb-cluster:5.7.16 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_JOIN=node01 - CLUSTER_NAME=demo - XTRABACKUP_PASSWORD=password volumes: - ./node3_conf.d:/etc/mysql/conf.d ports: - "13308:3306" depends_on: - node01 networks: cluster: driver: bridge EOT |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# cat << EOT >> ./5.7.17_docker-compose.yml version: '2' services: node01: image: percona/percona-xtradb-cluster:5.7.17 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_NAME=demo - XTRABACKUP_PASSWORD=password volumes: - ./node1_conf.d:/etc/mysql/conf.d ports: - "13306:3306" node02: image: percona/percona-xtradb-cluster:5.7.17 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_JOIN=node01 - CLUSTER_NAME=demo - XTRABACKUP_PASSWORD=password volumes: - ./node2_conf.d:/etc/mysql/conf.d ports: - "13307:3306" depends_on: - node01 node03: image: percona/percona-xtradb-cluster:5.7.17 networks: - cluster environment: - MYSQL_ROOT_PASSWORD=password - CLUSTER_JOIN=node01 - CLUSTER_NAME=demo - XTRABACKUP_PASSWORD=password volumes: - ./node3_conf.d:/etc/mysql/conf.d ports: - "13308:3306" depends_on: - node01 networks: cluster: driver: bridge EOT |
3. PXC 5.7.16 を起動する
PXC 5.7.16 の3ノードを起動します。-f オプションで使用するyml ファイルを指定します。
1 2 3 4 5 6 7 8 9 10 11 |
# docker-compose -f ./5.7.16_docker-compose.yml up -d node01 # docker-compose -f ./5.7.16_docker-compose.yml logs -f -> 立ち上がったことを確認したら、Ctrl + C # docker-compose -f ./5.7.16_docker-compose.yml up -d node02 # docker-compose -f ./5.7.16_docker-compose.yml logs -f -> 立ち上がったことを確認したら、Ctrl + C # docker-compose -f ./5.7.16_docker-compose.yml up -d node03 # docker-compose -f ./5.7.16_docker-compose.yml logs -f -> 立ち上がったことを確認したら、Ctrl + C |
4. sysbenchを実行する
全ノードが正常に立ち上がったら、node1に対してsysbenchを実行します。実行するシナリオ(.luaファイル)は、更新クエリーのみで構成される「oltp_update_index.lua」です。
1 2 3 4 5 6 7 8 9 10 11 |
# mysql -u root -ppassword -h 127.0.0.1 -P 13306 -e "CREATE DATABASE sbtest;" # sysbench --events=50000 --threads=32 --db-driver=mysql \ --table_size=100000 --mysql-host=127.0.0.1 --mysql-port=13306 \ --mysql-user=root --mysql-password=password --mysql-ignore-errors=1062,1213 \ /usr/share/sysbench/oltp_update_index.lua prepare # sysbench --time=600 --events=50000 --threads=32 --db-driver=mysql \ --table_size=100000 --mysql-host=127.0.0.1 --mysql-port=13306 \ --mysql-user=root --mysql-password=password --mysql-ignore-errors=1062,1213 \ /usr/share/sysbench/oltp_update_index.lua run | tee ./5716_sysbench_result.txt |
5. PXC 5.7.16 のコンテナを破棄し、PXC 5.7.17 を起動する
PXC 5.7.16 のコンテナを全て破棄します。
1 2 |
# docker-compose -f ./5.7.16_docker-compose.yml stop # docker-compose -f ./5.7.16_docker-compose.yml rm |
今度は、PXC 5.7.17 のコンテナを起動します。手順は同じです。
1 2 3 4 5 6 7 8 9 10 11 |
# docker-compose -f ./5.7.17_docker-compose.yml up -d node01 # docker-compose -f ./5.7.17_docker-compose.yml logs -f -> 起動したことを確認したら、Ctrl + C # docker-compose -f ./5.7.17_docker-compose.yml up -d node02 # docker-compose -f ./5.7.17_docker-compose.yml logs -f -> 起動したことを確認したら、Ctrl + C # docker-compose -f ./5.7.17_docker-compose.yml up -d node03 # docker-compose -f ./5.7.17_docker-compose.yml logs -f -> 起動したことを確認したら、Ctrl + C |
6. sysbenchを実行する
PXC5.7.17 に対して、先ほどと同じ条件で sysbench を実行します。
1 2 3 4 5 6 7 8 9 10 11 |
# mysql -u root -ppassword -h 127.0.0.1 -P 13306 -e "CREATE DATABASE sbtest;" # sysbench --events=50000 --threads=32 --db-driver=mysql \ --table_size=100000 --mysql-host=127.0.0.1 --mysql-port=13306 \ --mysql-user=root --mysql-password=password --mysql-ignore-errors=1062,1213 \ /usr/share/sysbench/oltp_update_index.lua prepare # sysbench --time=600 --events=50000 --threads=32 --db-driver=mysql \ --table_size=100000 --mysql-host=127.0.0.1 --mysql-port=13306 \ --mysql-user=root --mysql-password=password --mysql-ignore-errors=1062,1213 \ /usr/share/sysbench/oltp_update_index.lua run | tee ./5717_sysbench_result.txt |
7. sysbenchの結果を比較する
取得した「5716_sysbench_result.txt」と「5717_sysbench_result.txt」を比較します。diff コマンドが便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# diff ./5716_sysbench_result.txt ./5717_sysbench_result.txt 15,19c15,19 < write: 2852 < other: 5648 < total: 8500 < transactions: 8500 (14.00 per sec.) < queries: 8500 (14.00 per sec.) --- > write: 6624 > other: 13416 > total: 20040 > transactions: 20040 (33.12 per sec.) > queries: 20040 (33.12 per sec.) ... (以下略) ... |
この結果をみると、「10倍」とまではいかないものの「2~3倍」くらいはパフォーマンスが改善されていることが確認できます。
改善の理由
“How We Made Percona XtraDB Cluster Scale”
https://www.percona.com/blog/2017/04/19/how-we-made-percona-xtradb-cluster-scale/
ちなみに、PXC5.7.17でこれ程までにパフォーマンスが改善した理由については、上記のブログ記事で解説されています。この内容をまとめますと、改善したポイントは以下の2点のようです。
- InnoDBのprepareフェーズ(≒クエリーの実行)を並列で実行できるようにした
- トランザクションのコミット順は、MySQLのGROUP COMMITキューの順番に準拠するようにした(Galera側のコミット順チェックは冗長だから止めた)
つまり、同時並列性能が大きく改善されているようです。そのため、より高スペックなサーバー環境であれば、更なるパフォーマンス(10倍近い?)が期待できるかもしれません。