Data-Sync介绍

Data-Sync是原DataX的重构版本,目的是为了解决原DataX使用上的一些痛点。由于设计Data-Sync是就考虑了从DataX迁移的问题,目前Data-Sync完全兼容原DataX的配置文件,所以从DataX迁移到Data-Sync几乎没有迁移成本,另外既然Data-Sync完全兼容原DataX所以本文档的配置说明也完全适用于DataX。

Data-Sync的目标是为了解决了DataX使用上的以下痛点:

  • 配置项繁杂,没有详细的说明文档
  • 开发、调试同步方案难度高
  • 定位线上同步问题难度大

除此之外Data-Sync还做了以下优化:

  • 优化代码解构,提高代码可读性
  • 完善同步任务的状态,优化同步任务的重试逻辑
  • 优化同步任务的线程模型
  • 提供较为完善的管理控制台UI页面

核心概念

数据同步其实是个特别简单得事情,就是把一个数据库的数据同步到另一个数据库。但这其中就涉及到一些概念性东西,主要包括数据源Sql资源同步方案同步任务,这里做简单的说明。

数据源Sql资源是全局共享的,即他们的作用域是全局的,在任何一个配置文件里都可以引用这两种资源。

数据源

数据源就是对数据库的抽象,一个数据源对应一个特定的数据库。目前支持4种数据源详细说明如下:

  • jdbc数据源:传统关系型数据库,如:MySQL、Oracle

  • rabbitmq数据源:特指 RabbitMQ 消息队列

  • kafka数据源:特指 Kafka 消息队列

  • service数据源:这个有点特殊,指的是一个Http服务器(把Http接口看做一个数据源,通过Http接口读写数据)。可以是一个业务上的Http服务,如b2b服务端;也可以是某些通过http协议提供服务的数据库,如elasticsearch。

  • hermes数据源:这又是一个特殊的数据源,这个数据源不能直接配置,它只能配置在jdbc数据源下(就是jdbc数据源的一个配置项)。hermes数据源本质上就是一个 RabbitMQ 消息队列,它表示对应jdbc数据源的增量数据源。

注:暂不支持Redis数据源,如果后面需求多可以考虑支持。

Sql资源

sql资源就是一些sql脚本片段,主要提供给同步方案使用。在整个同步过程中使用这些sql来封装读取数据、更新数据的逻辑。同步任务的执行流程是固定的,可扩展性较差(相对于写代码),所以针对不同的业务场景的同步业务逻辑有相当一部分是通过sql脚本来实现的,我们需要利用sql脚本的扩展性来完成业务的同步逻辑。

同步任务

同步任务是一个同步逻辑的最小单元,包含数据同步的完整过程。目前同步任务分为两种:增量同步全量同步,每个同步任务都包含两个核心逻辑:提取数据更新数据。下面进行详细的说明。

核心同步流程

  1. 提取数据(extract):通过extract配置从源数据库读取需要同步的数据。

  2. 更新数据(load):通过load配置把读取到的源数据同步到目标数据库。

注意:

  • 一个同步任务有且只有一个extract配置

  • 一个同步任务至少有一个load配置,可以有多个

  • 这里只简单的介绍一下同步任务的逻辑,实际上提取数据更新数据两个步骤相当复杂,在后面的配置文件说明文档里会细说。

同步任务类型

  • 全量同步(jdbc):全量同步的逻辑比较简单:通过SQL脚本从数据库查询数据,然后同步到目标数据库。每次同步都是同步SQL脚本查询结果的全量数据,所以全量同步任务在数据同步完成之后就会停止。

  • 增量同步(hermes):增量同步是通过监听数据库的数据变化,把变化的数据(包含新增、删除、修改的数据)同步到目标数据源。一旦增量同步任务启动后就不会主动停止,因为源数据库可能一直都会有数据变化,没有明确的停止条件。

提示: 无论是全量同步还是增量同步,目前它们的源数据库都是特定的数据库,并不是所有的数据库都能支持。

  • 全量同步: 源数据库只支持jdbc数据源

  • 增量同步: 源数据库只支持hermes数据源,其实逻辑上还是jdbc数据源。前面已经说了hermes数据源就是对应jdbc数据源的增量数据源。

同步方案

同步方案的本质就是同步任务的集合,一个同步方案包含了多个同步任务。原则上一个同步方案是对一个完整的同步业务逻辑的封装,尽量把在业务上有关联的同步任务放到同一个同步方案中,方便管理和维护。

提示: 通方案的配置应该满足以下几点

  • 一个同步方案至少有一个extract配置(保证至少有一个同步任务)
  • 一个同步方案至少有一个load配置
  • 一个同步方案最多只能有一个全量任务
  • 一个同步方案不允许有相同的extract配置

配置相关说明

Data-Sync使用配置文件来定义和描述同步任务,在这里对我们对核心配置做简单的介绍,好让你有一个全局的认识。在后续的文档中我们会详细的描述每个配置项的具体用途和功能。

配置结构说明

在讲解核心配置项之前我们先来看一个完整的Data-Sync配置文件(yaml配置文件),如下:

