支持全量&增量迁移!YashanDB增量迁移实现原理解读

简介: 本文基于YashanDB高可用架构师马志宏在“2024年国产数据库创新生态大会”的演讲,深入阐述了YashanDB的数据迁移流程及增量迁移组件的技术原理。崖山迁移平台YMP提供异构RDBMS与YashanDB间的迁移评估、数据迁移和校验功能。最新版本V23.3新增增量迁移组件,支持在线全量和增量迁移的无缝衔接,确保业务无感知迁移,保障数据一致性和业务连续性。迁移组件由source、transform、sink三个模块组成,具备一键式迁移、支持多种数据类型和DDL操作、无侵入式部署等关键能力,确保高效、可靠的迁移体验。未来将优化兼容性、支持双向复制和提升数据质量管理。

本文基于YashanDB高可用架构师-马志宏2024年11月在“2024年国产数据库创新生态大会”-“根”技术专场的演讲整理形成,本文将深入阐述YashanDB数据迁移流程,以及YashanDB增量迁移组件的实现技术原理。

简介
崖山迁移平台YMP是YashanDB提供的数据库迁移产品,提供异构RDBMS与YashanDB之间进行迁移评估、数据迁移、数据校验的能力。
在最新发布的V23.3版本中,YMP新增增量迁移组件(以下简称“迁移组件”),具备异构数据库的在线全量迁移和增量迁移能力,且支持两者间的无缝衔接,真正实现业务无感知迁移,保障数据一致性及业务连续性。
图片18.png

迁移组件架构上由source,transform,sink三个模块组成。其中source模块负责从源端获取数据,transform模块负责数据转换,sink模块负责目标端数据导入。其具备以下关键能力:
支持一键式迁移,自动完成全量迁移到增量迁移的无缝衔接,无需用户介入。
支持所有的常见数据类型,如CLOB和BLOB类型等。
支持常用DDL操作,如建表、删表、增删列、rename table、增删主键等。
支持无侵入式部署,不占用源端/目标端服务器资源。
完整的数据迁移过程包括元数据迁移、全量迁移及增量迁移三个阶段,接下来将会介绍每个迁移阶段的关键能力。

元数据迁移能力
迁移组件在元数据迁移阶段具备以下几方面能力:
灵活配置需要迁移的对象。迁移组件可以指定某几个schema或table,或者同时指定schema和table,还可以配置table级黑名单,过滤掉不需要的表。
提供对象名映射能力。如果源端数据库和目标端数据库的schema名或者表名不一样,迁移组件可以只映射整个schema,也可以对某几个表名做映射。在增量阶段,对增量DDL也做了对象名映射的适配,包括rename table的DDL。
并行批量查询,加速元数据构建。迁移组件对元数据构建作了并行优化,通过多线程以及多表批量查询的方法,加速目标端元数据构建,节省迁移时间。
多种冲突策略,自动处理元数据冲突。当目标端数据库存在与源端数据库相同的表名,这个表可能是原来就存在的,并且表中含有存量数据。针对此类情况,迁移组件提供多种冲突处理策略。当遇到相同名称的表时,可以truncate快速删除表中所有数据,也可以保留现有数据,或者报错等待用户介入。

高性能全量迁移
全量迁移阶段,迁移组件对性能进行深度优化。
首先是多线程并行,按表并发,把每张表分配给一个线程去迁移。源端会启动多个线程进行查询,目标端也是多线程进行批量插入。每对线程之间有独立的缓冲队列,互不影响。
图片19.png

其次对大表进行拆分,均匀拆分成多个子表,分配给多个线程,进一步提高并发度。迁移组件采用rowid拆表算法,拆分耗时短,可以支持无主键表的拆分。
经过上述优化,全量迁移的性能可达到200M/s,满足主流场景的性能要求。

无缝衔接全量至增量迁移
全量迁移结束后,将进入增量迁移。在此阶段需考虑全量迁移和增量迁移之前的无缝衔接。基本要求如下:
业务连续性。业务不中断,尽量不影响业务运行。
数据一致性。增量数据不能重复,也不能遗留,即所谓的无缝衔接。
支持无主键表的无缝衔接。
图片20.png

迁移组件基于闪回查询实现全量迁移至增量迁移的无缝衔接。具体实施细节如下:
1.在全量迁移阶段,采用闪回查询确保全量数据处于一致性状态;
2.通过增量数据解析,从最老活跃事务对应的Redo开始,保证活跃的事务不被遗漏;
3.在增量迁移过程中,过滤闪回查询SCN之前的事务,该事务在闪回查询时已经包含,增量迁移只输出闪回查询SCN之后的增量事务,保证数据不重复。

增量迁移环节主要分为两部分,一个是从源端获取数据,另一个是在目标端入库。

增量迁移:源端获数
迁移组件通过逻辑日志解析接口YStream获取源端增量数据。
YStream工作原理
YStream是 YashanDB数据库提供的一个日志解析服务,客户端可以通过YStream获取数据库逻辑日志,用于数据同步。YStream具备高性能、高可靠性、易使用等特点,主备部署环境下可以将其部署在备库,以减少主库压力。
迁移组件就是通过YStream获取增量逻辑日志,然后组装成SQL语法发送到目标库执行。

