MySQL 到 MySQL 在线同步不是一个新鲜话题了,但是面对数据源异构、高度产品化创建、并且稳定运行于在线严苛场景,需要做的工作会比一个单纯工具或者脚本多得多。本篇文章仅从功能角度介绍 CloudCanal 如何快速创建并运行此种数据链路。
通常所说的数据库异构在于三个维度,相互可以组合,包括 两端数据库类型不同、表结构约束不一致 和 **数据差异。**后两者工作更多在于传统 ETL 领域的 Transform 范畴,在如今大数据 ODS 构建过程中被弱化(所谓 ELT),但是在在线业务领域仍然存在较多严苛需求(Streaming)。而前者对系统的架构和核心数据结构设计有诸多要求,这些要求来自于 增量数据获取方式多样、SQL 方言差异、约束差异、元数据差异、**部署形态(如分布式)**等问题的处理。
增量数据获取方式 如 ORACLE 的 redo 日志、物化视图,MySQL binlog 、Postgres WAL、MongoDB oplog等千差万别,如何快速增加源端数据库支持需要系统级设计和抽象,也是一个比较漫长的过程。
SQL 方言差异 如 RDB 分页差异(数据扫描)、写入冲突处理、大小写、表结构定义差异等。约束差异 如索引 owner 归属偏差、partition key/sharding key 和 PK/UK 的关系差异(如 GreenPlum 对唯一键的要求) 等。上述两个差异,对于纯粹数据迁移、同步影响较小,但是对于 DDL 同步、结构迁移存在巨大挑战(如 MySQL 到 Greenplum 需要对索引重命名、裁剪和 partition key 无关的 UK 等),在库、表、列映射、裁剪等情况下,更加复杂。
元数据差异 包括数据类型转换、db/schema/table/topic/tablespace/index(ES) 层次差异、partition key / sharding key 等结构支持、分布式数据库分片差异(如 MongoDB shard/replication set 结构和分布式数据库中间件 shard 的迁移同步架构统一),以及 big evil 以分布式数据中间件为源端的 DDL 同步。
但是今天,我们并不展开介绍 数据库类型不同 的数据迁移同步功能,而是介绍 MySQL 到 MySQL 在线数据迁移同步所面临的异构问题,更多是业务需求所产生的 表结构不一致 和 数据差异 ,其中包括库、表、列映射、裁剪 和 数据过滤。希望此篇文章能够让你在 5 分钟内搞定这个事情(环境 ready 的情况下)。
我们有3个 MySQL 数据库,源实例上的库叫 drds_1 和 drds_2 ,目标实例上有 drds_merge 库, 其中源库里面有若干张表,并且存在一些测试数据,有些表正常迁移(worker_stats表), 有些表需要汇聚(shard_x表),有些表需要结构迁移(kbs_question),有些表有映射(shard_x表),有些表不同步(kbs_article表),有些表字段需要映射和裁剪(data_job)。接下来我们花 5 分钟时间来搞定这个事情,并且做一次数据校验。
如果选择的库、表、列在对端不存在,则进行结构迁移
结构迁移完成后自动进行数据初始化,映射、裁剪、数据过滤按照设定运行。目前 CloudCanal 数据初始化都是逻辑初始化,速度可能没有某些物理初始化快,但是灵活度高。
数据初始化完毕,开始进行增量同步。增量同步会自动从数据初始化位点拉取 MySQL binlog 进行回放,同样会执行映射、裁剪、以及数据过滤等操作。
按相同逻辑创建一个增量任务。(暂未推出创建相似任务)
校验任务跑完,获取差异数据,并抽样对比,数据一致。校验的差异主要是数据多次更新、同步延迟等造成,一般非大规模不一致或丢失,则数据正常。
数据差异数据目前需要到任务日志目录获取,暂时未提供日志下载能力。
异构数据源的在线迁移和同步,此篇文章主要简单介绍了下功能,对于在线严苛场景而言,后续的监控告警、容灾、特殊数据处理、抗峰值、问题排查等都是重要工作。