摘要: 阿里数据库迁移项目yugong开源啦!yugong解决了单机Oracle无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从Oracle数据迁移到MySQL上,完成去IOE的第一步。DBA的小伙伴们赶快来围观!
项目简介
yugong(意译:愚公)项目是阿里的开源项目,该项目使用纯Java开发,主要作用是进行数据库迁移,目前该项目主要支持从oracle数据库向Mysql和DRDS数据库进行迁移。
项目背景
08年左右,阿里巴巴开始尝试MySQL的相关研究,并开发了基于MySQL分库分表技术的相关产品,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机Oracle无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从Oracle数据迁移到MySQL上,完成去IOE的第一步。
项目介绍
架构
1. 一个Jvm Container对应多个instance,每个instance对应于一张表的迁移任务
2. instance分为三部分
a. extractor (从源数据库上提取数据,可分为全量/增量实现)
b. translator (将源库上的数据按照目标库的需求进行自定义转化)
c. applier (将数据更新到目标库,可分为全量/增量/对比的实现)
yugong架构特点
1.全量+增量任务 (减少复杂度)
2.JDBC协议 (解决环境兼容性)
3.oracle物化视图 (解决记录增量日志)
4.引入translator扩展 (解决异构数据转化)
yugong支持的功能
同构功能支持:
1.Oracle -> Mysql
2.Oracle -> Oracle
异构功能支持:
1. 编码不同
2. 库名/表名不同
3. 字段名字不同
4. 字段类型不同字段个数不同(多几个,少几个)
yugong的数据迁移流程
整个数据迁移过程主要分为全量迁移和增量迁移两个部分。
迁移的大致过程如下:
1.增量数据收集 (创建oracle表的增量物化视图)
2.进行全量复制
3.进行增量复制 (可并行进行数据校验)
4.原库停写,切到新库
回滚方案:开启新库到老库的数据回流
Yugong的使用限制
1.数据库权限 基本CRUD,物化视图操作等
2.增量同步不支持主键变更
3.需要先delete,后insert 源和目标类型不兼容时需要自定义转换逻辑源库为number,目标库varchar不支持, 目标为int/decimal可自动处理
4.增量同步对oracle库压力 物化视图和回表查询都会对源库产生比较大的影响
数据迁移方案设计
全量方案
业界常用的全量方案有:
1.数据文件导入/导出,比如EXPDP/IMPDP, mysqldump/source, xtrabackup等
2.ETL数据导入/导出,主要原理为使用JDBC数据查询接口
yugong在项目设计之初考虑去IOE数据迁移的灵活性和自定义能力,最终选择的方案为基于JDBC接口遍历数据.
相比于数据文件导入/导出,其优点:
- 灵活数据同步
- 支持异构数据
- 实现相对简单
缺点:
- 全量拉取需要配合增量使用,会有部分数据重复同步
- 性能和影响,一次性全量拉取,如果持续时间过长,如果此时数据库变更过多,会导致segment过大
增量方案
业界常用的增量方案有:
1.基于时间戳定时dump
2.oracle日志文件,比如LogMiner,OGG
3.oracle CDC(Change Data Capture)
4.oracle trigger机制,比如DataBus , SymmetricDS
5.oracle 物化视图(materialized view)
6.当然还有很多...
yugong在项目设计之初考虑去IOE数据迁移的灵活性,支持多种oracle版本,同时为降低DBA的运维成本,最终选择oracle物化视图作为我们的增量方案.
相比于其他,物化视图方案其优点:
- 原理简单,方便理解和学习,用户可以理解为一种固化的简易trigger模式
- 运维简单,DBA一次账户授权后,程序可按需create一张物化视图表即可完成增量订阅
- 相对透明,不需要像时间戳sql扫描依赖数据库表设计,也不需要关注oracle版本和服务器存储等
缺点:
- 性能和影响,类似于trigger机制会对源库的数据写入造成一定的性能影响.
使用环境
yugong的使用环境比较广泛,yugong是采取纯Java开发,有bat和shell脚本,windows/linux均可运行。至于JDK,推荐使用1.6.25以上版本,稳定可靠,并且目前阿里巴巴也基本使用此版本。
数据库
源库为oracle,目标库可为mysql/drds/oracle. 基于标准JDBC协议开发,对数据库暂无版本要求,但需要的数据库账户权限。