图片21.png

YStream性能优化
Redo日志的读取性能以及日志解析性能是影响逻辑日志获取性能的重要因素,YStream对此进行了深度优化。
图片22.png

1.Redo IO优化
YStream会优先从Redo buffer读取日志。一方面从buffer读取的速度很快,延迟很低;另一方面读Redo buffer不产生读IO,可以减少数据库压力。
正常情况下,数据库产生Redo的速度和YStream解析的速度一样,所以全部从Redo buffer读取,完全不产生IO。如果目标端背压高,导致YStream解析阻塞后,可能会从Redo文件读取。但当下次YStream解析追平Redo产生速度后,又会接着从buffer读取。
2.并行解析
单个解析线程的性能无法满足并发业务产生的数据库Redo解析要求,因此YStream将Redo日志进行哈希分组,然后分配给多个线程进行独立解析。解析完毕后,再按照原始顺序进行聚合,生成原始逻辑日志进行事务组装和发送。
YStream一致性事务发送
YStream在发送逻辑日志时,是以事务为单位发送的,且严格按照事务的顺序发送,用户无需关心回滚事务。当一个事务的所有逻辑发送完后,才会发送下一个事务,并且仅发送已提交的事务。
每条逻辑日志都有单调递增的position,使得客户端能够精确定位至特定的逻辑日志。在断点续传的时候,通过给服务端发送最后一次成功接收的position,可以让YStream从这个点开始发送后续数据,确保数据传输不会重复也不会遗漏。因为每条DML均有独立的position,YStream可以实现在事务中间的断点续传功能。
YStream DDL逻辑日志附带信息
增量迁移过程中,增量DDL通常是一个难点,一方面是DDL语法较多,不同数据库之间不一定兼容,另一方面是从DDL原始语句里无法获取足够的信息。一般的CDC组件,对于DDL逻辑日志的只会输出DDL原始语句,不会有更多元数据信息。
图片23.png

YStream在解析增量DDL语句的时候,除了输出原始SQL语句,还会输出DDL类型以及表结构信息。包括表里有多少列,这次DDL涉及哪些列等。这样不需要解析SQL语句,直接从附带信息就知道表结构。
另外会附带主键等SQL语句无法获取的信息。比如上图中的建表语句,这条DDL没有指定主键约束名,执行时会自动生成一个约束名,这个约束名在DDL语句里看不到,但是YStream的逻辑日志会附带。
如果在目标端建表的时候执行原始DDL语句,那么会自动生成一个随机约束名,和源端约束名不一致。后面遇到一个指定约束名的DDL,目标端就会执行失败。比如源端执行DDL,drop指定的约束名,而目标端没有这个名字的约束(因为目标端自动生成的约束名不一样)。而YStream通过更详细的附带信息能解决这类问题。
增量迁移:并行入库
从源端获取增量数据后,如何高效的把增量数据在目标端入库,也是增量迁移的重点内容。迁移组件支持表级和事务级两种并发模式,以提供数据入库效率。
按表并发
图片24.png

1.介绍:按表并发是根据表的对象id将逻辑日志哈希分组,分配给不同的线程,写入目标库。即每个表的DML只属于一个线程。
2.技术要点:为了进一步加速入库速度,迁移组件采用DML合并策略,按照一定规则将同一行数据的多个DML合并成一条DML,以此压缩DML数量。同时迁移组件将小事务合并成较大的事务,进行批量提交,以此减少事务提交次数。
3.适用场景:按表并发模式对于表数量多的场景很友好。不过该模式只能支持最终一致性,因为它将事务做了拆分,所以不满足瞬时一致性。
4.性能:按表并发模式的TPCC模型下,从YashanDB到Oracle的增量迁移,可以做到每秒8万条DML的迁移速度。该统计基于逻辑日志中的DML数量,每条DML只改一行。这个性能不算高,主要原因是TPCC模型下,只有一两张是热点表,导致采用按表并发模式难以提升并发度。
按事务并发
图片25.png

1.介绍:按事务并发,是指按事务进行哈希分配,把一个事务的所有DML分配一个线程进行入库。
2.技术要点:因为事务之间可能存在先后依赖关系,若不遵循特定的顺序执行事务,会导致执行失败或数据不一致。所以先要对逻辑日志进行分析,将可以并发执行的事务进行分组,且保证同一组的事务相互独立、没有依赖,则该组事务就可以并行入库。待该组事务全部提交完成后,再并发执行下一组事务。
3.适用场景:按事务并发模式可以做到瞬时一致。此外,在一组事务提交的时候,可以选择按照源端提交顺序依次提交,达到串行化的强一致效果,也可以不做限制,提高入库性能。
4.性能:按事务并发模式的TPCC模型下,从YashanDB到Oracle的增量迁移,可以做到每秒13万条DML的迁移速度。该统计基于逻辑日志中的DML数量,每条DML只改一行。
断点续传
断点续传是指增量迁移过程中,源端或目标端发生故障,导致事务传输中断后,可以重新从断点位置继续传输。为了提高增量迁移的可靠性,迁移组件实现“精确一次”的断点续传功能。
在迁移开始前,迁移组件在目标端创建一张辅助表,然后在往目标端迁移的事务中,同时更新辅助表中的position,这样事务提交后,这个position之前的数据就迁移成功了。
若在迁移过程中任意时刻发生故障,比如断网、数据库宕机等,只要在迁移组件重连目标库后,把辅助表里的position发送给YStream,YStream就可以从断点处发送后续数据,不会漏发,也不会重复发。

