PolarDBは、非同期メタデータロック (MDL) レプリケーション機能をサポートしており、DDL操作の実行効率を向上させています。 このトピックでは、この機能について説明します。
サポートされているバージョン
- PolarDB for MySQLすべてのリビジョンバージョンの5.6および5.7クラスターがこの機能をサポートしています。
- PolarDB for MySQL 8.0クラスターのリビジョンバージョンは8.0.1.1.10以降です。 クラスターバージョンを表示する方法の詳細については、「エンジンバージョンの照会」をご参照ください。
背景
データベースでDDL操作を実行する場合、プライマリノードと読み取り専用ノードの間でMDL情報を同期して、データ定義を一貫させる必要があります。 ただし、プライマリノード上のDDL操作はMDLを占有することがよくあります。 その結果、読み取り専用ノードは、MDL情報を取得できるようになるまで長い時間待たなければならない。 MDL情報が同期される前に、読み取り専用ノードはredoログを解析しなくなります。 これは、DDL動作の効率に深刻な影響を及ぼす。
PolarDBは、非同期メタデータロックレプリケーション機能を使用して、MDL同期をredoログ解析から切り離します。 このように、読み取り専用ノードは、同期されるメタデータロック情報を待っている場合でも、再実行ログを解析して適用できます。
非同期メタデータロックレプリケーション機能の使用
- この機能は、サポートされているクラスターとともに提供されます。 追加の設定は必要ありません。
- 読み取り専用ノードで次のステートメントを実行して、読み取り専用ノードからMDL同期に関連する情報を取得できます。
SELECT * from INFORMATION_SCHEMA.INNODB_LOG_MDL_SLOT;
説明- PolarDBクラスターは、次のいずれかの要件を満たす必要があります。
- PolarDB for MySQLクラスターはMySQL 8.0.1を実行し、リビジョンバージョンは8.0.1.1.24以降です。
- PolarDB for MySQLクラスターはMySQL 5.7を実行し、リビジョンバージョンは5.7.1.0.20以降です。
- PolarDB for MySQLクラスターはMySQL 5.6を実行し、リビジョンバージョンは5.6.1.0.33以降です。
- クラスターが上記の要件を満たしていない場合は、クラスターバージョンのアップグレードを推奨します。
- 指定したノードでクエリを強制的に実行する方法については、「概要」の「ヒント」セクションをご参照ください。
次の応答が返されます。
+ --------- ------------- ------------------- + --------------- ------------------- + | slot_id | slot_state | slot_name | slot_lsn | thread_id | --------- ------------ ------------------- --------------- ------------------- + | 0 | SLOT_NONE | ターゲットテーブルなし | 0 | 実行中のスレッドなし | | 1 | SLOT_NONE | ターゲットテーブルなし | 0 | 実行中のスレッドなし | | 2 | SLOT_NONE | ターゲットテーブルなし | 0 | 実行中のスレッドなし | | 3 | SLOT_NONE | ターゲットテーブルなし | 0 | 実行中のスレッドなし | | 4 | SLOT_NONE | ターゲットテーブルなし | 0 | 実行中のスレッドなし | --------- ------------ ------------------- --------------- ------------------- +
この表は、同期されているMDL情報の詳細を示しています。 この表のslot_name
列は関連するデータテーブル情報を示し、slot_state
列は現在のMDL同期のステータスに関する情報を示します。- SLOT_NONE: 初期化状態。
- SLOT_RESERVED: 読み取り専用ノードは、MDL情報の要求を受信しており、この要求を処理するためにスケジューリングシステムによって割り当てられたワーカースレッドを待っています。
- SLOT_ACQUIRING: システムはワーカースレッドのリソースを割り当てており、読み取り専用ノードはMDL要求を送信しています。 説明 読み取り専用ノードが必要とするMDLが他の接続によって保持されている場合、MDL同期はこの状態のままです。
- SLOT_LOCKED: 読み取り専用ノードのMDLが取得および保持されています。
- SLOT_RELEASING: 読み取り専用ノードは、MDL解放要求を受信しており、要求を処理するためにスケジューリングシステムによって割り当てられたワーカースレッドを待っています。
- PolarDBクラスターは、次のいずれかの要件を満たす必要があります。
- 次のステートメントを実行して、MDL同期要求を処理するために読み取り専用ノードによって使用されるワーカースレッドに関するステータス情報を照会できます。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_THREAD;
説明- PolarDBクラスターは、次のいずれかの要件を満たす必要があります。
- PolarDB for MySQLクラスターはMySQL 8.0.1を実行し、リビジョンバージョンは8.0.1.1.24以降です。
- PolarDB for MySQLクラスターはMySQL 5.7を実行し、リビジョンバージョンは5.7.1.0.20以降です。
- PolarDB for MySQLクラスターはMySQL 5.6を実行し、リビジョンバージョンは5.6.1.0.33以降です。
- クラスターが上記の要件を満たしていない場合は、クラスターバージョンのアップグレードを推奨します。
- 指定したノードでクエリを強制的に実行する方法については、「概要」の「ヒント」セクションをご参照ください。
次の応答が返されます。
+ ---------- -------------- ------------------ + ------------------- ------------ | thread_id | thr_state | slot_state | slot_name | slot_lsn | ---------- ------------- ------------------ ------------------- ----------- | 0 | free | 取得中ではない | ターゲットテーブルなし | 0 | | 1 | free | 取得中ではない | ターゲットテーブルなし | 0 | | 2 | free | 取得中ではない | ターゲットテーブルなし | 0 | | 3 | free | 取得中ではない | ターゲットテーブルなし | 0 | ---------- ------------- ------------------ ------------------- ------------
状態が
SLOT_ACQUIRING
であるMDL同期リクエストがINNODB_LOG_MDL_SLOT
テーブルに存在する場合、対応するワーカースレッドがINNODB_LOG_MDL_thread
テーブルでリクエストを処理できます。 これは、thr_state
パラメーターの値がfree
ではないことを示します。 この場合は、読み出し専用ノードが高い確率でMDLを待っていることを示している。thr_state
パラメーターの値がfree
であるかどうかに基づいて、MDLが占有されているかどうかを確認できます。 - PolarDBクラスターは、次のいずれかの要件を満たす必要があります。