利用OTTER实现准实时ETL、数据同步

一:背景
目前公司已有的IT系统中,各系统中的数据往往都各自存储,各自定义。每个系统的数据同公司内部的其他数据进行连接互动时,难度很大,无形中加大了跨系统数据合作的沟通成本。为解决这一问题,需要引入一个基础中间件,可以灵活提取源数据库增量信息,按业务需求灵活整合目标表信息,从而使业务系统在本地库实时、准确地访问到其需要的全面业务数据。
二:简介
OTTER是阿里巴巴公司为了解决杭州/美国机房数据间同步研发的一个开源软件。OTTER基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库,是一个分布式数据库同步系统。

工作原理图:

concept_jpeg

原理描述:

基于Canal开源产品,获取数据库增量日志数据。

典型管理系统架构,manager(web管理)+node(工作节点)

manager运行时推送同步配置到node节点
node节点将同步状态反馈到manager上

基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.具体请参考:https://github.com/alibaba/otter/wiki

三:安装
3.1 需要软件
需要MYSQL5.x,manager,node,ZOOKEEPER
3.2 安装步骤
otter的manager、node和ZOOKEEPER均部署在192.168.155.57,otter自身的配置库放在57的MYSQL上
1,安装配置库
用MYSQL命令连接上57后,在提示符下键入 source otter-manager-schema.sql,成功后会建立名为otter的数据库和对应表。
2,安装zookeeper(略)
3,依次安装manager,node(略,详情可参考:https://github.com/alibaba/otter/wiki/QuickStart)
4,验证,输入 http://192.168.155.57:8080/login.htm,输入用户名/密码(admin/admin)登陆后,录入ZK集群信息:
NEW_ZK

四:实战
4.1 表级映射
源表:192.168.155.57上的sbtest1
目标表:192.168.155.60上的sbtest1_1
表差异:无
1)添加数据库
添加源库(57),如图:
NewDataSource

完后后点击 ‘验证连接数据源’,提示‘恭喜,数据库通过验证’,标志源数据库添加成功
添加目标库(60),如图:
NewDestDataSource
同上
2)添加CANAL(监听57DB BINLOG变化)
57Canal

3)添加表
源表:
57_sbtest1

SCHEMA NAME表示对应DB名称,点击’查找数据源‘选择对应的数据库后,再点击’验证连接表‘、’查询Schema&Test’验证表是否配置成功
L(注意:源表上必须要有PRIMARY KEY!否则OTTER无法正确同步,)
目标表:
60_sbtest1_1

4)添加CHANNEL
57_60CHN

同步一致性选择‘基于当前日志查询’效率较高,‘基于数据库反查’会按PK去源表查询效率较低;
同步模式建议选择列记录模式;

 列模式修改哪些字段就映射更新那些字段,如果目标库不存在该记录且本次操作类型为‘修改’,OTTER会忽略本次更新;
 行记录模式会更新所有映射字段,如果目标库不存在该记录且本次操作类型为‘修改’,OTTER会在目标库执行新增;

是否开启数据一致性:选‘否’,公司数据架构设计不考虑数据多主模式。
5)添加PIPE
57_60PIPE

需要选择SELECT/LOAD机器节点;然后选择一个CANAL(注意:一个CANAL只能和一个CHANNEL关联!)
6)添加映射规则
1to1_1

选择好源表,目标表后,点解‘保存’即可,至此,整个配置过程完成。
7)在CHANNEL管理页面启动
StartChn57

8)测试
在57上执行修改语句:
57_sbtest1_mod

然后在60上执行SELECT语句验证结果
60_sbtest1_1_res

测试通过;

4.2 源表覆盖目标表
源表:192.168.155.57上的sbtest2
目标表:192.168.155.60上的sbtest1_small
表差异:源表笔比目标表多字段
1)添加表
2)在对应的CHANNEL->PIPE上添加映射规则
先配置源表、目标表,然后点击‘下一步’,页面上会显示源表,目标表的字段列表信息
origin_2_small

然后按映射规则拖动对应字段,完后后点’保存‘
2_small

至此,整个配置过程完成。
3)在CHANNEL管理页面启动(略)
4)测试(略)
4.3 源表是目标表一部分
源表:192.168.155.57上的sbtest3
目标表:192.168.155.60上的sbtest3_3
表差异:源表笔比目标表少字段
1)添加表
2)在对应的CHANNEL->PIPE上添加映射规则
3)启动,测试
4.4 多张源表(同实例)覆盖一张目标表
源表:192.168.155.57上的sbtest4/sbtest5
目标表:192.168.155.60上的sbtest45_3
表差异:2源表合并成一张目标表
1)添加表
2)在对应的CHANNEL->PIPE上添加映射规则
3)启动,测试
4.5 多张源表(不同实例)覆盖一张目标表
源表1:192.168.155.57上的sbtest6
源表2:192.168.155.59上的sbtest7
目标表:192.168.155.60上的sbtest67_3
表差异:2源表合并成一张目标表
1)添加新数据源(192.168.155.59)
2)添加表
3)添加CANALE,监听192.168.155.59的BINLOG变化
4)添加新的CHANEL,对应59->60的数据映射
5)在4)生成的CHANNLE中配置新的PIPE
6)在新PIPE中定义映射规则(sbtest7->sbtest67_3)
7)启动,测试
4.6 一张源表覆盖多张目标表(同实例)
源表1:192.168.155.57上的sbtest8
目标表1:192.168.155.60上的sbtest1_from8
目标表2:192.168.155.60上的sbtest2_from8
表差异:1源表拆分成2张目标表
1)添加CANAL,监听192.168.155.57的BINLOG变化
2)添加新的CHANEL,对应sbtest8->sbtest2_from8的数据映射
3)在2)生成的CHANNLE中配置新的PIPE
4)在新PIPE中定义映射规则(sbtest8->sbtest2_from8)
5)启动,测试
4.7 一张源表覆盖多张目标表(不同实例)
源表1:192.168.155.57上的sbtest9
目标表1:192.168.155.59上的sbtest1_from9
目标表2:192.168.155.60上的sbtest2_from9
表差异:1源表拆分成2张目标表
1)添加新的CHANEL,对应57->59的数据映射
3)在2)生成的CHANNLE中配置新的PIPE
4)在新PIPE中定义映射规则(sbtest9->sbtest2_from9)
5)启动,测试
4.8 自定义同步
源表1:192.168.155.57上的sbtest10
目标表:192.168.155.60上的sbtest_misc
目标表2:192.168.155.60上的sbtest2_from8
表差异:目标表比源表多一个CHAR(60)字段,名称叫misc,每次数据发生变化时,固定填入默认值
1)编码,扩展EventProcessor(可参考otter WIKI上例子:https://github.com/alibaba/otter/wiki/Otter%E6%89%A9%E5%B1%95%E6%80%A7
核心代码如下:

    EventColumn misc = new EventColumn();
    misc.setColumnValue("CJN");
    misc.setColumnType(Types.CHAR);
    misc.setColumnName("misc");
    List<EventColumn> cols = eventData.getColumns();
    cols.add(misc);
    eventData.setColumns(cols);

2)配置映射规则
UDF_mapping

选择’clazz’后,在‘EventProcessor文本’填入对应类名,然后将JAR包上传到node/lib下,即可;至此,整个OTTER的功能介绍完毕

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注