MySQL Group Replication vs Percona XtraDB Cluster 〜フルデータコピー中のDDLブロック 編〜
フルデータコピーが行われるタイミング
PXC や MySQL Group Replication では、新規にノードを追加したタイミングや、障害発生後、既存ノードからデータをコピーし、復旧する機能があります。
データコピー中のDDLの挙動の比較
フルデータコピーには非常に時間がかかることが予想されます。 DDLはあまり日常的に流れるものではないと思いますが、万が一、コピー中にDDLが走ってしまったときにどうなるか確認してみます。
検証内容:
PXC は キツイ挙動をする
Percona XtraDB Cluster では、このフルデータコピープロセスは State Snapshot Transfers (SST) と呼ばれています。 なんだかカッコイイ名前がついていますが、実態は、xtrabackup によるリカバリです。
コピー元となるノードで、xtrabackup による物理バックアップを取得し、コピー先に転送します。
PXC では、フルデータコピー中(xtrabackup 実行中)はDDLがブロックされます。DDL実行が待機させられます。
DDLが単品で待機させられるだけなら、まぁ、良いのですが、、、「DDL実行中は、クラスタ全体の更新がブロックされる」という仕様に基づき、すべてのINSERTやUPDATEが巻き込まれて止まります😱
xtrabackup でバックアップ中にDDLが実行されるとバックアップが失敗するため、DDLをブロックしているのでしょう。SSTを行うスクリプトで、xtrabackup の引数に明示的に --block-ddl
が指定されていることが、確認できます。
/usr/bin/wsrep_sst_xtrabackup-v2 INNOBACKUP="${pxb_bin_path} --defaults-file=${WSREP_SST_OPT_CONF} \ --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $iopts \ \$INNOEXTRA \$keyringbackupopt --lock-ddl --backup --galera-info \ --binlog-info=ON \$encrypt_backup_options --stream=\$sfmt \ --xtrabackup-plugin-dir="$pxb_plugin_dir" \ --target-dir=\$itmpdir 2>\${DATA}/innobackup.backup.log"
定期的にバッチでDDLを流しているようなケース(パーティション追加など)では、バッチとフルデータコピーが重ならないように運用しなければなりません。つらい。。。
Group Replication は好ましい挙動
Group Replication のノードリカバリは Clone プラグインを使って実装されています。 データファイルを物理的にコピー先のノードへコピーします。
Group Replication でも、フルデータコピー中はDDLの実行が待機させられています。addInstance
でノードを追加したタイミングで、CREATE PROCEDURE
がストップしていることがわかります。
Clone プラグインのマニュアルにもドナー(コピー元)で、DDLが ブロックされると明記されています。
On the donor, the clone user requires the BACKUP_ADMIN privilege for accessing and transferring data from the donor, and for blocking DDL during the cloning operation. https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-remote.html
ただし、Group Replication は PXCとは異なり、DDL実行中に更新クエリをブロックすることはありません。したがって、フルデータコピー中であっても、INSERTやUPDATEが影響を受けることはありません。 Groiup Replication のほうが好ましい挙動です。
余談ですが、Clone プラグインには、データコピーに利用するネットワーク帯域幅に制限をかける clone_max_network_bandwidth
パラメータがあります。
このパラメータを活用することで、意図的にフルデータコピーに時間のかかる状況を簡単に作り出せました。検証がしやすかったです。