MySQL · 社区动态 · Online DDL 工具 gh-ost 支持阿里云 RDS

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 背景Online DDL 一直都是 DBA 运维时比较头疼的事,一般都会选择在业务低峰期谨慎的操作,比较常用的几个工具比如 percona pt-online-schema-change , Facebook OSC, 本质上它们都是基于触发器的,简单来讲就是通过数据库的触发器把作用在源表的操作在一个事务内同步到修改后的表中,这在业务高峰期时会极大的加重主库的负载。

背景

Online DDL 一直都是 DBA 运维时比较头疼的事,一般都会选择在业务低峰期谨慎的操作,比较常用的几个工具比如 percona pt-online-schema-change , Facebook OSC, 本质上它们都是基于触发器的,简单来讲就是通过数据库的触发器把作用在源表的操作在一个事务内同步到修改后的表中,这在业务高峰期时会极大的加重主库的负载。gh-ost 是由 Github 开发的 Online DDL 工具,使用 binlog 代替触发器来做增量数据同步,这样可以降低主库的负载,异步的执行。为了表彰 Github 在 gh-ost 上的贡献,MySQL 社区把 2017 年的社区贡献奖颁发给了 Github(值得一提的是 2018 年的 MySQl 社区贡献奖颁发给了阿里云数据库团队)。前段时间有用户反映无法在阿里云 RDS 上使用 gh-ost,经过排查和沟通解决方案,最终官方接受了我们提交的代码,增加 --aliyun-rds 参数,用户下载最新的主干代码就可以使用。

gh-ost

基于触发器的 Online DDL 工具

介绍 gh-ost 之前,先来简单了解一下在这之前基于触发器的工具原理。考虑一下 Online DDL 实际上可以粗糙的分成几步:

  1. 根据原来的表结构执行 alter 语句,新建一个更新表结构之后的表,通常称为幽灵表。对用户不可见。
  2. 把原来表的已有数据 copy 到幽灵表。
  3. 在 copy 的过程中,会有新的数据过来,这些数据要同步到幽灵表,也就是 “Online” 的精髓。
  4. copy 和同步完成后,锁住源表,交换表名,幽灵表替换源表。
  5. 删除源表(可选),完成 online DDL。

这其中比较重要的第三步,如何同步增量的数据。最开始办法就是使用触发器,在源表上增加几个触发器,例如当源表执行 INSERT,UPDATE,DELETE 语句,就把这些操作通过触发器同步到幽灵表上,这样在幽灵表上执行的语句和源表的语句就属于同一个事务,显然这样会影响主库的性能。

后面出现了异步的模式,使用触发器把对源表的操作保存到一个 Changelog 表中,不真正的去执行,专门有一个后台的线程从 Changelog 表读取数据应用到幽灵表上。这种方式一定程度上缓解了主库的压力,但是保存到 Changelog 表也同样是属于同一个事务中,对性能也有不小的影响。

gh-ost 的文档 中细数了触发器的不足之处,大致有以下几点:

  • Triggers, overhead: 触发器是用存储过程的实现的,就无法避免存储过程本身需要的开销。
  • Triggers, locks: 增大了同一个事务的执行步骤,更多的锁争抢。
  • Trigger based migration, no pause: 整个过程无法暂停,假如发现影响主库性能,停止 Online DDL,那么下次就需要从头来过。
  • Triggers, multiple migrations: 他们认为多个并行的操作是不安全的。
  • Trigger based migration, no reliable production test: 无法在生产环境做测试。
  • Trigger based migration, bound to server: 触发器和源操作还是在同一个事务空间。

Triggerless

从上面的描述可以看出,触发器的作用是源表和幽灵表之间的增量数据同步,gh-ost 放弃了触发器,使用 binlog 来同步。gh-ost 作为一个伪装的备库,可以从主库/备库上拉取 binlog,过滤之后重新应用到主库上去,相当于主库上的增量操作通过 binlog 又应用回主库本身,不过是应用在幽灵表上。引用一下官网的图:

gh-ost-general-flow.png

gh-ost 首先连接到主库上,根据 alter 语句创建幽灵表,然后作为一个”备库“连接到其中一个真正的备库上,一边在主库上拷贝已有的数据到幽灵表,一边从备库上拉取增量数据的 binlog,然后不断的把 binlog 应用回主库。图中 cut-over 是最后一步,锁住主库的源表,等待 binlog 应用完毕,然后替换 gh-ost 表为源表。gh-ost 在执行中,会在原本的 binlog event 里面增加以下 hint 和心跳包,用来控制整个流程的进度,检测状态等。这种架构带来诸多好处,例如:

  • 整个流程异步执行,对于源表的增量数据操作没有额外的开销,高峰期变更业务对性能影响小。
  • 降低写压力,触发器操作都在一个事务内,gh-ost 应用 binlog 是另外一个连接在做。
  • 可停止,binlog 有位点记录,如果变更过程发现主库性能受影响,可以立刻停止拉binlog,停止应用 binlog,稳定之后继续应用。
  • 可测试,gh-ost 提供了测试功能,可以连接到一个备库上直接做 Online DDL,在备库上观察变更结果是否正确,再对主库操作,心里更有底。
  • 并行操作,对于 gh-ost 来说就是多个对主库的连接。

