dm分库分表ddl“悲观协调”模式介绍丨tidb工具分享

TiDB_PingCAP TiDB_PingCAP     2023-03-03     122

关键词:

背景

TiDB 作为分库分表方案的一个 “终结者”,获得了许多用户的青睐。在切换到 TiDB 之后,用户告别了分库分表查询和运维带来的复杂度。但是在从分库分表方案切换到 TiDB 的过程中,这个复杂度转移到了数据迁移流程里。TiDB DM 工具为用户提供了分库分表合并迁移功能,在数据迁移的过程中,支持将分表 DML 事件合并迁移,并一定程度支持上游分表进行 DDL 变更。

本文以及后续文章主要介绍分库分表合并迁移时,各分表 DDL 变更的协调。DM 的分库分表 DDL 协调可配置为 “悲观协调” 和 “乐观协调” ,本文主要介绍 TiDB DM 分库分表 DDL 协调的 “悲观协调” 模式。后续文章会介绍 “乐观协调” 模式。

分库分表 DDL 的问题(简略版)

本节首先以一个例子粗略介绍分库分表 DDL 对数据迁移的影响,然后就这个问题给出更加正式的定义。

假设在两个上游有两个分表 t1、t2,下游表为 t。

t1 接下来的同步事件是 INSERT (3,3),t2 接下来的同步事件是 DROP COLUMN c2。如果 DROP COLUMN c2 先被同步到下游,在同步到 INSERT (3,3) 时就会因为缺少 c2 列而报错。
因此我们要对 DDL 同步事件进行特殊处理。

分库分表合并迁移的定义

接下来我们尝试使用更正式一点的语言来描述这个问题,从而引出如何正确解决这个问题。

从用户的角度来讲,数据库的用途主要的是查询,在分库分表合并前后,查询的结果应该是相同的(不考虑 LIMIT 等算子以及不确定性查询)。也就是说,各分表查询结果的并集应当等于迁移后的查询结果。容易得到一个满足此要求的充分条件:各分表数据的并集应当等于迁移后的表数据。考虑到同步延迟的影响,也就是当前时刻下游表的数据等于各分表在过去某时刻数据的并集。
对于这个定义而言,数据迁移就是让各分表的同步时刻不断向前推进。如果在同步某事件前,下游表与各分表满足定义,那么我们将一个分表的同步事件以相同影响的方式应用到下游,就将该分表的同步时刻正确地推进了。

分库分表 DDL 的问题(正式版)

从上面的定义来看,DDL 会造成两个方面的问题。

首先是 DDL 可能会变更表结构。参照之前的例子,如果 t1、t2 都有 DROP COLUMN c2 事件,DM 先同步到了 t2 的该事件,而同步事件需要以相同影响的方式应用到下游,我们应该只将下游 t2 对应的数据 DROP COLUMN。显然下游 t1、t2 的数据共享一个表结构,无法完成这个操作。因此 t2 的该事件暂时不能被同步。
另一个问题是,部分 DDL 即使不影响表结构,也会产生对数据产生影响。例如 ALTER TABLE DROP COLUMN c, ADD COLUMN c DEFAULT xx,会将一个分表的 c 列全部修改为 xx。目前 DM 的实现同样无法将这个事件以相同影响的方式应用到下游

解决方法

对于上述 DDL 引入的问题并基于前文对于同步正确性的定义,我们可以得到一个满足要求的充分条件:当某分表出现 DDL 同步事件时,我们将其同步暂停;直到所有分表都出现该 DDL 同步事件时,我们将 DDL 应用到下游并恢复所有分表的同步。此时我们可以保证下游表的 DDL 产生的影响等于所有分表都进行了 DDL(不考虑非确定性 DDL,例如 DDL 新增列默认值为 current_timestamp)。

悲观协调例子

我们仍然以两张表 t1、t2 的合并迁移为例,观察 binlog 同步进度

左图中,当分表 t1 遇到 DDL 时,t2 同步事件还没有到这条 DDL,因此 t1 同步应当被暂停。当进展到右图时,t1、t2 分表都出现了相同的 DDL,因此此时可以将这条 DDL 应用到下游并恢复 t1、t2 的同步。\\

在某些情况下,t1、t2 可能位于一个 binlog 流之中,因此上图中看似独立的流的暂停与恢复,实际实现为在同一个 binlog 流中跳过事件及回滚同步位置。

如上图,我们需要在事件 1、2、4、5、6 之后同步事件 3,因此在 binlog 流中首次遇到事件 3 时跳过,并在事件 6 完成之后重新从事件 3 开始同步,并跳过已经同步的 4、5、6 事件。

悲观协调模式限制

可以看到这种协调模式解决方法有如下的限制:

  • 出现 DDL 同步事件时分表会暂停,会导致同步延迟增加。这可能会导致恢复同步时,上游 binlog 已经被清理
  • 不支持只变更部分分表以进行灰度测试时的场景。灰度期间其余分表的同步会暂停。此外如果灰度测试结果是回滚时,无法恢复同步
  • 要求所有分表以相同的顺序出现 DDL 同步事件
  1. 如果分表由于误操作而进入 DDL 不一致的状态,修复操作较为复杂
  2. 对于 DM 的使用者而言,可能无法控制上游 DDL 的发起从而无法满足条件\\

