开发者必看!你想知道的迁移之道都在这里了

摘要:数据库迁移的目的是为了业务迁移,而业务可否顺利切换取决于数据库的迁移能力和迁移后的准确性,站在业务侧的角度,至少要知足如下三个正确性才可以去作业务的切换。

本文分享自华为云社区《华为云GaussDB(for openGauss)专场直播第4期:用对迁移工具,迁移也能够很简单》,原文做者:心机胖 。html

1.背景介绍

随着GaussDB(for openGauss)数据库的不断发展,愈来愈多的客户开始选择使用GaussDB(for openGauss),其中很大一部分客户是将现有的系统替换到GaussDB(for openGauss)上,客户当前所用的数据库类型多种多样,如Oracle、MySQL、PostgreSQL等。那么如何解决将客户当前数据库迁移到GaussDB(for openGauss)上是一个很迫切的需求。GaussDB(for openGauss)自带的GDS数据迁移工具实现了GaussDB(for openGauss)之间的高效数据迁移,可是没法解决异构同步和实时同步的场景。华为云数据库迁移工具DRS以一种易用、稳定、高效的云服务为GaussDB(for openGauss)提供了异构迁移和实时同步的能力,助力客户轻松将数据库迁移到GaussDB(for openGauss)。数据库

2.数据库迁移总体解决方案

数据库迁移的目的是为了业务迁移,而业务可否顺利切换取决于数据库的迁移能力和迁移后的准确性,站在业务侧的角度,至少要知足如下三个正确性才可以去作业务的切换。缓存

  • 对象迁移是正确的

数据库的存储过程、函数、触发器、表结构、索引等所有数据库对象可以完整的迁移到目标库,而且可以保证对象的运行逻辑和源库是一致的。网络

  • 数据迁移是正确的

将源库的全量数据迁移到目标库,当业务对停机时间窗口有要求的时候,要考虑全量+增量的在线迁移,保证业务不中断。同时要可以对同步的数据进行校验,保证迁移数据的准确性。多线程

  • 迁移后业务运行是正确的

当对象和数据都迁移到目标库后,业务的切换还存在两个风险点,一个是业务在目标库的运行结果是否正确,另外一个是目标库性能可否和源库同样支撑住业务的负载。由于异构数据库之间的差别仍是很大的,设计理念和实现方式存在不少不一样,会致使看上去相似的两个对象,其运行结果或效率是彻底不一样的。因此要有工具来验证这种差别,保证迁移后业务运行的正确性。架构

为了实现以上业务切换须要知足的条件,华为云提供了数据库迁移的总体解决方案,经过语法迁移(UGO),DRS-数据迁移,DRS-数据校验和DRS-流量回放4个工具产品造成了整个迁移过程的闭环。并发

  • 语法迁移(UGO)

实现了将oracle数据库对象迁移到GaussDB(for openGauss)的能力,能够给出完整的迁移评估报告,哪些对象能够彻底兼容的进行迁移,哪些对象须要进行转换进行迁移,哪些对象须要业务配合改造。oracle

  • DRS-数据迁移

实现将Oracle、MySQL、PostgreSQL等数据库数据实时迁移到GaussDB(for openGauss)的能力。函数

  • DRS-数据校验

实现了对数据迁移后的一致性校验,具有行级比对、内容级比对和实时的增量数据比对的能力。工具

  • DRS-流量回放

实现对Oracle数据库的业务流量抓取,并对流量SQL进行转换,而后在GaussDB(for openGauss)进行回放的能力。

3.DRS数据迁移上云

DRS提供了简单、易用的操做界面,采用流程化的配置方式,客户按照提示步骤一步一步操做即可以搭建出同步链路。DRS除了支持Oracle到GaussDB(for openGauss)的数据迁移外,还支持其余数据库之间的数据同步,下面给出了当前DRS所支持的源库和目标库类型的列表。

在数据迁移过程当中,DRS采用不少手段和技术去下降可能存在的风险,保证迁移过程的稳定和最终数据的一致性。

  • 在线迁移

