プライマリノードで DDL 操作が実行されると、メタデータロック (MDL) が保持されます。読み取り専用ノードは、redo ログの解析を再開する前に、そのロック情報が同期されるのを待つ必要があります。これにより、DDL 操作が停止します。非同期 MDL レプリケーションは、MDL 同期を redo ログの解析から分離します。これにより、読み取り専用ノードはロック情報を待機している間も redo ログの適用を継続でき、DDL がクラスターのパフォーマンスに与える影響を軽減します。
サポート対象バージョン
| バージョン | 最小リビジョン |
|---|---|
| PolarDB for MySQL 5.6 | すべてのリビジョンバージョン |
| PolarDB for MySQL 5.7 | すべてのリビジョンバージョン |
| PolarDB for MySQL 8.0 | 8.0.1.1.10 以降 |
クラスターのバージョンを確認するには、「エンジンバージョンの照会」をご参照ください。
仕組み
非同期 MDL レプリケーションがない場合、読み取り専用ノードでは MDL 同期と redo ログの解析が結合されています。
| プライマリノード | 読み取り専用ノード |
|---|---|
| DDL を実行 — MDL を取得 | MDL を同期するための信号を受信 |
| DDL が MDL を保持 | MDL 同期の完了を待機 |
| 待機中に redo ログの解析を停止 | |
| DDL が完了 — MDL を解放 | MDL 同期が完了 — redo ログの解析を再開 |
非同期 MDL レプリケーションを使用すると、読み取り専用ノードはこれら 2 つの操作を分離します。専用のワーカースレッドが並行して MDL 同期を処理する間、バックグラウンドで redo ログの解析と適用を継続します。
MDL 同期のモニタリング
この機能は、サポートされているクラスターではデフォルトで有効になっています。構成は不要です。
2 つの INFORMATION_SCHEMA ビューを使用すると、読み取り専用ノードの MDL 同期状態を検査できます。
どちらのクエリにも、以下の最小リビジョンバージョンが必要です。ご利用のクラスターがこれらの要件を満たしていない場合は、「クラスターバージョンのアップグレード」をご参照ください。
MySQL 8.0.1:リビジョン 8.0.1.1.24 以降
MySQL 5.7:リビジョン 5.7.1.0.20 以降
MySQL 5.6:リビジョン 5.6.1.0.33 以降。特定のノードでクエリを実行するには、「概要」の「ヒント」セクションをご参照ください。
MDL スロット状態のクエリ
読み取り専用ノードで次のステートメントを実行して、すべてのアクティブな MDL 同期スロットを表示します。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_SLOT;出力例:
+---------+------------+-------------------+----------+-------------------+
| slot_id | slot_state | slot_name | slot_lsn | thread_id |
+---------+------------+-------------------+----------+-------------------+
| 0 | SLOT_NONE | no targeted table | 0 | no running thread |
| 1 | SLOT_NONE | no targeted table | 0 | no running thread |
| 2 | SLOT_NONE | no targeted table | 0 | no running thread |
| 3 | SLOT_NONE | no targeted table | 0 | no running thread |
| 4 | SLOT_NONE | no targeted table | 0 | no running thread |
+---------+------------+-------------------+----------+-------------------+各行は 1 つの MDL 同期スロットを表します。slot_name 列はターゲットテーブルを識別し、slot_state は現在の同期フェーズを示します。
slot_state | 意味 |
|---|---|
SLOT_NONE | 初期化状態。アクティブな MDL リクエストはありません。 |
SLOT_RESERVED | 読み取り専用ノードが MDL リクエストを受信し、スケジューラからのワーカースレッドを待機しています。 |
SLOT_ACQUIRING | ワーカースレッドが割り当てられ、読み取り専用ノードが MDL リクエストを送信しています。MDL が別の接続によって保持されている場合、ロックが解放されるまでスロットはこの状態のままになります。 |
SLOT_LOCKED | MDL が取得され、読み取り専用ノードによって保持されています。 |
SLOT_RELEASING | 読み取り専用ノードが MDL 解放リクエストを受信し、スケジューラからのワーカースレッドを待機しています。 |
ロック待ちの診断:スロットが SLOT_ACQUIRING 状態でスタックしている場合、読み取り専用ノードが別の接続によって保持されている MDL を待機している可能性が高いことを示します。以下のワーカースレッドのクエリを使用して確認し、プライマリノード上のいずれかの接続が slot_name に表示されているテーブルのロックを保持しているかどうかを確認します。
ワーカースレッド状態のクエリ
読み取り専用ノードで次のステートメントを実行して、MDL 同期リクエストを処理しているワーカースレッドを表示します。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_THREAD;出力例:
+-----------+-----------+------------------+-------------------+----------+
| thread_id | thr_state | slot_state | slot_name | slot_lsn |
+-----------+-----------+------------------+-------------------+----------+
| 0 | free | not in acquiring | no targeted table | 0 |
| 1 | free | not in acquiring | no targeted table | 0 |
| 2 | free | not in acquiring | no targeted table | 0 |
| 3 | free | not in acquiring | no targeted table | 0 |
+-----------+-----------+------------------+-------------------+----------+INNODB_LOG_MDL_SLOT が SLOT_ACQUIRING 状態のスロットを示し、INNODB_LOG_MDL_THREAD 内の対応するワーカースレッドの thr_state が free でない場合、読み取り専用ノードが高い確率で MDL を待機しています。プライマリノード上のいずれかの接続が slot_name に表示されているテーブルのロックを保持しているかどうかを確認してください。
お問い合わせ
DDL 操作についてご質問がある場合は、お問い合わせください。
お問い合わせ
DDL 操作についてご質問がある場合は、テクニカルサポートにお問い合わせください。