暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB ·引擎特性· DDL中MDL锁的优化和演进(二)

Z 2023-06-24
207

2. Non-Block DDL (雪崩问题)

2.1 功能概述

如前文所述,非阻塞DDL(用户文档月报链接)用于解决因MDL锁堵塞而导致的业务雪崩问题。非阻塞DDL功能采用了和第三方插件(gh-ost、pt-osc)类似的拿锁逻辑:当DDL操作获取MDL锁失败时,拿锁线程会进入短暂的Sleep阶段,接着重新尝试获取MDL锁。通过此种方式,非阻塞DDL保证了DDL执行过程中,业务真正的online。非阻塞DDL目前已经灰度一段时间,受到大量用户的欢迎,后面会尝试默认开启此功能。此外,我们将在8.0.2的2.2.15版本中,支持集群维度的Non-Block DDL:如果主节点已经获取MDL锁,但是只读节点同步MDL锁堵塞(当前默认堵塞时间为50s,由参数loose_replica_lock_wait_timeout控制),Non-Block DDL会在集群维度重试拿锁的操作,从而实现集群维度的非阻塞DDL。

2.2 测试效果

可以通过设置参数loose_polar_nonblock_ddl_mode为ON来打开非阻塞DDL功能(用户文档),下面给出使用sysbench模拟用户业务,对比开启Non-Block DDL功能和使用原生DDL功能对业务的影响。

  1. 在目标表sbtest1上开启一个事务但不提交,该事务将持有目标表sbtest1的MDL锁。
begin;
select * from sbtest1;
  1. 在新会话中,分别在开启和关闭Non-Block DDL情况下,对表sbtest1进行加列操作,观察TPS的变化情况。
# 由于当前session 1大查询持有MDL锁,当前DDL无法获取MDL锁,被堵塞
alter table sbtest1 add column d int;
  • 关闭Non-Block DDL功能

TPS持续跌零,默认超时时间为31536000,严重影响用户业务。


  • 开启Non-Block DDL功能

TPS周期性下降,但未跌零。对用户业务影响较小,能保证业务系统的稳定。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论