一, cdp 同步基本原理
数据集成 (Data Integration) 是阿里巴巴集团提供的数据同步平台. 该平台具备可跨异构数据存储系统, 可靠, 安全, 低成本, 可弹性扩展等特点, 可为 20 多种数据源提供不同网络环境下的离线 (全量 / 增量) 数据进出通道. 数据源类型的详情请参见 支持数据源类型.
数据集成的原理:
数据集成在阿里云上提供一套分布式离线数据同步平台, 同时提供一套抽象化的数据抽取插件(称之为 Reader), 数据写入插件(称之为 Writer), 并基于此框架设计一套简化版的中间数据传输格式, 从而达到任意结构化, 半结构化数据源之间数据传输之目的. 从用户角度来看, 一个数据集成同步任务运行 Job 示意图如下所示:
上述中, 红色虚箭头是代表通过 collector 状态收集器监控数据返回到脏数据管理服务器进行数据分析, 灰色方向箭头代表数据流向. DI Service 主要是包含资源管理器, Job 管理器, 脏数据管理器, 分布式服务, 鉴权服务等. Job Container 主要是将数据集成运行任务分成若干个 task, 然后通过 scheduler 调度管理. TaskGroup Container 主要是数据抽取通过数据通道 (channel) 将数据写入.
使用数据集成 Job 启动 API, 向数据集成服务端发起调用, 提交一个离线数据同步 Job.
数据集成收到 Job API 请求后, 将负责做必要的安全和权限校验, 待校验通过后, 数据集成会下发相应的 Job 到执行集群节点启动离线数据同步任务.
Job 启动后, 根据您提供的源端 (Reader), 目的端(Writer) 的配置信息, 加载并初始化相关插件, 连接两端数据源, 开始数据同步工作.
Job 运行过程中, 将随心跳向数据集成汇报当前进度, 速度, 数据量等关键运行指标, 可根据 Job 的状态 API 实时获取该 Job 运行状态, 直至 Job 运行结束(成功或者失败).
流程概述
步骤 1: 数据源端新建表.
步骤 2: 新增数据源.
步骤 3: 向导模式或脚本模式配置同步任务.
步骤 4: 运行同步任务, 检查目标端的数据质量.
因为 DRDS 不支持存储过程, 造一张实际生产的表有些复杂, 所以采用通过 RDS 创建表数据, 再导入到 DRDS 的方式
二, 测试表准备:
通过 RDS 新建一张实际生产的表, 数据量为一亿行左右(主键为自增)
通过存储结构插入数据(业务只需要天数是随机的):
- delimiter
- dropprocedurehuayu2;CREATEPROCEDUREhuayu2()begindeclarevarint;setvar=0;whilevar<100000000doinsertintotpcsbillrecievehuayutestselectnull,1234567,210025002110010114117029000016,0,null,0,null,null,null,0,0,null,null,0,null,null,null,21100101,null,null,null,null,null,null,null,21002500,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,CONCAT(2018,,03,,LPAD(FLOOR(1+(RAND()31)),2,0),,14:54:04),null,null,2017111014:54:04,null,null,null,2,4,null,null,null,null,null,0,null,null,null,null,null;setvar=var+1;endwhile;end
- dropprocedurehuayu2;CREATEPROCEDUREhuayu2()begindeclarevarint;setvar=0;whilevar<100000000doinsertintotpcsbillrecievehuayutestselectnull,1234567,210025002110010114117029000016,0,null,0,null,null,null,0,0,null,null,0,null,null,null,21100101,null,null,null,null,null,null,null,21002500,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,CONCAT(2018,,03,,LPAD(FLOOR(1+(RAND()31)),2,0),,14:54:04),null,null,2017111014:54:04,null,null,null,2,4,null,null,null,null,null,0,null,null,null,null,null;setvar=var+1;endwhile;end
- delimiter
三, 测试要求
通过 mysqldump 在 DRDS 新建导入的表, 以天为分表键, 分表键的值是随机分布在 3 月 1 日 - 3 月 31 日的.
将源表按分表键做拆分, 1 天拆成 1 个任务, 并发向目标表里进行同步, 同时目标表按天做分区, 找到最佳并发量.
注意: 分库键的选择为自增主键, 不能是固定, 否则 hash 的时候只落在一个库里面, 分表键也是随机的日期, 这样数据就能均衡的分布在各个库里面
四, 具体实施步骤
1, 将 RDS 的表导入到测试环境 DRDS
mysqldump -urds_xncs_qps8 -p -P3306 -h 10.1.1.1 database test1 -t> /home/hy.sql
这里加上了 - t 参数, 目的是不备份表的结构, 这样做的好处是, 导入到 DRDS 的时候, 在 DRDS 端建一个相同名字的数据库, 并且可以自定义分库分表键, 这样就省略了再次去修改备份的. sql 文件而达到分库分表的目的. 当然, 如果只是需要一个单表, 那就复制表结构跟数据就好了
2, 将复制的表数据导入到 DRDS
2.1, 通过 mysql -udrds_uat_pcs -P3306 -h10.3.3.3 drds_uat_pcs -p < /home/hy.slq
2.2, 进入到目标表所在的数据库, 执行 source /home/hy.sql
这两种方式大同小异, 第一种稍微快些, 第二种会有过程在屏幕上展示. 习惯用第二种
在刚开始导入的时候会一些报错, 但是对实际的导入不会影响
3, 具体测试
数据量:
mysql> select count(*) from t_pcs_bill_recieve_huayutest ; |
---|
count(*) |
78322075 |
1, 一个工作流, 分十个同步任务执行,
每个同步任务 where 条件对应 3 天, 每一个同步任务对应一个分区, 共 10 个分区
最大速率上线 10M/s,
结构图:
各个任务耗时:
1,========================================================================
任务启动时刻 : 2018-03-28 11:47:15 任务结束时刻 : 2018-03-28 11:57:28 任务总计耗时 : 612s 任务平均流量 : 1.69MB/s 记录写入速度 : 20753rec/s 读出记录总数 : 12638734 读写失败总数 : 0
2,========================================================================
任务启动时刻 : 2018-03-28 11:47:15 任务结束时刻 : 2018-03-28 11:56:18 任务总计耗时 : 543s 任务平均流量 : 1.14MB/s 记录写入速度 : 14038rec/s 读出记录总数 : 7580943 读写失败总数 : 0
3,========================================================================
任务启动时刻 : 2018-03-28 11:47:17 任务结束时刻 : 2018-03-28 11:56:23 任务总计耗时 : 545s 任务平均流量 : 1.14MB/s 记录写入速度 : 14004rec/s 读出记录总数 : 7576202 读写失败总数 : 0
4,========================================================================
任务启动时刻 : 2018-03-28 11:47:17 任务结束时刻 : 2018-03-28 11:56:26 任务总计耗时 : 548s 任务平均流量 : 1.13MB/s 记录写入速度 : 13933rec/s 读出记录总数 : 7579645 读写失败总数 : 0
5,========================================================================
任务启动时刻 : 2018-03-28 11:47:10 任务结束时刻 : 2018-03-28 11:56:17 任务总计耗时 : 546s 任务平均流量 : 1.14MB/s 记录写入速度 : 13979rec/s 读出记录总数 : 7576799 读写失败总数 : 0
6,========================================================================
任务启动时刻 : 2018-03-28 11:47:15 任务结束时刻 : 2018-03-28 11:56:28 任务总计耗时 : 553s 任务平均流量 : 1.12MB/s 记录写入速度 : 13774rec/s 读出记录总数 : 7575981 读写失败总数 : 0
7,========================================================================
任务启动时刻 : 2018-03-28 11:47:17 任务结束时刻 : 2018-03-28 11:56:18 任务总计耗时 : 541s 任务平均流量 : 1.15MB/s 记录写入速度 : 14115rec/s 读出记录总数 : 7579924 读写失败总数 : 0
8,========================================================================
任务启动时刻 : 2018-03-28 11:47:17 任务结束时刻 : 2018-03-28 11:56:18 任务总计耗时 : 541s 任务平均流量 : 1.15MB/s 记录写入速度 : 14115rec/s 读出记录总数 : 7579924 读写失败总数 : 0
9,========================================================================
任务启动时刻 : 2018-03-28 11:47:15 任务结束时刻 : 2018-03-28 11:56:27 任务总计耗时 : 551s 任务平均流量 : 1.13MB/s 记录写入速度 : 13856rec/s 读出记录总数 : 7579604 读写失败总数 : 0
10,========================================================================
任务启动时刻 : 2018-03-28 11:47:17 任务结束时刻 : 2018-03-28 11:55:20 任务总计耗时 : 482s 任务平均流量 : 877.38KB/s 记录写入速度 : 10522rec/s 读出记录总数 : 5050713 读写失败总数 : 0
整体耗时: 630 秒
![image](https://yqfile.alicdn.com/8d8f3acb4098f6860aa698d56277bcdbf9c4f975.png)
2, 一个工作流, 分五个同步任务执行,
每个同步任务 where 条件对应 6 天, 每一个同步任务对应一个分区, 共 5 个分区
最大速率上线 10M/s,
结构图:
任务同步耗时:
1,========================================================================
任务启动时刻 : 2018-03-28 14:27:49 任务结束时刻 : 2018-03-28 14:37:42 任务总计耗时 : 593s 任务平均流量 : 2.09MB/s 记录写入速度 : 25605rec/s 读出记录总数 : 15158472 读写失败总数 : 0
2,========================================================================
任务启动时刻 : 2018-03-28 14:27:53 任务结束时刻 : 2018-03-28 14:37:36 任务总计耗时 : 583s 任务平均流量 : 2.12MB/s 记录写入速度 : 26093rec/s 读出记录总数 : 15160230 读写失败总数 : 0
3,========================================================================
任务启动时刻 : 2018-03-28 14:27:43 任务结束时刻 : 2018-03-28 14:37:33 任务总计耗时 : 589s 任务平均流量 : 2.10MB/s 记录写入速度 : 25775rec/s 读出记录总数 : 15156082 读写失败总数 : 0
4,========================================================================
任务启动时刻 : 2018-03-28 14:27:45 任务结束时刻 : 2018-03-28 14:37:36 任务总计耗时 : 591s 任务平均流量 : 2.10MB/s 记录写入速度 : 25729rec/s 读出记录总数 : 15154873 读写失败总数 : 0
5,========================================================================
任务启动时刻 : 2018-03-28 14:27:43 任务结束时刻 : 2018-03-28 14:38:01 任务总计耗时 : 617s 任务平均流量 : 2.34MB/s 记录写入速度 : 28768rec/s 读出记录总数 : 17692418 读写失败总数 : 0
整体耗时: 629 秒
3, 一个工作流, 分十五个同步任务执行,
每个同步任务 where 条件对应 2 天, 每一个同步任务对应一个分区, 共 15 个分区
最大速率上线 10M/s,
结构图:
![image](https://yqfile.alicdn.com/068c1c56b16baa1c3cc270eb286f7d46ff1a8990.png)
总体耗时: 623 秒
4, 一个工作流, 分一个同步任务执行
最大速率上线 10M/s,
结构图:
同步任务耗时:
任务启动时刻 : 2018-03-28 15:42:05 任务结束时刻 : 2018-03-28 15:57:16 任务总计耗时 : 910s 任务平均流量 : 7.02MB/s 记录写入速度 : 86257rec/s 读出记录总数 : 78322075 读写失败总数 : 0
总耗时: 928 秒
5, 一个工作流, 分三个同步任务执行
最大速率上线 10M/s,
结构图:
总耗时: 699 秒
6, 一个工作流, 分四个同步任务执行
最大速率上线 10M/s,
结构图:
总耗时: 672 秒
测试结果:
并发数 10 5 15 1 3 4
总耗时 630 秒 629 秒 623 秒 928 秒 699 秒 672 秒
并发数 1 3 4 5 10 15
总耗时 928 秒 699 秒 672 秒 629 秒 630 秒 623 秒
初步结论:
在并发为 5,10,15 的情况下, 同步数据的速率基本没有变化 630 秒左右, 在并发为 1,2,3,4 的情况下, 速率由 930 秒提升到 630 秒左右, 从而可以得出结论, 在并发为 5 的情况下, 同步速率已经达到最大, 再增加并发对于速率的增加效果不明显.
转自袋鼠云
来源: https://yq.aliyun.com/articles/581612