PolarDB-X 让“Online DDL”更Online

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介: 为了解决MDL的问题,让DDL能够做到真正的ONLINE,PolarDB-X使用双版本元数据来解决这个问题。

作者:梦实



数据库的用户对数据库都有一个很简单的要求:


“我能不能随时随地做DDL,不要让我守到半夜再搞了。”


为了这个目标,各种各样的数据库采用了不同的方法来优化DDL这件事,MySQL也从5.6开始逐渐支持“Online DDL”。


但问题是,为何已经到了MySQL 8.0的时代,你能看到的各种MySQL最佳实践\开发规范里,依然建议把DDL放在业务低峰期来做呢。PolarDB-X对此作了很多优化,期望让用户做DDL的时候能更任性。


我们得先看一下,MySQL的DDL,为什么不那么“Online”。




MySQL中的MDL(元数据锁


MySQL中有个MDL,它会保证在DDL变更过程中,所有的事务都在使用同一份元数据。


例如,我们对一个表做一个加列的操作,ALTER TABLE t1 ADD COLUMN(c1 int),MDL确保正在运行的事务,要么全部能看到c1列,要么全部看不到c1列。实际上,MDL起到了元数据切换过程中,排空已有事务的效果。在MySQL中,DDL/DML/DQL等操作,都会对元数据加锁。


MDL会带来一些问题,我们看下面的例子:


时间点0:我们在连接1中,对t1表做一个INSERT操作,但是不要提交这个事务

1.png


时间点1:我们在连接2中,对t1表做一个添加索引的DDL操作,这个DDL操作会阻塞住

2.png


时间点2:我们在连接3中,对t1表做一个SELECT操作,会发现,这个只读操作也会阻塞住

3.png


时间点3:提交连接1的事务

4.png


连接2的DDL操作立即返回结果

5.png


连接3的SELECT操作立即返回结果

6.png

image.gif


这个就很奇怪了,一般我们都以为:

  1. 只读操作不会被写操作阻塞,为什么SELECT语句都会阻塞?
  2. MySQL的创建索引操作(特指例子里这个很常见的DDL)不是ONLINE的吗,为什么会阻塞我的业务?


以上现象的原因就在于MDL锁上:

  1. 连接1的INSERT对t1的元数据加了读锁;
  2. 连接2的DDL获取t1的排它锁,连接2会被连接1阻塞,同时锁住后续的所有读请求;
  3. 连接3的SELECT获取t1的读锁,被连接2阻塞住。


从上面的现象看,MDL锁带来了如下的问题:

  1. 如果DDL执行之前有长事务,那会阻塞后续这个表上的所有请求(无论读写),进一步占用MySQL的线程资源,甚至引发雪崩,导致其他表的访问也出现问题;
  2. MySQL虽然有ONLINE DDL,这个ONLINE更多体现在回填数据阶段。DDL依旧只能在业务低峰期来使用,没有达到真正ONLINE(完全不阻塞业务请求)的目的。


这个事是很坑的,我们需要的是真正的ONLINE DDL能力。




元数据的版本


这里要先解释一个概念,什么是一个元数据的版本?


有一个误区是,一个DDL操作(比如上述的加索引的操作),并不是只有“有索引”“没索引”两个版本,而是分成了多个版本。


例如PolarDB-X中的CREATE INDEX操作,整个过程会涉及ABSENT(vn),DELETE_ONLY(vn+1),WRITE_ONLY(vn+2),PUBLISH(vn+3)多次版本切换。


对于MySQL来说,也有类似的概念,即在MySQL中,一次DDL操作可能会需要多次获取MDL的操作,这也加剧了MySQL DDL过程中MDL的争抢。




双版本元数据


为了解决MDL的问题,让DDL能够做到真正的ONLINE,PolarDB-X使用双版本元数据来解决这个问题。


所谓多版本元数据指的是,PolarDB-X集群中,允许最多同时存在两个版本的元数据(vn与vn+1),每个事务使用的元数据版本由其事务开始时候的元数据版本为准。当使用低版本元数据的事务全部结束之后,低版本的元数据会被清理掉。


7.png

8.png



我们在PolarDB-X上重复上面的例子,会得到这样的结果,DDL不会再因为长事务阻塞所有的操作


时间点0:我们在连接1中,对t1表做一个INSERT操作,但是不要提交这个事务。同时我们可以看到,此时看到的t1的版本是v1

9.png


时间点1:我们在连接2中,对t1表做一个添加索引的DDL操作,这个DDL操作会在v1切换到v2过程中被阻塞住,因为它会尝试获取t1:v1的元数据锁

10.png


时间点2:我们在连接3中,对t1表做一个SELECT操作,这个操作会立即返回,不会阻塞。同时我们看到,这个连接看到的t1的版本是v2

11.png


我们在连接1中,查看t1的元数据版本依旧是v1。此时我们就能看出,DDL前后的两个事务,使用了不同版本的元数据

12.png


时间点3:提交连接1的事务

13.png


连接2的DDL操作立即返回结果

14.png


3个连接看到的t1的元数据的版本都变成了v5(思考下,为什么是v5?)

15.png




小结


PolarDB-X相对于MySQL,彻底解决了MDL锁的问题,Online DDL的元数据切换做到了非常平滑的切换,不会因为长事务阻塞元数据切换,进一步造成更大范围的阻塞,是一种比MySQL的Online DDL更Online的实现。


除了更Online,PolarDB-X还为DDL的性能、开销等都做了很多的优化,欢迎持续关注我们的文章。



【相关阅读】

PolarDB-X SQL限流,为您的核心业务保驾护航

通篇干货!纵观 PolarDB-X 并行计算框架

HTAP 数据库“必修课”:PolarDB-X Online Schema Change

PolarDB-X 向量化引擎的类型绑定与代码生成

每次都需要解释大量指令?使用 PolarDB-X 向量化引擎

PolarDB-X 面向 HTAP 的混合执行器

PolarDB-X 面向 HTAP 的 CBO 优化器

如宝马3系和5系:PolarDB-X 与 DRDS 并驾齐驱

PolarDB-X 存储架构之“基于Paxos的最佳生产实践”

PolarDB-X 私有协议:提升集群的性能和稳定性

技术解读 | PolarDB-X 分布式事务的实现

技术解读 | PolarDB-X 强一致分布式事务

PolarDB-X 一致性共识协议 (X-Paxos)

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
目录
相关文章
|
11月前
|
SQL 关系型数据库 分布式数据库
PolarDB在尝试同步DDL任务时出现了问题
PolarDB在尝试同步DDL任务时出现了问题
91 1
|
11月前
|
SQL 关系型数据库 测试技术
PolarDB的Online DDL功能验证实验
本场景带您体验如何在PolarDB-X中进行Online DDL。
975 0
|
19天前
|
SQL 存储 关系型数据库
|
11月前
|
SQL 关系型数据库 测试技术
如何在PolarDB-X中进行Online DDL
《PolarDB-X 动手实践》系列第五期,本场景带您体验如何在PolarDB-X中进行Online DDL。
510 0
|
SQL 关系型数据库 MySQL
深度解析PolarDB DDL锁的优化和演进
DDL是数据库所有SQL操作中最繁重的一种,本文总结介绍了云原生数据库PolarDB中DDL全链路MDL锁治理的经验和进展,持续优化用户的使用体验,为用户打造最佳的云原生数据库。
|
SQL 缓存 Java
开源分布式数据库PolarDB-X源码解读——PolarDB-X源码解读(九):DDL的一生(上)
开源分布式数据库PolarDB-X源码解读——PolarDB-X源码解读(九):DDL的一生(上)
245 0
|
3月前
|
SQL 关系型数据库 测试技术
实践教程之在PolarDB-X中进行Online DDL
PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。
97 0
实践教程之在PolarDB-X中进行Online DDL
|
3月前
|
关系型数据库 分布式数据库 数据库
【PolarDB开源】PolarDB-X源码解读:分布式事务处理机制揭秘
【5月更文挑战第20天】PolarDB-X,PolarDB家族的一员,专注于大规模分布式事务处理,采用2PC协议保证ACID特性。源码解析揭示其通过预提交、一致性快照隔离和乐观锁优化事务性能,以及利用事务日志进行故障恢复。深入理解其事务处理机制对开发者掌握分布式数据库核心技术至关重要。随着开源社区的发展,更多优化方案将涌现,助力构建更强大的分布式数据库系统。
133 6
|
24天前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用问题之如何基于Docker进行PolarDB-X单机模拟部署
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之如何基于Docker进行PolarDB-X单机模拟部署
|
20天前
|
Oracle 关系型数据库 分布式数据库
PolarDB产品使用问题之使用pxd安装PolarDB-X出现报错,该怎么办
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。

相关产品

  • 云原生分布式数据库 PolarDB-X
  • 云原生数据库 PolarDB