网易首页 > 网易号 > 正文 申请入驻

DM 分库分表 DDL “乐观协调” 模式介绍丨TiDB 工具分享

0
分享至

前言

DM 支持在线执行分库分表的 DDL 语句(通称 Sharding DDL),先前的文章中,我们介绍了悲观模式,即当上游一个分表执行某一 DDL 后,这个分表的迁移会暂停,等待其他所有分表都执行了同样的 DDL 才在下游执行该 DDL 并继续数据迁移。

悲观协调模式的优点是可以保证迁移到下游的数据不会出错,并且能兼容大部分的 DDL 语句,缺点是会暂停数据迁移而不利于对上游进行灰度变更、并显著地增加增量数据复制的延迟。有些客户可能会花数个月在单一分片执行 DDL,满意后才会更改其他分片的结构。在悲观同步的设定下,用来测试的分片的 DML 事件会大量积压,在恢复同步后无法正常运作。与此同时,悲观模式还要求所有分片必须以相同的顺序执行 DDL,否则会导致任务报错暂停。

为此,DM 提供新的乐观协调模式,在一个分表上执行的 DDL,自动修改成兼容其他分表的 DDL 语句后立即应用到下游,不会阻挡任何分表执行的 DML 的迁移。乐观协调模式适用于上游灰度更新、发布的场景,或者是对上游数据库表结构变更过程中同步延迟比较敏感的场景。

悲观协调和乐观协调的对比

原理

DM worker 的所有 DML 会直接同步到下游(出错时例外)。

DM worker 内嵌了一个小型 TiDB(通称 schema tracker),用来记录各个上游分表的表结构,当接收到来自上游的 DDL 后,会根据 schema tracker 里 DDL 的执行结果,把更新后的表结构转送给 DM master。DM master 将收到的不同分片的表结构合并成可兼容所有分片的 DML 的合成结构,即不同分片表结构的并集(此过程类似于 SQL 语句中的 JOIN 语句),然后根据合成的表结构和 DM worker 发来的表结构的不同处得到对应的 DDL 语句(即合成的表结构与原表结构的差集),同步到下游。

(具体的设计可以参考 DM:Manage DDLs on Sharded Tables by Maximizing Schema Compatibility.)

规则

乐观 DDL 表结构合并的规则简单来说就是对列属性定义了一个偏序关系,对不同表的同一列进行排序,选择该偏序关系中的极大元。对于不可比较的列,则返回错误:

  • null < not null
  • no default < default(x)
  • varchar(x) < varchar(y), where x< y
  • utf8 < utf8mb4
  • char < varchar
  • tinyint < smallint < mediumint < bigint

对于被不存在或者被删除的列,我们把它定为最小的列

如初始时表结构是相同的。

tbl2 添加第三列。前两列相同;tbl1 的第三列为空,所以保留 tbl2 的第三列。

tbl2 删除第一列。第二列相同;tbl2 的第一列为空,所以保留 tbl1 的第一列。tbl1 的第三列为空,所以保留 tbl2 的第三列

tbl1 将第二列改为 varchar(10),由于 varchar(5) < varchar(10),所以保留 tbl1 的第二列

tbl1 重命名第二列。现在 tbl1 和 tbl2 的第二列名字不一样,无法比较,DM 无法确定最终的表结构,所以任务会报错

例子

三个分片合并同步到 TiDB:

① 在上游增加一列 Level。

alter table tbl00 add column Level int unsigned not null;

tbl00, tbl01, tbl02 的并集 tblMerge 是 {ID,NAME,Level}

tblMerge 和 tbl 的差集是 {Level},所以 DDL 是 add column Level

此时下游 TiDB 要准备接受来自 tbl00 有 Level 的 DML、以及来自 tbl01 和 tbl02 没有 Level 的 DML,所以同步到下游时,自动改写成指定默认值的形式。

alter table tbl add column Level int unsigned not null default 0;

这时候各种 DML 毋需修改都可以同步到下游。

update tbl00 set Level = 9 where ID= 1;

insert into tbl02 (ID,Name) values (27, 'Tony');

② 在 tbl01 同样增加一列 Level。

