摘要: 数据库迁徙的目标是为了业务迁徙,而业务是否顺利切换取决于数据库的迁徙能力和迁徙后的准确性,站在业务侧的角度,至多要满足以下三个正确性才可能去做业务的切换。
本文分享自华为云社区《华为云 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 个工具产品造成了整个迁徙过程的闭环。
- 语法迁徙(UGO)
实现了将 oracle 数据库对象迁徙到 GaussDB(for openGauss) 的能力,能够给出残缺的迁徙评估报告,哪些对象能够齐全兼容的进行迁徙,哪些对象须要进行转换进行迁徙,哪些对象须要业务配合革新。
- 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》技术直播整顿实现,错过直播的小伙伴们,欢送点击此处回顾精彩内容哦~
点击关注,第一工夫理解华为云陈腐技术~