未来展望
异构数据库之间的数据迁移,是一项较为复杂的工程。在不同的数据库产品,不同的部署拓扑结构下,会有较大差异的处理逻辑。目前YashanDB的迁移组件实现了数据迁移的常用功能,但是还有一些能力有待完善,未来我们将从以下几个方面进行优化加强:
丰富产品兼容性,适配更多的数据库。
支持双向复制,解决循环复制问题。实现所有节点之间可以相互同步数据,达到一个多活的效果。
全面提升数据质量管理,包括数据类型转换,数据的校验,增量和全量的校验,数据过滤和清洗功能。

相关文章
|
安全 索引 算法
分布式唯一ID系列(2)——UUID适合做分布式ID吗
UUID的生成策略: UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
6002 0
|
安全 Java API
Java多线程编程:使用Atomic类实现原子操作
【4月更文挑战第6天】Java的`java.util.concurrent.atomic`包提供了一系列原子类,如`AtomicInteger`和`AtomicLong`,利用CPU原子指令保证无锁情况下变量更新的原子性,从而实现线程安全。这些类在高并发场景下能避免线程阻塞,提高性能。`AtomicInteger`和`AtomicLong`支持原子地增加、减少和设置值,而`AtomicReference`则适用于原子更新引用对象。尽管原子类具有非阻塞、线程安全和易用等优点,但它们仅保证单个变量的原子性,复杂操作可能仍需传统同步机制。了解其工作原理和局限性,有助于提升并发应用性能。
275 0
|
网络协议 Linux
Debian中如何设置静态IP地址 网关 DNS
新安装的Debian系统,默认一般使用DHCP获取IP地址,除非在安装过程中,使用了指定的IP地址。本文将介绍如何在Debian系统中,配置使用静态IP地址,配置网关,以及设置DNS服务器。 这些配置通过修改配置文件,很容易实现。
10887 0
|
移动开发 C语言
C语言:&&和&、||和|有什么区别
在C语言中,&&和||是逻辑运算符,分别表示逻辑与(AND)和逻辑或(OR),它们用于连接两个布尔表达式,只有当两边都为真时&&返回真,||在至少一边为真时返回真;&和|是位运算符,对应地进行位级的与、或操作,它们对操作数的二进制位进行逐位处理。&&和||具有短路特性,而&和|没有。
13834 1
|
前端开发 JavaScript 开发者
别再只用普通函数了!箭头函数的四大神奇区别,让你的代码飞起来!
【8月更文挑战第23天】在Web前端开发中,JavaScript的箭头函数(引入于ES6)提供了一种比传统函数更加简洁的定义方法。箭头函数使用 "=>" 替代 "function" 关键字,并且自动绑定外部 "this" 上下文,避免了传统函数中 "this" 值因调用方式不同而变化的问题。此外,箭头函数不拥有自己的 "arguments" 对象,但可以通过剩余参数语法获取所有参数。需要注意的是,箭头函数不能作为构造函数使用。理解这些差异有助于开发者编写更高效、清晰的代码。
563 0
|
前端开发 关系型数据库 MySQL
OceanBase数据库常见问题之bootstrap时报错如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
监控 NoSQL Java
【线上问题】服务CPU彪高排查
后端程序员出去面试经常会有面试官喜欢问你有没有排查过线上问题,遇到后怎么排查的。
714 0
【线上问题】服务CPU彪高排查
|
算法 搜索推荐 索引
Elasticsearch相关度评分算法(三):BM25(Okapi BM25)
Elasticsearch相关度评分算法(三):BM25(Okapi BM25)
Elasticsearch相关度评分算法(三):BM25(Okapi BM25)
|
安全 Java 关系型数据库
《阿里巴巴Java开发手册(终极版)》电子版地址
《阿里巴巴Java开发手册》(终极版)从Java开发者的视角出发,内容涵盖编程规约、异常日志、单元测试、安全规约、工程结构、MySQL数据库六个维度。 本手册自发布以来,多次迭代,阅读量数以百万计,可称为Java开发者的必读手册。通过阅读本书,开发者同学可以系统地学习到如何在编程过程中高效协作、提升程序的交付质量、以及提升代码内容的创造性和优雅性。
867 0
《阿里巴巴Java开发手册(终极版)》电子版地址