alter table tbl01 add column Level int unsigned not null;

tbl00, tbl01, tbl02 的并集 tblMerge 是 {ID,NAME,Level}

tblMerge 和 tbl 的差集是 {},所以 DDL 为空

此时下游已经有相同的 Level 列了,所以 DM master 比较之后不做任何动作。

③ 在 tbl01 刪除一列 Name。

alter table tbl01 drop column Name;

tbl00, tbl01, tbl02 的并集 tblMerge 是 {ID,NAME,Level}

tblMerge 和 tbl 的差集是 {Level},所以 DDL 为空

此时下游仍需要接收来自 tbl00 和 tbl02 含 Name 的 DMLs,故不立删之,而是为这列也补上一个默认值。

alter table tbl alter column Name set default “”;

同样,各种 DML 仍可直接同步到下游。

insert into tbl01 (ID,Level) values (15, 7);
update tbl00 set Level= 5 where ID = 5;

④ 在 tbl02 增加一列 Level。

tbl00, tbl01, tbl02 的并集 tblMerge 是 {ID,NAME,Level}

tblMerge 和 tbl 的差集是 {Level},所以 DDL 为空

alter table tbl02 add column Level int unsigned not null;

此时所有分片都已有 Level 列,所以可以把作为兼容的默认值去掉。

alter table tbl alter column Level drop default;

⑤⑥ 在 tbl00 和 tbl02 各刪除一列 Name。

alter table tbl00 drop column Name;

alter table tbl02 drop column Name;

tbl00, tbl01, tbl02 的并集 tblMerge 是 {ID,Level}

tblMerge 和 tbl 的差集是 -{Name},此差集是有符号的,所以 DDL 是 drop column Name

到此步 Name 列也从所有分片消失了,所以可以安全从下游移除。

alter table tbl drop column Name;

限制

使用 “乐观协调” 模式有一定的风险,需要严格遵照以下方针:

  • 执行每个批次的 DDL 前和后,要确保每个分表的结构达成一致。
  • 进行灰度 DDL 时,最好只集中在一个分表上测试。
  • 灰度完成后,在其他分表上尽量以最简单直接的 DDL 迁移到最终的 schema,而不要重新执行灰度测试中对或错的每一步。
  • 例如:在分表执行过 ADD COLUMN A INT; DROP COLUMN A; ADD COLUMN A FLOAT;,在其他分表直接执行 ADD COLUMN A FLOAT 即可,不需要三条 DDL 都执行一遍。
  • 执行 DDL 时要注意观察 DM 迁移状态。当迁移报错时,需要判断这个批次的 DDL 是否会造成数据不一致。

更详细的介绍可参考官网文档。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
从“汤臣一品”保安工资水平看上海小区保安工资到底有多少?

从“汤臣一品”保安工资水平看上海小区保安工资到底有多少?

科学发掘
2024-11-19 07:35:03
美国一旦取消中国永久贸易国地位,美国最后的一张牌也打出来了!

美国一旦取消中国永久贸易国地位,美国最后的一张牌也打出来了!

星辰故事屋
2024-11-15 20:52:16
王晓龙再发文回应董路:想搞清您账目多少用于帮助小将困难家庭

王晓龙再发文回应董路:想搞清您账目多少用于帮助小将困难家庭

直播吧
2024-11-19 08:27:11
薅羊毛引民愤,苏州马拉松两选手被曝白拿大量补给负重跑步

薅羊毛引民愤,苏州马拉松两选手被曝白拿大量补给负重跑步

懂球帝
2024-11-19 11:18:14
一汽奥迪尾标变成奥迪一汽!外方话语权变重!

一汽奥迪尾标变成奥迪一汽!外方话语权变重!

沙雕小琳琳
2024-11-18 17:37:11
人到中年才彻底明白:世界上最好的父母,是在家里守好这三个温度

人到中年才彻底明白:世界上最好的父母,是在家里守好这三个温度

新东方家庭教育
2024-11-18 09:56:40
家有青春期孩子:闭嘴是标配,陪伴是高配,那么顶配是什么?

