场景:配置分库分表离线同步任务

DataWorks支持通过向导模式或脚本模式配置离线同步任务,您可以将分库分表数据同步至目标单表。本文以同步MySQL分库分表数据为例进行说明。

前提条件

已准备好要同步的多个数据源,详情请参见支持的数据源与读写插件

背景信息

您可以使用如下几种方式实现分库分表离线同步任务,不同方式间差异对比如下:

差异项

分库分表数据源+向导模式(推荐)

普通数据源+向导模式

脚本模式

是否支持向导模式

是否支持按规则配置表名

支持正则表达式配置源表名,运行时根据正则搜索匹配表同步。

不支持。

支持数字范围配置表名,例如:tb_[1-10]。要求连续且每个子表存在。

是否要求表结构一致

可以配置“字段缺失策略”,允许部分表缺失字段,作为NULL值往下输出。

要求表结构一致。

字段映射参考

分库分表数据源中的Meta数据源第一张匹配表。

第一个数据源的第一张表。

脚本模式手写。

支持的数据源数量

分库分表数据源支持引用最大5000个数据源。

建议单节点配置数据源在50个以内。

增加数据源是否需要修改、发布节点

无需修改节点,修改数据源后,新运行的实例生效。

需要修改任务,增加数据源,配置该数据源的表名。

支持的数据源类型

MySQL、PolarDB

MySQL、PolarDB、AnalyticDB

MySQL、PolarDB、AnalyticDB、SQLServer、Oracle、PostgreSQL、DM、DB2、Oracle

分库分表数据源+向导模式

  1. 进入数据集成页面。

    登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据开发与治理 > 数据集成,在下拉框中选择对应工作空间后单击进入数据集成

  2. 在左侧导航栏单击数据源,然后单击新增数据源,选择数据源类型,当前此方式支持MySQL和PolarDB。

  3. 将每个分库创建为普通数据源。本文以MySQL为例,详细步骤请参见创建数据集成数据源

    image

  4. 创建分库分表数据源,将多个普通数据源合并为一个数据源,作为数据同步的数据来源。

    1. 单击新增数据源,选择分库分表image

    2. 按需选择分库分表数据源类型,配置相关参数。本文以MySQL(分库分表)为例。

      image

      关键参数说明:

      • 自定义数据源名称

      • 选择数据源:选择已创建的各分库普通数据源。

      • Meta数据源:分库分表同步,所有数据源内的库表结构必须保持一致,请选择其中一个数据源作为默认元数据的模板,供配置同步任务时拉取默认库表结构使用。

        重要

        数据源内的库表结构不一致时,后续同步任务将会执行报错。

  5. 创建离线同步节点

  6. 配置分库分表同步任务。

    向导模式配置分库分表:数据来源选择MySQL(分库分表),然后选择已创建的分库分表数据源。完整的任务配置步骤请参见通过向导模式配置离线同步任务

    说明

    本文以MySQL(分库分表)为例,实际配置时请按需选择。

    image

  7. 单击下一步

  8. 选择需要同步的表,保存发布,完成后续步骤。

    image

普通数据源+向导模式

  1. 将每个分库创建为普通数据源。本文以MySQL为例,详细步骤请参见创建数据集成数据源

    image

  2. 创建离线同步节点

  3. 配置分库分表同步任务。

    向导模式配置分库分表:在数据来源区域单击+编辑数据来源,添加多个数据源。完整的任务配置步骤请参见通过向导模式配置离线同步任务

    image

  4. 将多个普通数据源加入到已选中数据源中,单击确定

    image

  5. 单击下一步

  6. 选择每个数据源中需要同步的表,保存发布,完成后续步骤。

    image

脚本模式

  1. 创建离线同步节点

  2. 配置分库分表同步任务。

    脚本模式配置分库分表:脚本示例如下,完整的任务配置步骤请参见通过脚本模式配置离线同步任务

    重要

    实际运行时,请删除下述代码中的注释。

    {
        "type":"job",
        "version":"2.0",
        "steps":[
            {
                "stepType":"mysql",
                "parameter":{
                    "envType":0,
                    "column":[
                        "id",
                        "name"
                    ],
                    "socketTimeout":3600000,
                    "tableComment":"",
                    "connection":[    //根据分库数配置connection
                        {
                            "datasource":"datasourceName1",  //分库分表的数据源1
                            "table":[           //分库分表的Table列表1
                                "tb1"
                            ]
                        },
                        {
                            "datasource":"datasourceName2", //分库分表的数据源2
                            "table":[          //分库分表的Table列表2
                                "tb2",
                                "tb3"
                            ]
                        }
                    ],
                    "useSpecialSecret":true,//各个数据源使用各自的密码
                    "where":"",
                    "splitPk":"id",
                    "encoding":"UTF-8"
                    },
                "name":"Reader",
                "category":"reader"
                },
            {
                "stepType":"odps",
                "parameter":{
                    "partition":"pt=${bizdate}",
                    "truncate":true,
                    "datasource":"odpsname",
                    "envType":0,
                    "isSupportThreeModel":false,
                    "column":[
                        "id",
                        "name"
                    ],
                    "emptyAsNull":false,
                    "tableComment":"",
                    "table":"t1",
                    "consistencyCommit":false
                    },
                "name":"Writer",
                "category":"writer"
                }
        ],
        "setting":{
            "executeMode":null,
            "errorLimit":{
                "record":""
                },
            "speed":{
                "concurrent":2,
                "throttle":false
                }
        },
        "order":{
            "hops":[
                {
                    "from":"Reader",
                    "to":"Writer"
                    }
            ]
        }
    }