DRS经过全量迁移将客户数据库中的存量数据迁移到GaussDB(for openGauss)中,经过增量同步,实时解析源库日志,将客户的实时变化数据同步到Gauss(for openGauss),经过全量和增量的无缝衔接来保证客户在不中断业务的状况下,完整地将所有数据迁移到GaussDB(for openGauss)。

  • 预校验

在DRS的迁移任务启动以前,为提前发现迁移启动后可能存在的风险或错误,DRS引入预校验环节,可以提早对配置信息、数据库兼容性信息、连通性信息等进行校验,同时会对一些能够迁移成功但可能会对业务产生影响的状况进行告警,让客户及时发现并提早处理。

  • 断点机制

为保证数据迁移的一致性,DRS在每一个组件中都设有断点机制,不管是在正常启停、异常重启仍是在故障切换的场景下均可以保证数据同步的准确性,不会形成数据丢失。

4.DRS技术实现原理

DRS在技术实现上主要分为两个大的模块,一个是全量的数据同步,另外一个是增量数据同步。全量同步解决对静态数据的迁移,增量同步解决对实时的变化数据迁移。

全量同步的技术架构

全量同步的总体逻辑比较简单,就是从源库把数据经过select的方式查询出来,而后再将这些数据写入到目标库,只是在具体的代码实现上会有一些关键技术点。

  • 数据分片

通常全量同步产品的同步粒度均可以达到表级别的并发,即多个线程能够同时对多张表同时进行同步,但每每客户的系统中会存在单表数据量特别大的状况,好比一张表几十亿甚至上百亿的数据,此时这张表的同步时间就变为整个全量同步的时间。那么如何进一步提高单张表的同步效率呢?咱们能够对单表作进一步的拆分,按照主键去把它拆分红多个分片,多线程以分片为单位作并行的同步。

当前DRS按照下面的策略对表进行分片:

    • 无主键表不进行分片
    • 分区表按分区进行同步,再也不对每一个分区进行分片
    • 有主键表按主键(第一列)进行分片

 

  • 数据不落盘

为减小全量同步过程当中对磁盘的占用,DRS导出的数据不进行落盘缓存,而是直接经过内存传递给导入线程,在导出和导入速率至关的状况下,能够最大化的提升全量同步的效率。

  • 断点控制

全量同步半途中断是一个很是让人棘手的问题,可能一张2亿条数据的表,在同步到1.8亿的时候由于网络或源库快照过旧的问题致使同步失败,若是没有好的断点控制机制,那可能以前的付出都白白浪费,还要从新再次同步一次。DRS经过以分片为单位作为断点的保存记录,对于上面的例子,即便同步中断,也能够再次被拉起,并且拉起后,已经同步成功的分片将再也不同步,尚未同步的分片则会继续同步。

  • 流量控制

客户的业务每每是存在高峰期和低峰期,高峰期时,数据库的资源占用是最高的,咱们要尽可能避开在业务高峰期作全量的同步,由于全量同步对源库的cpu、内存和网络资源占用是很大的。DRS采用流量控制的机制来减小业务高峰期对源库的资源占用,主要是经过控制网络流量的方式,客户能够设置要进行流量控制的时间段,DRS在全量同步过程当中,会实时计算同步的流量大小,运行到该时段后,当流量超过设置的阈值,会放缓数据获取的速度。运行过该时段后,便恢复所有的数据同步速度。

  • 全量+增量的无缝衔接

在业务切库的场景中,数据的迁移过程通常能够选择两种方案,一种是一次性将源库的数据迁移到目标库,可是须要业务停机窗口,这个窗口的大小取决于全量数据迁移的时间。当数据量较大时,整个迁移过程可能须要几天的时间,这种业务停机是没法接受的。因此另外一种方案就是业务不中断的数据迁移方案,它的实现原理就是基于全量迁移和增量同步的无缝衔接,对于Oracle->GaussDB(for openGauss)的迁移,Oracle数据库提供了指定scn进行快照导出的功能,基于这个特性,DRS在作全量同步时,指定scn进行导出,这样整个全量同步的数据就是此scn点前的快照数据,而后增量同步以这个scn点做为同步的分界点,只有大于这个scn的增量事务才会被同步到目标库。这样就实现了全量和增量的无缝衔接,同步过程无需业务进行停机,当全量数据同步完成且增量同步追赶到当前时间点时,即可进行业务切换,业务中断窗口能够控制在秒级。

