4

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

 3 years ago
source link: https://my.oschina.net/u/4526289/blog/5118793
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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个工具产品形成了整个迁移过程的闭环。

v2-64da35f4175db46045655a4ee9a01c7b_720w.jpg

  • 语法迁移(UGO)

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

  • DRS-数据迁移

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

  • DRS-数据校验

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

  • DRS-流量回放

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

3.DRS数据迁移上云

v2-5cb0339eb3d65338aedc43dabb3b93ef_720w.jpg

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

v2-6dd684ddbd60f52bf74a050f4d64e396_720w.jpg

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

  • 在线迁移

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

  • 预校验

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

  • 断点机制

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

4.DRS技术实现原理

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

全量同步的技术架构

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

v2-f894e2688383cf5dfa22b4789f3111aa_720w.jpg

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

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

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

为减少全量同步过程中对磁盘的占用,DRS导出的数据不进行落盘缓存,而是直接通过内存传递给导入线程,在导出和导入速率相当的情况下,可以最大化的提高全量同步的效率。

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

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

  • 全量+增量的无缝衔接

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

增量同步的技术架构

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

v2-ee5538cfbff6014e2fb1526828179098_720w.jpg

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

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的并发机制采用记录级别的并发,最大化的提升数据装载的性能。

v2-5c8754749e9a8cfc5882d76401be99a6_720w.jpg

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK