当前位置: 首页 > 科技观察

2020实战回顾:如何从0到1打造数传平台产品DTS?

时间:2023-03-12 00:51:54 科技观察

2020年下半年的主要任务是从0到1打造数传服务平台产品,顺利上线后基本达到预期,实现了原先的产品规划目标。这里回顾记录一下从0到1的过程,包括:产品设计整体技术架构核心模块的技术选型、原理、改造和适配总结与展望1.什么是数据传输服务数据传输服务DTS(DataTransmissionSystem)的目标是支持RDBMS、NoSQL、OLAP等数据源之间的数据交互,集成数据迁移/订阅/同步,帮助构建安全、可扩展、高可用的数据架构。当然目前我们的核心存储还是以MySQL为主。因此,自主研发的数据传输服务的主要数据源是MySQL。为什么不直接使用公有云产品,比如阿里云DTS?主要是为了更好的对接其他内部系统,支持很多内部系统数据迁移/同步的自动化流程需求。同时,业界相关的开源技术非常丰富和成熟,有很多现成的轮子可以使用,可以大大降低使用云服务的成本。2、产品设计中对DTS需求的最强来源是正在进行的多云架构,需要具备构建多云数据库镜像的能力。同时,我们对其他业务需求进行了深入研究,获得了很多用户场景。包括但不限于:数据库多云同步分库分表数据同步ES索引构建压测数据、离线导入/同步缓存刷新、本地缓存/Redis缓存等刷新业务数据变更订阅CQRS方式实现这些场景经过总结,我们得到了DTS的三大产品功能模块。数据订阅模块:支持ES索引构建、缓存刷新、业务数据变更订阅、CQRS方式实现数据迁移模块:支持数据库多云同步、分库分表数据同步、压测数据、离线导入数据同步模块:支持数据库多云同步,分库分表数据同步,压测数据,离线导入/同步3.总体技术架构整个DTS系统分为三个逻辑层次,交互层,控制层,和引擎层。3.1交互层交互层是用户可见的前端DTS产品,是用户视角下的DTS系统。1)产品模块体系包括数据订阅产品模块、数据迁移产品模块、数据同步产品模块。用户通过与各个产品模块交互,直接获取对应产品模块的任务信息,实现对模块任务的管理,包括创建、启动、停止、发布、任务监控信息等。2)通用服务交互层除了产品模块,用户可感知的交互能力还包括用户管理、权限管理、变更管理、基础任务信息管理等通用服务能力。这些通用服务能力可以来自其他内部系统,也可以独立设计。最重要的是,这些公共服务可以复用,用于DTS未来的产品扩展,包括Redis数据同步和HBase数据同步。3)核心设计正如开头所提到的,虽然我们目前专注于MySQL,但未来我们肯定会扩展到其他数据源的数据迁移和同步。因此,交互层的核心实现采用了模板模式,实现了基础任务的创建、启动、停止、发布、审核、认证等流程。基本任务流程中的具体动作,如启动引擎任务、停止引擎任务等,都在各个模块的实现类中实现。实现了DTS模块化设计和高扩展性,为以后接入其他迁移/同步引擎(Redis/Hbase)打下基础。3.2控制层控制层是管理员的操作平台。该层主要面向运维视角,实现引擎层的监控、启停、扩展等能力。相较于交互层的产品模块,这一层的控制台会有更复杂的任务控制选项,同时也会有很多运维层面的操作,比如引擎层的服务器管理能力。Canal、otter等开源产品已经有自己的控制台,可以直接使用。3.3引擎层引擎层是整个系统的核心部分。在目前的架构设计下,引擎层的引擎是支持扩展和替换的。目前所有开源项目都使用,包括:数据迁移引擎使用Datax:https://github.com/alibaba/DataX数据订阅引擎使用canal:https://github.com/alibaba/canal数据同步引擎使用otter:https://github.com/alibaba/otter对于引擎层,核心是技术选型。需要结合业务需求、开源项目稳定性、开源项目功能特点综合分析。我们将在下面详细解释。此外,对于生产环境中使用的项目,必须采取配套的监控告警措施,保证线上稳定。水獭/运河都有现成的监测指标。我们需要收集同步延迟等关键指标,并设置合理的告警阈值。同时,对于一些不容易掌握的监控指标,比如任务存活状态等,我们可以通过检查进行定期检查,避免同步任务挂掉影响上层业务。4.数据订阅模块4.1技术选择数据订阅实际上是一个CDC(ChangeDataCapture)工具。目前比较成熟的开源产品有Canal、DataX、DataBus、Debezium等。总体而言,Canal、DataX、Debezium拥有大量的用户、活跃的社区和相对成熟的框架。在满足应用场景的前提下,优先选择,成本适中。DataX支持丰富,使用方便,但延迟较大(取决于采集频率)。只需要手工编写规则文件,对于复杂的同步定制性不是很强。虽然Debezium支持的数据源类型比Canal多,但我们实际上只需要mysql,不需要PostgreSQL。而Canal有几个我们非常需要的特性,让我们决定使用Canal作为数据订阅引擎:有专门针对阿里云RDS的定制和优化,可以自动下载备份到oss的binlog文件,然后指定一个开始同步的位置。有一个非常友好的console支持发布到Rocketmq新版本的Canal-Adapter可以支持多客户端消费,包括mysql、es等4.2基本原理数据订阅的原理基本相同,都是基于MySQL的主从复制原理。MySQL的主从复制分为三个步骤:master将变化记录到二进制日志(binarylog)中(这些记录被称为binarylogevents,二进制日志事件,可以通过showbinlogevents查看);slave将master的二进制日志事件复制到它的中继日志中;从服务器重做中继日志中的事件,更改数据以反映其自身。Canal模拟了这个过程。Canal模拟MySQLslave的交互协议,伪装成MySQLslave,向MySQLmaster发送dump协议;MySQLmaster收到dump请求,开始向slave(即canal)推送二进制日志;Canal解析二进制日志对象(原本是字节流);4.3部署架构核心组件:zookeeper:利用已有的zookeeper集群实现订阅任务的HAcanal-admin:数据订阅的控制层的控制台,管理状态canal-server上的订阅任务,配置canal-server:用于运行数据订阅任务,抓取数据库binlog,下发给MQ或下游客户端。4.4使用Canal支持TCP直接消费和MQ消费两种模式。为了支持下游多次消费,减轻上游数据库订阅压力,我们采用了MQ消费模式。将数据库订阅binlogpost到Rocketmq,下游用户可以通过Rocketmq的ConsumerGroup多次重复消费相应的数据,实现业务解耦、缓存一致性等场景。4.5改造适配1)Consoleapi封装由于canal-admin的技术栈还比较新,具有比较成熟的分层结构和独立的rpc接口。所以在DTS服务中,封装了相关的can??al-admin接口。可以实现产品化的前端接口逻辑。2)在云原生改造计划中,改造为k8s部署,支持快速扩缩容。5.数据迁移模块5.1技术选择不同于数据订阅。Mysql数据迁移五花八门,实现原理也各不相同。综合来看,我们选择了DataX作为数据迁移引擎。5.2基本原理DataX是阿里巴巴集团广泛使用的离线数据同步工具/平台,其实现包括MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS、等多种异构数据源之间高效的数据同步功能。我们主要使用MySQL数据同步。它的实现原理比较简单,就是通过select*fromtable;获取全量数据,然后写入到目标数据库中。当然这里使用了JDBC的流式查询来避免OOM。同时datax还支持自定义限速。5.3部署架构及使用Datax的使用比较简单,配置任务Json并执行脚本即可。由于数据迁移很少用到,基本都是一次性使用,所以暂时直接部署在DTS的服务中,通过JavaProcess类进行相关处理。创建Datax需要的conf文件,返回地址使用Runtime.getRuntime().exec()执行Datax的Python脚本根据返回的Process对象,会考虑处理成功/失败,执行输出日志等为了后面的进一步迭代,使用独立服务器DeployDatax,然后通过自定义Java服务或者使用Saltstack远程调用脚本。6.数据同步模块6.1技术选择从综合实现、技术成熟度、双向同步需求等方面考虑,主要有三种数据同步方案。我们选择了otter作为数据同步引擎。6.2基本原理是基于Canal开源产品获取数据库增量日志数据。Canal原则是指数据订阅的基本原则。典型的管理系统架构,manager(web管理)+node(工作节点)。6.3部署架构核心组件:zookeeper:解决分布式状态调度,让多个节点协同工作同时,将同步状态反馈给manager6.4改造适配1)Consoleapi封装由于otter-admin的技术栈比较老,用webx框架实现,没有前后台分离结束。因此,需要根据现有代码重新封装独立的rpc接口,才能对接DTS服务,并封装相关otter-admin接口,实现产品化的前端接口逻辑。2)云原生改造为k8s部署,支持快速扩缩容。具体可以参考我之前的文章拥抱云原生,如何用k8s部署开源项目?七、从产品设计、技术研究、架构设计的总结与展望最终研发上线大概用了半年时间。最终,功夫不负有心人,项目顺利上线。通过前端产品的简单交互和审核,秒级快速创建DTS任务。目前已支持数十种DTS任务(包括数据订阅、数据迁移、数据同步),多云数据库镜像、ES索引构建、实时数据同步、业务数据订阅等多种业务场景得到实施。未来还需要进一步的技术迭代,包括:1)扩展数据传输引擎目前正在尝试接入Redis-shake进行Redis的迁移和同步。以后会继续尝试HBase-replication的接入,做HBase相关的任务迁移和同步。这些可以通过重用通用服务功能和模板流程来快速访问。2)添加调度模块后期需要添加任务调度模块,主要实现两方面的能力:根据实例负载调度任务,保证资源的合理使用,根据业务特点和重要性调度任务,保证资源隔离3)完成上云目前只有otterengine实现了原生改造的k8s部署,未来将实现canal-server和Datax的k8s部署,满足快速扩缩容,提高资源利用率。