因为悲观协调模式的种种限制,DM 也提供了新的乐观协调模式,我们将在后续的文章中具体介绍,希望大家能够在深入了解两种协调模式的原理和使用限制后,根据场景选择合适的模式进行分库分表的合并迁移。

dm中relaylog性能优化实践丨tidb工具分享(代码片段)

将转换后的binlogevent使用binlogwriter以relaylogfile的形式存储在本地的relaydirectory中。的机制,读取最近写入的文件并非通过磁盘,而是读取OS内存中的缓存,因此理论上影响有限。的存在,应用本身再增加一层缓存对latency的影响有... 查看详情

shardingsphere实践——shardingsphere介绍

目录一、分库分表1.为什么需要分库分表(1)突破性能瓶颈(2)提高可用性2.什么时候考虑分库分表3.如何分库分表(1)水平拆分与垂直拆分(2)水平分库分表策略(3)分成多少库多少表&#... 查看详情

干货丨数据库分库分表基础和实践

数据库架构的演变在业务数据量比较少的时代,我们使用单机数据库就能满足业务使用,随着业务请求量越来越多,数据库中的数据量快速增加,这时单机数据库已经不能满足业务的性能要求,数据库主从复制架构随之应运而生... 查看详情

分库分表vsnewsql数据库

参考技术A最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好... 查看详情

tidb4业界使用情况

...据库扩展的问题。对于MySQL来讲,最直接的方案就是采用分库分表的水平扩展方式 查看详情

分库分表

分库分表在谈论数据库架构和数据库优化的时候,我们经常会听到“分库分表”、“分片”、“Sharding”…这样的关键词。让人感到高兴的是,这些朋友所服务的公司业务量正在(或者即将面临)高速增长,技术方面也面临着一... 查看详情

分库分表之后的搜索策略

所谓分库,就是把原来在一个库中的数据放到多个库中存储;分表就是把原来在一个表中的数据放到多个表中存储。这里不讨论分库分表的策略和具体实现,主要想记录的一点,就是分库分表后的搜索如何实现?工作中遇到的是... 查看详情

购物商城订单分库分表应该如何设计

目录1、为什么有分库分表2、分库分表模式分类2.1垂直分库2.2垂直分表2.3水平分库 查看详情

sharding-jdbc结合mybatis实现分库分表功能

...很大的情况下如何保证性能。今天我就给大家介绍数据库分库分表的优化,本文介绍mybatis结合当当网的sharding-jdbc分库分表技术(原理这里不做介绍)  首先在pom文件中引入需 查看详情

sharding-jdbc实现分库分表(代码片段)

前言:本篇文章主要介绍一下如何使用ShardingJDBC做分库分表。什么是分库分表比较传统的小型应用通常是一个项目使用一个数据库进行数据存储,这样的架构模式在数据量日益增长的情况下,数据库势必会成为性能瓶... 查看详情

水平分库分表的关键步骤和技术难点

在之前的文章中,我介绍了分库分表的几种表现形式和玩法,也重点介绍了垂直分库所带来的问题和解决方法。本篇中,我们将继续聊聊水平分库分表的一些技巧。分片技术的由来关系型数据库本身比较容易成为系统性能瓶颈,... 查看详情

分库分表shardingsphere

文章目录一、ShardingSphere二、ShardingJDBC实战1、核心概念2、测试项目介绍3、快速实战4、ShardingJDBC的分片算法NoneShardingStrategyInlineShardingStrategyStandardShardingStrategyComplexShardingStrategyHintShardingStrategy5、ShardingSphere 查看详情

分库分表理论概述

1.什么是分库分表一个库一个表拆分为N个库N个表分为垂直拆分,水平拆分2.为什么要分库分表随着业务发展,表的数量,以及单表数据量越来越大,而由于无法分布式部署(部分数据库支持),单台服务器资源(cpu内存,IO)的限制,... 查看详情

大众点评订单系统分库分表实践

转载至:http://tech.meituan.com/dianping_order_db_sharding.html背景原大众点评的订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到... 查看详情

水平分库分表的关键问题及解决思路

在之前的文章中,我介绍了分库分表的几种表现形式和玩法,也重点介绍了垂直分库所带来的问题和解决方法。本篇中,我们将继续聊聊水平分库分表的一些技巧。分片技术的由来关系型数据库本身比较容易成为系统性能瓶颈,... 查看详情

mysql_分库分表

分库分表数据切分  通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。数据的切分同时还能够提高系统的总体可用性,由于单台设备Crash之后,... 查看详情

tidb的数据迁移工具现已开源

...遵循Apache-2.0开源协议,允许用户自由地使用及修改。据介绍,DM(DataMigration)是一体化数据同步任务管理平台,支持从MySQL/MariaDB到TiDB的数据迁移、全量备份和MariaDB/MySQLbinlog增量同步,有助于减少操作成本和简化错误处理流程。架... 查看详情

分库分表shardingsphere(代码片段)

文章目录一、ShardingSphere二、ShardingJDBC实战1、核心概念2、测试项目介绍3、快速实战4、ShardingJDBC的分片算法NoneShardingStrategyInlineShardingStrategyStandardShardingStrategyComplexShardingStrategyHintShardingStrategy5、ShardingSphere 查看详情