需求和限制

官方文档 对于需求和限制解释的比较全面了,这里主要根据云数据库场景简单介绍下。

  • 用户没有 Super 权限,因此使用过程中要加上 –assume-rbr, gh-ost 会认为 binlog 本身就是 row 模式,不会再去修改。阿里云 RDS 上的 binlog 默认也是 row 模式,所以不存在问题。
  • 其它权限,主要是 REPLICATION SLAVE,REPLICATION CLIENT 可以拉取 binlog ,也可以获得。
  • 无法连接到备库拉取 binlog。备库通常对用户来说是透明的,所以 gh-ost 需要直接连接到主库上去,这可能会增大对主库的负载。使用的时候需要增加 –allow-on-master, –assume-master-host。官方推荐的方式也是连接到其中一个备库,因为会有一些压力较大的 SELECT 操作,放在备库是最好的。几种连接模式如下图所示:

gh-ost-operation-modes.png

aliyun-rds 参数

当有用户反馈无法在阿里云 RDS 上使用 gh-ost 的时候,我们着手进行了排查,发现在 Github 上已经有热心的用户 dikang123, exherbissue #470 中进行了讨论,原因是在校验阶段隐藏了两个参数,@@port 和 @@hostname,导致 gh-ost 获得了非法的字符。隐藏的原因是系统架构和安全的考虑,避免用户的端口和主机被恶意攻击。返回非法字符也是出于用户体验,例如 port 本应该是整型,如果返回 0,那么可能会有用户认为自己的数据库端口是 0,但是返回 ‘NULL’,用户就可以接收到明确的隐藏信号。

我们随后向官方提交了 Pull Request 从工具本身解决,经过多次交流和代码 review,决定增加一个参数 –aliyun-rds,这样就可以绕开非法字符的校验。具体的过程可以看下 Pull Request 541

目前用户使用的话,记得加上以下几个参数:

  • –allow-on-master
  • –assume-rbr
  • –assume-master-host
  • –aliyun-rds

总结

gh-ost 在 Online DDL 上确实做出了很大的创新,是一款优秀的工具,并且在很多地方的都有巧妙的设计,例如最后一步 cut-over, cut-over-example,本文并未详细描述。对于在云数据库上的使用,还有一些额外的限制,未来根据用户的需求,可以和数据库层面做更多的融合。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
招募!阿里云x魔搭社区发起Create@AI创客松邀你探索下一代多维智能体应用
招募!阿里云x魔搭社区发起Create@AI创客松邀你探索下一代多维智能体应用
250 0
|
13天前
|
存储 Java 关系型数据库
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
22 1
|
26天前
|
存储 关系型数据库 MySQL
RDS MySQL 数据库运维简述
从运维的视角,汇总云数据库RDS MySQL使用的避坑指南。文章初版,维护更新,欢迎指点。
730 3
|
2月前
|
运维 安全 关系型数据库
参加数据库管理工具DAS训练营,赢取国潮保温杯和阿里云定制双肩包!
本训练营带您简单了解数据库自治与云安全服务,数据库自治服务提供云上RDS、PolarDB、NoSQL、ADB等数据库7*24小时异常检测、SQL自优化、安全合规审计、弹性伸缩、数据自治、锁分析等亮点功能。一站式自动化、数字化DAS集成平台,助力您畅享DBA运维智能化。
|
2月前
|
存储 容灾 安全
在阿里云RDS(Relational Database Service)迁移前准备目标区域选择
在阿里云RDS(Relational Database Service)迁移前准备目标区域选择
23 3
|
2月前
|
监控 NoSQL 关系型数据库
在进行RDS(例如阿里云的RDS)数据迁移后,评估数据一致性
在进行RDS(例如阿里云的RDS)数据迁移后,评估数据一致性
124 3
|
2月前
|
监控 安全 关系型数据库
在规划阿里云RDS跨区迁移资源和服务可用性
在规划阿里云RDS跨区迁移资源和服务可用性
257 4
|
1月前
|
SQL 存储 关系型数据库
【MySQL 数据库】1、MySQL 的 DDL、DML、DQL 语句
【MySQL 数据库】1、MySQL 的 DDL、DML、DQL 语句
48 0
|
17天前
|
存储 关系型数据库 数据库
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
迎峰而上:汇联易依托阿里云RDS通用云盘,加速业务智能化升级
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
|
24天前
|
关系型数据库 MySQL Serverless
RDS MySQL Serverless
阿里云新推出RDS MySQL Serverless,提供实时弹性资源,按需设置范围,自动适应负载变化,实现资源优化与成本降低。用户可通过控制台或API轻松创建实例,无缝应对低负载至高负载场景,实现自动弹性扩缩容。该服务适合各种云数据库应用场景,兼具成本优化和高灵活性。【2月更文挑战第29天】
30 1

相关产品

  • 云数据库 RDS MySQL 版