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-binlog-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;