# 数据源配置
datasource:
  jdbc:
    jdbc-data-01:
      xxx: xxx
    jdbc-data-02:
      xxx: xxx
  rabbitmq:
    rabbitmq-data-01:
      xxx: xxx
    rabbitmq-data-02:
      xxx: xxx
  service:
    service-data-01:
      xxx: xxx
    service-data-02:
      xxx: xxx
  kafka:
    kafka-data-01:
      xxx: xxx
    kafka-data-02:
      xxx: xxx

# Sql资源配置
repo:
  sql:
    sql-script-01:
     xxx: xxx
    sql-script-02:
     xxx: xxx

# 同步方案配置
scheme:
  scheme-01:
    xxx: xxx
  scheme-02:
    xxx: xxx

# 同步方案模板配置
template:
  template-01:
    xxx: xxx
  template-02:
    xxx: xxx

在上面的配置文件中我们定义了以下内容:

  • 数据源配置(datasource)

    • 两个jdbc数据源,名字为:jdbc-data-01、jdbc-data-02

    • 两个rabbitmq数据源,名字为:rabbitmq-data-01、rabbitmq-data-02

    • 两个kafka数据源,名字为:kafka-data-01、kafka-data-02

    • 两个service数据源,名字为:service-data-01、service-data-02

  • Sql资源配置(repo.sql):两个sql脚本,sql-script-01 和 sql-script-02

  • 同步方案配置(scheme):配置了两个同步方案,scheme-01 和 scheme-02

  • 同步方案模板配置(template):配置了两个同步方案模板,template-01 和 template-02

提示: 配置中“数据源”、“Sql资源”、“同步方案模板”等资源的名字最好使用一个有意义的名字(如同代码中的变量命名一样),资源名字的作用就是给有需要的地方引用,所以同一种资源的名字要保证全局唯一

数据源配置

用于定义全局使用的数据源,可以定义多个,引用时使用{type}@{datasource-name}方式,例如:jdbc@jdbc-data-01rabbitmq@rabbitmq-data-01hermes@jdbc-data-02。配置格式如下:

datasource:
  {jdbc|rabbitmq|kafka|service}:
    {datasource-name}:
      {key}: {value}

Sql资源配置

用于定义全局使用的Sql资源,可以定义多个,引用时使用sql@{sql-script-name}方式,例如:sql@sql-script-01sql@sql-script-02。配置格式如下:

repo:
  sql:
    {sql-script-name}:
      {key}: {value}

同步方案配置

定义同步任务逻辑,可能需要引用数据源Sql资源同步方案模板等全局资源,同步方案的配置项比较复杂,这里只列出主要配置的结构:

scheme:
  {scheme-name}:
    {key}: {value}
    extract:
      - type: {jdbc|hermes}
        {key}: {value}
      - type: {jdbc|hermes}
        {key}: {value}
      - type: {jdbc|hermes}
        {key}: {value}
    load:
      - type: {jdbc|kafka|rabbitmq|service}
        {key}: {value}
      - type: {jdbc|kafka|rabbitmq|service}
        {key}: {value}
      - type: {jdbc|kafka|rabbitmq|service}
        {key}: {value}

提示: 一个同步方案主要定义多个extract(数据提取规则)和多个load(数据更新规则),每个extract和当前同步方案中所有的load组合在一起成为一个同步任务的全部配置。所以一个同步方案中有多少个extract配置,就会生成多少个同步任务,而这些同步任务都包含当前同步方案的所有load配置(换言之就会执行当前同步方案中所有的load配置逻辑)。

同步方案模板配置

由于同步方案的配置项较多、配置复杂,当我们遇到两个同步方案的配置基本一致就只有引用的数据源Sql资源同步方案模板等全局资源不相同时,我们就可以使用同步方案模板,定义一个同步方案模板把不同配置的地方变量化,使用同步方案模板时通过给变量传不同的值来达到同步配置共用的目的,减少配置文件。

同步方案模板的使用有点类似我们开发前端html页面时的模板引擎,灵活的运用同步方案模板配置可以降低开发同步方案的难度、减少同步方案的配置等好处。另外同步方案模板的配置结构和同步方案的配置结构一样(本质上就是定义一个模板字符串),其基本结构如下:

template:
  {template-name}:
    {key}: {value}

配置文件目录结构

目前配置能够支持从多个文件加载之后再合并,所以我们一般不会把所有的配置都写在同一个文件中,这样不方便管理。为了统一管理配置文件,我们建议使用以下规则来组织配置文件结构:

RootFolder
│
├── DataSource.yml          # 定义全局数据源
│
├── biz-module-a            # 同步业务模块文件夹
│   │
│   ├── xxxRepo.yml         # 定义当前模块SQL资源
│   └── xxxScheme.yml       # 定义当前模块同步方案
│
├── biz-module-b            # 同步业务模块文件夹
│   │
│   ├── xxxRepo.yml         # 定义当前模块SQL资源
│   └── xxxScheme.yml       # 定义当前模块同步方案
│
└── node.yml                # 用来定义需要导入的配置文件(imports)
  • 数据源的配置使用全局的DataSource.yml配置文件
  • 一个同步业务使用一个文件夹来配置同步方案
  • SQL资源配置都写在对应模块的xxxRepo.yml文件中
  • 同步方案配置都写在对应模块的xxxScheme.yml文件中
  • 全局的node.yml配置文件用来导入需要使用的配置文件
文档更新时间: 2020-03-13 16:45   作者:lizw