家有青春期孩子:闭嘴是标配,陪伴是高配,那么顶配是什么?

诗词中国
2024-11-16 15:07:15
中国发动机获重大突破,造出世界一流柴油机,欧美各国大吃一惊

中国发动机获重大突破,造出世界一流柴油机,欧美各国大吃一惊

常高俊April工作室
2024-11-17 14:54:12
库尔斯克地区出现了俄罗斯的“技术奇迹”:所有东西都被取代了

库尔斯克地区出现了俄罗斯的“技术奇迹”:所有东西都被取代了

亡海中的彼岸花
2024-08-25 00:05:11
降温才发现:今年不兴皮草、冲锋衣了!满街都在穿这3种“冬装”

降温才发现:今年不兴皮草、冲锋衣了!满街都在穿这3种“冬装”

时尚穿搭生活馆
2024-11-15 21:57:45
实话实说,王欣瑜,是现在网球界的颜值担当,五官精致漂亮!

实话实说,王欣瑜,是现在网球界的颜值担当,五官精致漂亮!

人情皆文史
2024-10-14 00:00:46
你最冲动的一次消费是多少钱?现在后悔了吗?有时候就是头脑发热

你最冲动的一次消费是多少钱?现在后悔了吗?有时候就是头脑发热

美好客栈大掌柜
2024-10-28 08:24:02
加沙地带近百辆运粮车遭持枪抢劫,20多名帮派成员被击毙 以方发言人否认与劫匪有关联

加沙地带近百辆运粮车遭持枪抢劫,20多名帮派成员被击毙 以方发言人否认与劫匪有关联

红星新闻
2024-11-19 12:45:09
刘秀梅:中共甘肃省纪律检查委员会原常委

刘秀梅:中共甘肃省纪律检查委员会原常委

美食阿鳕
2024-11-19 10:21:09
福建舰出海,第五次海试弹射歼15T和空警600

福建舰出海,第五次海试弹射歼15T和空警600

三叔的装备空间
2024-11-18 15:33:11
三个迹象表明,2025年房价可能超乎想象,买房的老百姓捂好钱袋子

三个迹象表明,2025年房价可能超乎想象,买房的老百姓捂好钱袋子

巢客HOME
2024-11-19 09:10:02
丁伟志同志逝世

丁伟志同志逝世

上观新闻
2024-11-13 18:08:08
准婆婆仗着儿子是研究生,要女方提供婚房,准儿媳笑了:我是博士

准婆婆仗着儿子是研究生,要女方提供婚房,准儿媳笑了:我是博士

莎莉说情感
2024-11-18 16:55:03
刚刚“满足”完,为何女生还想要第二次?揭秘女性3大秘密

刚刚“满足”完,为何女生还想要第二次?揭秘女性3大秘密

番茄健康
2024-11-12 17:36:11
“囚服都是收腰的?”热播剧女主造型引争议,最新回应

“囚服都是收腰的?”热播剧女主造型引争议,最新回应

极目新闻
2024-11-16 12:07:34
2024-11-19 13:28:49
PingCAP
PingCAP
分布式数据库TiDB背后团队
511文章数 624关注度
往期回顾 全部

科技要闻

小米汽车单季收入近百亿 回应亏损与产能

头条要闻

牛弹琴:德国女外长又在污蔑中国 曾称对华"不再天真"

头条要闻

牛弹琴:德国女外长又在污蔑中国 曾称对华"不再天真"

体育要闻

15胜0负的骑士,真的在模仿勇士

娱乐要闻

没做错事的黄晓明为什么公开道歉

财经要闻

年底可能会“突击花钱”近1万亿

汽车要闻

后排够大 智能化提升 全新探岳L是你的菜么?

态度原创

手机
家居
亲子
旅游
数码

手机要闻

HMD Icon Flip 1 翻盖功能手机曝光:1500mAh 可拆卸电池

家居要闻

纯白极简 现代简约

亲子要闻

每一笔都是超绝透视!

旅游要闻

今冬新疆独库公路库车段“不打烊”,免门票!

数码要闻

余承东预热新手表:时隔三年 新一代华为血压表来了

无障碍浏览 进入关怀版