zoukankan      html  css  js  c++  java
  • 利用OTTER实现准实时ETL、数据同步

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

    工作原理图:

    concept_jpeg

    原理描述:

    1. 基于Canal开源产品,获取数据库增量日志数据。
    2. 典型管理系统架构,manager(web管理)+node(工作节点)

      1. manager运行时推送同步配置到node节点
      2. 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集群信息:
    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的功能介绍完毕

  • 相关阅读:
    拥有最多糖果的孩子
    求1+2+…+n
    网络-中间代理
    Header中的Referer属性表示
    ios13.4post请求出现网错错误 network err
    10.8&10.10
    9.23&9.27
    9.16&9.19
    校内模拟赛划水报告(9.9,9.11)
    男人八题 划水题解
  • 原文地址:https://www.cnblogs.com/purple5252/p/14487583.html
Copyright © 2011-2022 走看看