MySQLの従来のレプリケーションでは、
今回は、
MTSについて
前提として、slave_
オプションに0より大きい数値を設定します。デフォルトは0
このオプションは、
この設定はオンラインで設定変更可能ですが、
mysql> SET GLOBAL slave_parallel_workers=4; Query OK, 0 rows affected (0.00 sec) mysql> STOP SLAVE SQL_THREAD; Query OK, 0 rows affected (0.00 sec) mysql> START SLAVE SQL_THREAD; Query OK, 0 rows affected (0.00 sec)
performance_
のthreads
からスレーブワーカースレッドが起動しているかがわかります。
mysql> SELECT name FROM threads WHERE name LIKE '%slave_worker%'; +-------------------------+ | NAME | +-------------------------+ | thread/sql/slave_worker | | thread/sql/slave_worker | | thread/sql/slave_worker | | thread/sql/slave_worker | +-------------------------+
slave_
がスレーブワーカースレッドです。
MySQL 5.6のMTS
MySQL5.
たとえば、slave_
とすることで3つのワーカースレッドが起動され、
またMySQL 5.
MySQL 5.7のMTS
MySQL5.LOGICAL_
方式が追加されました。
この方式は、
slave_
オプションが追加され、LOGICAL_
を設定することで動作します。デフォルトはDATABASE
で、MySQL 5.
の動作となります。
MySQL 5.7.22以降 または MySQL 8.0のMTS
MySQL5.WRITESET
方式による並列化することが可能になりました。
binlog_
オプションが追加され、WRITESET
またはWRITESET_
と設定することで動作します。デフォルトはCOMMIT_
で、MySQL 5.
の動作となります。また、transaction_
オプションをXXHASH64
に設定する必要があります。
この方式はトランザクションの依存関係を追跡、
注意事項
MTSではリレーログから実行された一連のトランザクションにギャップが生じることがあります。ギャップとは、
slave_
preserve_ commit_ order=1 slave_
parallel_ type=LOGICAL_ CLOCK log-bin
log-slave-updates
この設定をすることで、
また、START SLAVE
できないことがあります。
- スレーブワーカースレッドが強制終了した場合
- コーディネータスレッドが強制終了した場合
- MySQLが強制終了した場合
その場合は、START SLAVE UNTIL SQL_
ステートメントを使用して、RESET SLAVE
を実施して解決することができます。詳しくはマニュアル:13.
ちなみに、SQL_
以外のSTART SLAVE UNTIL
構文は使用できません。
ギャップの発生は防ぐことはできましたが、SHOW SLAVE STATUS
を表示したときのExec_
は実行された箇所よりも以前の箇所にある可能性があります。この問題は現状では防ぐことはできません。
たとえば、--dump-slave
を使用したmysqldumpコマンドにてバックアップを取得し、START SLAVE
すると、
GTIDベースのレプリケーションであれば、
ポジションベースの場合は、
mysql> STOP SLAVE; mysql> SET GLOBAL slave_parallel_workers=0; mysql> START SLAVE;