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;
返回結果如下:
+---------+------------+-------------------+----------+-------------------+ | 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;
返回結果如下:
+-----------+-----------+------------------+-------------------+----------+ | 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阻塞的問題。
聯絡我們
若您對DDL操作有任何疑問,請聯絡我們。