MySQL5.7からslave_parallel_workersを調整してスレーブの遅延が対応出来る事は、
色々な資料やブログ等にも書かれているので詳細はそちらを確認してみて下さい。
Oracle MySQL Cloud Service(OC3 = 2vCPU)の環境でSQLSLAPで負荷をかけてみて、
マスターとスレーブで遅延がどれだけ解消できるか?若しくはどこまで調整すれば良いか確認してみました。
slave_parallel_workersを1,2,4,8,16,32と変更して確認した中では、slave_parallel_workers=8が安定していました。
但し、slave_parallel_workersが多いからと言ってCPUが少ないインスタンスより上がる訳では無く、全体的なシステムのバランスが重要なようです。
スレーブのCPUや実行されているQuery等を確認して、適宜最適な値を調整出来ると良いですね。
環境
Oracle Cloud
MySQL Service
Instance: OC3 (2vCPU)
Monitoring: MySQL Enterprise Monitor
slave_parallel_workers=1
mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> SET GLOBAL SLAVE_PARALLEL_WORKERS=1; Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.04 sec) mysql> show variables like 'SLAVE_PARALLEL_WORKERS'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | slave_parallel_workers | 1 | +------------------------+-------+ 1 row in set (0.00 sec) mysql>
[oracle@study01-mysql-1 ~]$ ./mysqlslap.sh Benchmark Running for engine InnoDB Average number of seconds to run all queries: 38.711 seconds Minimum number of seconds to run all queries: 38.711 seconds Maximum number of seconds to run all queries: 38.711 seconds Number of clients running queries: 10 Average number of queries per client: 10000 [oracle@study01-mysql-1 ~]$
slave_parallel_workers=8
mysql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL SLAVE_PARALLEL_WORKERS=8; Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.02 sec) mysql> show variables like 'SLAVE_PARALLEL_WORKERS'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | slave_parallel_workers | 8 | +------------------------+-------+ 1 row in set (0.01 sec) mysql>
[oracle@study01-mysql-1 ~]$ ./mysqlslap.sh Benchmark Running for engine InnoDB Average number of seconds to run all queries: 38.466 seconds Minimum number of seconds to run all queries: 38.466 seconds Maximum number of seconds to run all queries: 38.466 seconds Number of clients running queries: 10 Average number of queries per client: 10000 [oracle@study01-mysql-1 ~]$
以下、MySQL Enterprise Monitorで確認したグラフです。スレーブの遅延の状況が分かり易いですね。
slave_parallel_workers=2とslave_parallel_workers=8の差です。
1) Master -> 2) slave_parallel_workers=8 -> slave_parallel_workers=2の順にデータベース内での処理が終わっています。
slave_parallel_workers=2とslave_parallel_workers=32の差です。
この検証では、マスターとスレーブがほぼ同時に終了しています。
数回CPUの負荷を取得してみましたが、今回の環境ではThreadが少ない方がCPU負荷が上がっていました。何処に差があるかはまた別途確認してみますが、Threadが多いからと言って必ずしも少ないインスタンスよりCPU負荷が上がる訳では無さそうです。
[oracle@study02-mysql-1 ~]$ 01:00:01 PM CPU %user %nice %system %iowait %steal %idle 01:10:01 PM all 0.97 0.08 0.18 0.80 0.07 97.90 01:20:01 PM all 4.08 0.32 0.31 4.32 0.08 90.89 01:30:01 PM all 0.78 2.31 7.91 8.56 0.12 80.33 01:40:01 PM all 0.57 2.46 7.94 10.96 0.13 77.93 01:50:01 PM all 0.61 0.14 0.09 0.66 0.06 98.44 02:00:01 PM all 0.74 0.14 0.09 0.63 0.07 98.33 Average: all 0.10 0.10 0.22 0.69 0.06 98.83 [oracle@study03-mysql-1 ~]$ 01:00:01 PM CPU %user %nice %system %iowait %steal %idle 01:10:01 PM all 0.79 0.15 0.09 0.55 0.06 98.35 01:20:01 PM all 0.68 0.34 0.16 3.82 0.09 94.91 01:30:01 PM all 0.56 1.75 0.70 6.41 0.10 90.48 01:40:01 PM all 0.58 1.75 0.75 8.11 0.12 88.69 01:50:01 PM all 0.52 0.13 0.09 0.43 0.08 98.75 02:00:01 PM all 0.55 0.13 0.09 0.86 0.07 98.30 Average: all 0.23 0.09 0.08 0.61 0.07 98.93
大目に負荷をかけて、もう少し長いスパンで影響を確認してみました
[oracle@study01-mysql-1 ~]$ ./mysqlslap.sh Benchmark Running for engine InnoDB Average number of seconds to run all queries: 185.845 seconds Minimum number of seconds to run all queries: 185.845 seconds Maximum number of seconds to run all queries: 185.845 seconds Number of clients running queries: 10 Average number of queries per client: 50000 [oracle@study01-mysql-1 ~]$
以下の、グラフを確認してみるとslave_parallel_workersを適切に調節すれば、レプリケーションの遅延、余計なCPU負荷の削減なども出来る事が確認出来ます。
補足: SHOW SLAVE STATUSによるマスターからの遅延状況の確認
slave_parallel_workersが8と16では殆ど変りが無い事が分かります。
サーバースペック、ネットワーク、インスタンスの負荷等によっても変わってくるので適宜調整下さい。