由于分布式数据库的特性,OceanBase日志信息分布在集群的不同机器上,若想拿到正确、完整的日志信息,需要借助工具将日志信息进行汇总。
OceanBase社区版利用CDC 组件架构进行这项工作,并通过oblogproxy提供日志拉取的服务。同时,提供oblogclient给用户将其集成在业务应用中,以便进行 OceanBase增量数据的处理。目前,数据集成框架ChunJun、Flink CDC、Cloud Canal已与OceanBase达成生态合作。本文向大家介绍OceanBase & CloudCanal数据迁移同步方案及近期的技术迭代。
OceanBase & CloudCanal使用场景
CloudCanal拥有丰富多样的数据融合场景,包括实时数仓构建、混合云数据同步、业务数据架构升级、多活数据库双向/多向同步等(见图1),助力企业挖掘数据价值。
图1 CloudCanal应用场景
在数据库侧,CloudCanal 自2022年开始支持OceanBase数据迁移同步能力,作为一款专注于数据迁移同步的工具,其提供了数据迁移、数据同步、结构迁移、数据校验、数据订正、自定义数据处理等一系列完整功能(见图2)。
图2 CloudCanal 完整功能
而在数据迁移过程中 ,涉及以下核心能力。
1. 数据迁移。
很多替换数据库的用户需要将MySQL数据迁移至OceanBase,此时,将指定数据源数据全量搬迁到目标数据源的过程就是数据迁移。CloudCanal支持多种数据源,具备断点续传、顺序分页扫描、并行扫描、批量写入、并行写入、数据条件过滤等特点,对源端数据源影响小且性能好,同时满足数据轻度处理需求。数据迁移可以同时搭配结构迁移、迁移后指定时长数据同步、数据校验,满足可能的业务平滑切换需求。
2. 数据同步。
数据同步是通过消费源端数据源增量操作日志,准实时在对端数据源重放,以达到数据同步目的,支持多种数据源,具备断点续传、DDL 同步、边同步边校验、对端事务保持、高性能对端写入、数据条件过滤等特点。
数据同步的过程中可以同时进行结构迁移、数据初始化(全量迁移)、单次或定时数据全量校验,既便利,又能满足业务长周期数据同步对于数据质量的要求。
3. 结构迁移。
结构迁移可以作为数据迁移或数据同步的准备步骤,也可以独立使用,帮助用户快速镜像指定数据源结构,具备类型转换、数据库方言转换、命名映射等特点。
4. 数据校验。
数据校验是让数据质量可衡量,可单独使用,也可以配合数据迁移、数据同步使用,具备全量校验、增量校验、采样率、定时执行、校验数据条件过滤等特性,满足用户灵活的数据质量验证需求。
OceanBase & CloudCanal技术优化
随着使用OceanBase & CloudCanal数据迁移同步方案的用户和频率增多,问题反馈也越来越多。因此,大规模优化方案能力势在必行。此次优化包括提升同步性能、统一各类表全量扫描方式、支持全局索引表、异构DDL同步转换优化、解决时间戳自更新问题。
优化一:大幅提升同步性能
CloudCanal 目前使用 OceanBase LogProxy 做增量数据订阅,使用方式相对简单明了。
@Override
public void notify(LogMessage message) {
try {
ParsedEntry entry = msgConvertor.convertMsgToEntry(message);
if (entry == null) {
return;
}
instance.getEventStore().put(entry);
} catch (Exception e) {
String msg = "parse ob msg failed.msg:" + ExceptionUtils.getRootCauseMessage(e);
log.error(msg, e);
throw new LogProxyClientException(ErrorCode.E_PARSE, msg);
}
}
由于消息解析对性能影响相对小,攒批和对端写入方式影响更大。因此,在攒批方面,CloudCanal将变更事件写入内存队列后,按照 个数/容量阈值(increBatchSize) 或 超时时间(fetchFromBrokerTimeoutMs) 刷出,提升批量写入的粒度。对端写入方式根据不同数据源,采用了 batch、multisql、并行、upsert 等技术提升写入效率。
优化二:统一各类表全量扫描方式
全量数据扫描是 CloudCanal 全量数据迁移(或数据初始化)的重要组成部分,需满足性能优秀(2KB/record,>= 100k records 扫描速率)、可断点续传、可预测进度、表兼容性好的要求。
其中前三者是业务要求,最后一种是尽可能满足前三者的前提下,做到更多表的兼容。
CloudCanal 碰到的"表"包含以下类型。
- 关系型数据库:
- 无/单/多主键
- 各种类型主键(整型/浮点/日期/二进制等)
- 差异值主键(有/无符号,null值/空值,超长值)
- 各种类型分区
- 差异数据量(1万,100万,1000万,1亿,10亿,100亿)
- 实体表/视图/临时表
- 消息中间件:
- 各种命名规范
- 无/有分区
- 顺序/非顺序
- 文档数据库:
- 规范/非规范(schemaless)
- 无/有行业规范格式(ObjectId)
- 缓存数据库
- 搜索引擎
CloudCanal 全量数据扫描主要面向关系型数据库,性能要求、断点续传能力、进度预测能力都基于主键展开。
此次优化,统一了扫描逻辑,并且让无/单/多主键、各种类型主键、分区表都可断点续传:
- 以主键、分区作为断点续传位点;
- 扫描语句加入分区指定(如有)、元组比较(单/多主键)、按元组排序、指定分页数等部分;
- 对比位点最大值、扫描行数方式判定扫描是否结束。
此外,各个数据源可根据自身差异性,可扩展扫描语句、最大最小位点值获取逻辑、链接自定义(设置超时等)、执行语句上下文自定义(设置fetchSize等)。
优化三:支持全局索引表
全局二级索引(GLOBAL)对分布式数据库有着非常重要的作用,它让原本多分区数据检索操作弱化成单分区检索,加速不同维度点查响应,提升 QPS。
对于 OceanBase 对端写入,CloudCanal 默认采用关系型数据库 INSERT IGNORE/ON DUPLICATE KEY UPDATE 规避主键/唯一键冲突。
但对于带有 GLOBAL 索引的表,OceanBase 不支持 INSERT IGNORE 操作,所以此次优化将写入 OceanBase 的 INSERT 操作默认改为 ON DUPLICATE KEY UPDATE (REPLACE)。
优化四:异构 DDL 同步转换优化
从异构数据库同步 DDL 到 OceanBase,优化为白名单模式。如从 MySQL 到 OceanBase DDL 同步,默认支持
- ALTER TABLE xxx ADD/DROP/MODIFY COLUMN
- CREATE INDEX
- RENAME TABLE
优化同时去除了 ALTER TABLE xxx CHANGE COLUMN、AFTER/BEFORE 等 OceanBase 现阶段不支持的语句。
不过,此项能力会随着 OceanBase 产品能力的进化而不断丰富。
优化五:解决时间戳自更新问题
对于类似 gmt_create datetime/timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 时间字段定义,当源端该字段值变化区间小于时间精度(被程序判定未变化),并且写入对端并非采用 upsert 方式(精确字段更新),那么该字段数据将不一致。
CloudCanal 在精确字段更新模式下,默认将时间字段置为更新状态,确保将源端值带到对端,解决不一致的问题。
未来演进方向
1. OceanBase 4.x 版本兼容。
OceanBase 4.x 有着更加便利的部署方式和更好的使用体验,CloudCanal 将对此版本展开兼容性测试,特别对于其可能存在的订阅权限(系统租户保护)变化、更多的 DDL 支持、更加丰富类型支持做出变化。
2. OceanBase 商业级增量组件兼容。
OceanBase 商业版 OMS 的数据订阅能力有别于目前社区版的 LogProxy, CloudCanal 将在OMS使用面扩大后第一时间跟进兼容。
3. 更快的数据校验和订正能力。
分布式数据库相对单机数据库,单表数据量大幅度增加(亿级表相当常见),数据校验和订正性能相比数据初始化,更加依赖数据扫描的性能,为此,CloudCanal 将开放单表分片/分区并行扫描的能力。
4. 更强的结构迁移和 DDL 同步能力。
大表通用/特殊化分区是常见操作,目前 CloudCanal 对表分区的结构迁移并未有效支持,这种分区的结构迁移,对于同构数据库相当必要。后续,CloudCanal将提供分区信息的结构迁移。
5.更多的数据源生态支持。
以 OceanBase 为源端数据迁移同步,目前支持 MySQL、StarRocks、OceanBase、Kafka 对端,希望后续如 Redis、ElasticSearch、Doris、Hudi 等数据源也能加入到这个目标数据源中。
总结
本文主要介绍了 CloudCanal 在过去一段时间对 OceanBase 数据迁移同步能力的优化,从而使该能力具备更强的性能、更好的兼容性、更加稳定的数据迁移同步表现。欢迎大家关注后续优化动态,并积极提出反馈和建议。