mita2 database life

主にMySQLに関するメモです

MySQL Group Replication vs Percona XtraDB Cluster 〜フルデータコピー中のDDLブロック 編〜

フルデータコピーが行われるタイミング

PXCMySQL Group Replication では、新規にノードを追加したタイミングや、障害発生後、既存ノードからデータをコピーし、復旧する機能があります。

f:id:mita2db:20200906133955p:plain

データコピー中のDDLの挙動の比較

フルデータコピーには非常に時間がかかることが予想されます。 DDLはあまり日常的に流れるものではないと思いますが、万が一、コピー中にDDLが走ってしまったときにどうなるか確認してみます。

検証内容:

  1. CREATE / DROP PROCEDURE を流しつつ、フルデータコピーを走らせる
  2. 並行して、DDLを流しているDBへ更新、参照を行う

PXC は キツイ挙動をする

Percona XtraDB Cluster では、このフルデータコピープロセスは State Snapshot Transfers (SST) と呼ばれています。 なんだかカッコイイ名前がついていますが、実態は、xtrabackup によるリカバリです。

コピー元となるノードで、xtrabackup による物理バックアップを取得し、コピー先に転送します。

PXC では、フルデータコピー中(xtrabackup 実行中)はDDLがブロックされます。DDL実行が待機させられます。

f:id:mita2db:20200906135445g:plain

DDLが単品で待機させられるだけなら、まぁ、良いのですが、、、「DDL実行中は、クラスタ全体の更新がブロックされる」という仕様に基づき、すべてのINSERTやUPDATEが巻き込まれて止まります😱

mita2db.hateblo.jp

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 がストップしていることがわかります。

f:id:mita2db:20200906134638g:plain

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 パラメータがあります。 このパラメータを活用することで、意図的にフルデータコピーに時間のかかる状況を簡単に作り出せました。検証がしやすかったです。

まとめ

  • Percona XtraDB Cluster
    • コピー中、DDLがブロックされ、それに巻き込まれて、更新クエリもブロックされる
  • Group Replication
    • コピー中、DDLだけがブロックされる