增量同步的技术架构

DRS的增量同步架构主要分为3个部分,分别是数据抓取、落盘文件和数据回放。

  • 数据抓取

数据抓取经过对源库日志的解析,实时获取源库的变化数据,在内部实现上主要包括日志拉取、日志解析、事务整合和数据落盘几个步骤。

    • 日志拉取

DRS采用Oracle的Logminer接口获取实时的redo日志,当redo归档后,DRS会读取归档日志文件。为了防止源库的归档日志被不肯定性删除,DRS会启动日志拉取的线程(能够多线程并发)把日志拉取到本地,而后进行后续的解析。

    • 日志解析

Oracle Logminer接口获取到的数据须要进一步解析才能获取到实际的变化内容,DRS的日志解析线程对返回的数据进行过滤、拼接、元数据映射、转换等操做造成一条完整的变动记录对象。

    • 事务整合

日志解析是按照源库变化数据的顺序进行解析,解析后的每条记录的事务是交叉混合在一块儿的,必须对每条记录按照事务id进行整合才能造成一个完整的事务。另外一方面对于Oracle RAC的场景,还须要对不一样节点的事务进行排序,避免事务乱序的状况发生。

  • 落盘文件

通过了事务整合后,造成了一个按照源库业务提交顺序的序列,DRS会按照这个顺序把这些数据写入到磁盘文件。落盘的数据包含了源库每一条变化数据的所有信息,包含表信息、列信息、事务信息、数据信息和其余额外信息(如时间戳、rowid等),根据这些信息后面的组件即可以把每一条变化数据还原成对象的SQL。

  • 数据回放

数据回放就是将数据抓取到的数据在目标库进行执行的过程,但它和数据的抓取是解耦的。它读取DRS的落盘文件,解析出每条变化的数据,根据文件中记录的元数据信息重构出对应的SQL语句,在目标库执行。

在数据回放以前,DRS提供了过滤和转换的功能,能够对同步的数据进行过滤,可配置过滤条件,如只同步id < 10000的数据,也能够对同步数据的表名、schema名或列名进行映射等。

异常处理和回放性能是两个重要的考量点,DRS经过配置数据冲突策略来处理回放中的异常数据,经过并发机制来提升装载的性能。

    • 冲突策略

所谓的冲突是指在数据回放的时候出现了数据类报错(如主键冲突、update和delete没法找到记录等),这些报错一版都是因为两边的数据不一致形成的。DRS对这类错误采用了三种处理策略,分别是覆盖、忽略和等待。

覆盖:当出现冲突时,用抓取到的数据覆盖掉目标库的数据

忽略:数据冲突后,直接跳过错误记录,继续执行

等待:数据冲突后,等待人工处理

    • 并发机制

DRS的并发机制采用记录级别的并发,最大化的提高数据装载的性能。

首先从DRS的落盘文件中读取增量数据,按顺序放入一个队列中,并行分析引擎会从队列中获取每一条数据,并根据其主键信息判断是否存在数据冲突,对于没有冲突的数听说明能够并行去执行,则把这些数据分散到多个线程队列中,当线程队列中的数据量达到设定的阈值时,这批数据会做为一个事务在目标库执行。对于有冲突的数据,则把这条数据放到冲突队列,等待线程把上一批数据执行完成后,再次进入并行分析引擎判断是否存在冲突。

 

Ps:该内容根据《GaussDB(for openGauss)数据迁移之DRS》技术直播整理完成,错过直播的小伙伴们,欢迎点击此处回顾精彩内容哦~

 

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索