欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

增量数据同步中间件DataLink分享(已开源)

程序员文章站 2022-05-15 20:38:09
项目介绍 名称: DataLink['deitə liŋk]译意: 数据链路,数据(自动)传输器语言: 纯java开发(JDK1.8+)定位: 满足各种异构数据源之间的实时增量同步,一个分布式、可扩展的数据同步系统开源地址:https://github.com/ucarGroup/DataLink ......

项目介绍

名称: datalink['deitə liŋk]
译意: 数据链路,数据(自动)传输器
语言: 纯java开发(jdk1.8+)
定位: 满足各种异构数据源之间的实时增量同步,一个分布式、可扩展的数据同步系统
开源地址:https://github.com/ucargroup/datalink

此次开源为去除内部依赖后的版本(开源的是增量同步子系统),在集团内部datalink和阿里的datax还进行了深度集成,增量(datalink)+全量(datax)共同组成统一的数据交换平台

项目背景

随着神州优车集团业务的高速发展,各种各样的数据同步场景应运而生,原有的系统架构难以支撑复杂多变的业务需求,so,从2016年底开始,团队内部开始酝酿datalink这个产品。着眼于未来,我们的目标是打造一个新平台,满足各种异构数据源之间的实时增量同步,支撑公司业务的快速发展。在充分调研的基础之上,我们发现,没有任何一款开源产品能轻易的满足我们的目标,每个产品都有其明显的短板和局限性,所以最终的选项只有"自行设计"。但自行设计并不是凭空设计,现有的数据交换平台、已有的经验、大大小小的开源产品都是我们的设计根基,与其说是自行设计,倒不如说是站在巨人的肩膀上做了一次飞跃。由此诞生了datalink这样一个产品,其产品特性主要如下:

  • 满足各种异构数据源之间的实时增量同步,提供抽象模型,支持高可扩展
  • 平台提供统一的基础设施(高可用、动态负载、同步任务管理、插件管理、监控报警、公用业务组件等等),让设计人员专注于同步插件开发,一次投入,长久受益
  • 吸收、整合业内经验,在架构模型、设计方法论、功能特性、可运维、易用性上进行全面的升级,在前瞻性和扩展性上下足功夫,满足公司未来5-10年内的各种同步需求

应用现状

datalink从2016年12月开始立项,第一版于2017年5月份上线,在神州优车集团内部服役到现在,基本上满足了公司所有业务线的同步需求,目前内部的同步规模大体如下

  1. 日均数据同步量800g+
  2. 涉及272个数据库实例之间的3208个同步映射
  3. 60台worker+2台manager机器的集群规模

架构简介

增量数据同步中间件DataLink分享(已开源)

datalink是典型管理系统架构,manager(web管理)+worker(工作节点):
 a. manager负责worker的负载均衡、集群的配置管理和系统监控
 b. worker核心功能是管理task的生命周期,并配合manager进行re-balance
下面对datalink架构模型重点模块做概要介绍:

manager

  • manager是整个datalink集群的大脑
  • manager有三个核心功能
  1. 担任整个集群的负载均衡协调器:当集群出现状态变更时,第一时间进行re-balance
  2. 负责整个集群的配置管理:提供管理后台,配置发生变更时进行事件通知、缓存刷新等操作,保证系统能够获取到最新的变更
  3. 监控整个集群的健康状况,主要有:同步是否出现延迟、同步是否出现异常、数据同步tps、数据同步吞吐量、机器健康状况检查等等

group

  • 分组是datalink的一个核心概念,worker和task在运行之前必须先知道自己属于哪个分组
  • 分组的目的是:实现组内自治、组间隔离,不同分组会有不同的参数配置、运行策略、高可用级别等等

worker

  • worker必须归属于某个分组
  • worker的核心功能是管理task的生命周期,并配合manager进行re-balance
  • worker运行哪些task受manager的分配

task

  • task的核心功能是进行数据同步
  • 一个task由一个taskreader和多个taskwriter组成,reader和writer使用独立的classloader
  • task必须归属于某个分组

(re-)balance

  • (re-)balance的定义:通过一定的负载均衡策略,使task在worker节点上均衡的分布
  • (re-)balance的单位是group,一个分组发生(re-)balance不会影响其它分组的正常运行
  • 发生(re-)balance的时机
  1. manager发生主备切换
  2. 新的worker加入分组
  3. 某个worker离开分组
  4. 新增task
  5. 删除task

plugin

  • 插件模型最大的意义在于解耦和复用,只需要提供一套基础框架,开发一系列同步插件,通过配置组合便可以支持"无限多"的同步场景
  • 插件划分为两种:reader插件和writer插件,插件之间通过task串联起来
  • task运行时,每个插件都有自己独立的classloader,保证插件之间的jar包隔离

mysql

  • datalink的运行需要依赖各种配置信息,这些配置信息统一保存到mysql中
  • datalink在运行过程中会动态产生监控和统计数据,这些数据也统一保存到mysql中
  • 存储的配置信息主要有: 同步任务信息、工作节点信息、分组信息、数据源配置信息、映射规则信息、监控信息、角色权限信息等

zookeeper

  • manager的高可用需要依赖于zookeeper,通过抢占和监听"/datalink/managers/active"节点,实现秒级switch
    注:worker的高可用并不依赖zookeeper,只要manager能够保证高可用,worker就是高可用的
  • task会将运行时信息注册到zookeeper,注册信息主要有两类
  1. task的状态信息(运行、暂停还是出错),通过状态信息可以监控task的健康状况
  2. task的position信息,通过postion信息可以查看当前的同步进度,也可以实现故障恢复

netty&jetty

  • manager使用netty提供tcp服务,用来监听worker端发送的coordinator信息(注:netty只用来做高可用和负载均衡)
  • manager使用jetty提供http服务,主要用来提供web管理功能和接收worker发送的监控和统计数据
  • worker使用jetty提供http服务,主要用来接收manager发送的管理指令

kafka-client

  • datalink套用了kafka的(re-)balance协议
  • 在worker端和manager端分别定义了各自的coordinate模块,这些模块都需要依赖kafka的client包

同步模型

增量数据同步中间件DataLink分享(已开源)

增量数据同步中间件DataLink分享(已开源)

插件体系

  • 插件体系一般由两部分组成:framework+plugin,datalink中的framework主要指【taskruntime】,plugin对应的是各种类型的【taskreader&taskwriter】

taskruntime

  • 提供了task的高层抽象、task的运行时环境和task的插件规范

taskreader&taskwriter

  • 一个个具体的数据同步插件,遵从task插件规范,功能自治,和taskruntime完全解耦,理论上插件数量可无限扩充

task

  • datalink中数据同步的基本单位是task,一个worker进程中可以运行一批task,一个运行中的task由一个taskreader和至少一个taskwriter组成,即有:

  • 程序运行期,同一类型的插件在一个进程中可以有多个实例,实例个数取决于有多少个task用到了该插件

  • 程序运行期,插件的生命周期归属于task,在不同的生命周期阶段,依照task的配置信息或相关指令,进行创建、初始化、运行或销毁等操作

  • 理论上,taskreader和taskwriter可动态任意组合(能否组合,主要取决于待组合的taskwriter能否适配taskreader的record类型)

  • 理论上,每新增一种插件,可支持的同步场景可以成倍数的增加(具体几倍,和插件类型和当前已有的插件数量有关系),新增一个taskreader,可新增的同步场景数量取决于已有taskwriter的数量,反之亦然

  • 目前,datalink的taskreader支持的类型有mysql, flexibleq, hbase,taskwriter支持的类型有rdbms、elasticsearch、hdfs、hbase、flexibleq、sddl

classloader

  • datalink-worker进程中,每个类型的插件,都有自己独立的classloader和classpath。
    原因很简单:class版本隔离的需要,datalink中,可以开发任意多个插件,出现jar包冲突很正常,必须通过classloader隔离这些冲突。

contract

  • contract是针对某种类型的数据源定义的【数据模型】,是一份契约和规范,是最高层次的抽象,和编程语言无关,和具体平台无关,和datalink也没有必然关系
  • contract是taskreader和taskwriter可任意组合的关键,taskreader输出contract数据,taskwriter输入contract数据,互不感知,但都理解contract定义的【数据模型】
  • contract定义的【数据模型】的主要表现形式是record,如:rdbeventrecord,hrecord

adapt

  • taskreader:
    负责输出contract数据,适配模式很简单,一对一,直接把底层数据组装成对应的record即可,如:mysqltaskreader对应rdbeventrecord

  • taskwriter:
    负责输入contract数据,并写入目标数据源。taskwriter可以接收不同类型的【数据模型】,内部由不同的handler把不同【数据模型】的数据写入目标数据源

应用场景

datalink可以支撑的常见应用场景有:

  • resharding
  • bigdata
  • cqrs
  • eda
  • searchbuild
  • 基础参数共享
  • 实时归档
  • 数据镜像
  • 数据库的迁库、拆库、合库以及灾备等等

具体介绍可参见git文档:https://github.com/ucargroup/datalink/wiki/1.9_%e6%b7%b1%e5%85%a5%e5%9c%ba%e6%99%af

项目未来

datalink项目借鉴了很多开源产品的思想,这里要重点感谢的产品有:canal,otter,datax,yugong,databus,kafka-connect,ersatz
站在巨人的肩膀上,我们进行了开源,一方面回馈社区,一方面抛砖引玉
展望未来,我们希望这个项目能够活跃起来,为社区做出更大的贡献,内部的各种新特性也会尽快同步到开源版本,同时也希望有更多的人参与进来
目前内部正在规划中的功能有:

  • 双机房(中心)同步
  • 通用审计功能
  • 各种同步工具

问题反馈

目前有关datalink的问题交流方式有如下几种,欢迎各位加入进行技术讨论。

    1. qq交流群: 758937055
    2. 邮件交流: 
    3. 报告issue:issues

增量数据同步中间件DataLink分享(已开源)