全部產品
Search
文件中心

PolarDB:並行中繼資料鎖同步

更新時間:Jul 06, 2024

PolarDB支援並行中繼資料鎖同步(Async Metadata Lock Replication)功能,用於提高DDL操作的執行效率。本文介紹如何使用並行中繼資料鎖同步功能。

前提條件

  • 對於PolarDB MySQL版5.6和5.7版本的叢集,所有Revision version都支援該功能。

  • 對於PolarDB MySQL版8.0版本的叢集,Revision version需為8.0.1.1.10或以上,您可以通過查詢版本號碼確認叢集版本。

功能介紹

對資料庫執行DDL操作時,需要在主節點和唯讀節點間同步中繼資料鎖(Metadata Lock,簡稱MDL)資訊來保證資料定義(Data Definition)的一致性。但主節點上的DDL操作常常會佔有MDL,導致唯讀節點在長時間的等待後才能擷取MDL資訊進行同步,而在MDL同步成功前,唯讀節點不再解析Redo Log,這將嚴重影響DDL操作的整體效率。

通過並行MDL同步功能,PolarDB將MDL同步操作與Redo Log的解析操作解耦,實現了即使在等待MDL鎖資訊進行同步時,唯讀節點仍能繼續解析並應用Redo Log。

使用方法

  • 該功能預設開啟,無需額外操作。

  • 您可以在唯讀節點上使用如下SQL語句,擷取目標唯讀節點上MDL同步相關的資訊:

    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_SLOT;
    說明
    • PolarDB叢集版本需為以下版本之一,才有許可權使用上述SQL語句:

      • PolarDB MySQL版8.0.1版本且Revision version為8.0.1.1.24及以上

      • PolarDB MySQL版5.7版本且Revision version為5.7.1.0.20及以上

      • PolarDB MySQL版5.6版本且Revision version為5.6.1.0.33及以上

      • 如果您的叢集版本不能滿足上述版本要求,建議您升級版本

    • 關於如何強制指定在某節點執行某查詢命令,請參見Hint文法

    返回結果如下:

    +---------+------------+-------------------+----------+-------------------+
    | 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 |
    +---------+------------+-------------------+----------+-------------------+

    該表展示了進行中同步的MDL資訊詳情,其中slot_name展示了相關的資料表資訊,slot_state展示了當前的MDL同步狀態資訊,包括:

    • SLOT_NONE:初始化狀態。

    • SLOT_RESERVED:唯讀節點已經接收到MDL擷取請求,等待調度系統分配背景工作執行緒進行處理。

    • SLOT_ACQUIRING:系統已經分配背景工作執行緒資源,唯讀節點正在發送MDL請求。

      說明

      若唯讀節點需要的MDL被其它串連所持有,MDL同步狀態將保持在該狀態。

    • SLOT_LOCKED:唯讀節點上MDL鎖已經擷取並持有。

    • SLOT_RELEASING:唯讀節點已經接收到MDL釋放請求,等待調度系統分配背景工作執行緒進行處理。

  • 您可以使用如下SQL語句,擷取唯讀節點上用於同步MDL請求的背景工作執行緒狀態資訊:

    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_THREAD;
    說明
    • PolarDB叢集版本需為以下版本之一,才有許可權使用上述SQL語句:

      • PolarDB MySQL版8.0.1版本且Revision version為8.0.1.1.24及以上

      • PolarDB MySQL版5.7版本且Revision version為5.7.1.0.20及以上

      • PolarDB MySQL版5.6版本且Revision version為5.6.1.0.33及以上

      • 如果您的叢集版本不能滿足上述版本要求,建議您升級版本

    • 關於如何強制指定在某節點執行某查詢命令,請參見Hint文法

    返回結果如下:

    +-----------+-----------+------------------+-------------------+----------+
    | 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的MDL同步請求時,INNODB_LOG_MDL_THREAD表中將會存在一個對應的背景工作執行緒用於處理該請求(即thr_state值不為free)。該情形說明唯讀節點上很可能存在MDL等待的情況。您可以通過thr_state的值是否為free協助排查是否出現MDL阻塞的問題。