利用OTTER实现准实时ETL

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

原理描述:
1. 基于Canal开源产品,获取数据库增量日志数据。
2. 典型管理系统架构,manager(web管理)+node(工作节点)
    a. manager运行时推送同步配置到node节点
    b. node节点将同步状态反馈到manager上
3. 基于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集群信息:
 
四:实战
4.0 准备工作
4.1 表级映射
源表:192.168.155.57上的sbtest1
目标表:192.168.155.60上的sbtest1_1
表差异:无
1)添加数据库
添加源库(57),如图:

  完后后点击 ‘验证连接数据源’,提示‘恭喜,数据库通过验证’,标志源数据库添加成功
添加目标库(60),如图:
 
同上
2)添加CANAL(监听57DB BINLOG变化)
 
3)添加表
源表:
 
SCHEMA NAME表示对应DB名称,点击’查找数据源‘选择对应的数据库后,再点击’验证连接表‘、’查询Schema&Test'验证表是否配置成功
L (注意:源表上必须要有PRIMARY KEY!否则OTTER无法正确同步,)
目标表:
 
4)添加CHANNEL
 
同步一致性选择‘基于当前日志查询 ’效率较高,‘基于数据库反查’会按PK去源表查询效率较低;
同步模式建议选择列记录模式;
     列模式修改哪些字段就映射更新那些字段,如果目标库不存在该记录且本次操作类型为‘修改’,OTTER会忽略本次更新;
     行记录模式会更新所有映射字段,如果目标库不存在该记录且本次操作类型为‘修改’,OTTER会在目标库执行新增;
是否开启数据一致性:选‘否’,公司数据架构设计不考虑数据多主模式。
5)添加PIPE
 
需要选择SELECT/LOAD机器节点;然后选择一个CANAL (注意:一个CANAL只能和一个CHANNEL关联!)
6)添加映射规则
 
选择好源表,目标表后,点解‘保存’即可,至此,整个配置过程完成。
7)在CHANNEL管理页面 启动
 
8)测试

在57上执行修改语句:
  然后在60上执行SELECT语句验证结果
  测试通过;

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

至此,整个配置过程完成。
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 cols = eventData.getColumns();
        cols.add(misc);
        eventData.setColumns(cols);
2)配置映射规则
 

选择’clazz'后,在‘EventProcessor文本’填入对应类名,然后将JAR包上传到node/lib下,即可;至此,整个OTTER的功能介绍完毕,希望能帮助诸位同时的工作,有问题可及时反馈
试用环境在  http://192.168.145.120:8080/login.htm ,用户名/密码:admin/admin,欢迎试用.

你可能感兴趣的:(利用OTTER实现准实时ETL)