并行元数据锁同步

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阻塞的问题。

联系我们

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