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操作有任何疑问,可通过钉钉搜索群号入群咨询。您可以直接@群内专家,并附上您要咨询的问题;同时群内也有PolarDB MySQL版小助手24*7小时在线回答您的问题。钉钉群号:15375044501。