すべてのプロダクト
Search
ドキュメントセンター

PolarDB:非同期メタデータロック複製

最終更新日:May 28, 2024

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解放要求を受信しており、要求を処理するためにスケジューリングシステムによって割り当てられたワーカースレッドを待っています。
  • 次のステートメントを実行して、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が占有されているかどうかを確認できます。