otter基础

一、otter介绍

    阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。

    otter第一版本可追溯到04~05年,此次外部开源的版本为第4版,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了otte4。
目前同步规模:

  • 同步数据量6亿
  • 文件同步1.5TB(2000w张图片)
  • 涉及200+个数据库实例之间的同步
  • 80+台机器的集群规模

Otter项目地址:https://github.com/alibaba/otter

Otter文档地址:https://github.com/alibaba/otter/wiki

二、基础概念

  • Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成;

  • Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成;

  • DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等;

  • DataMedia: 抽象的数据介质概念,可以理解为数据表/mq队列定义;

  • DataMediaSource: 抽象的数据介质源信息,补充描述DateMedia;

  • ColumnPair: 定义字段映射关系;

  • ColumnGroup: 定义字段映射组;

  • Node: 处理同步过程的工作节点,对应一个jvm;

基础概念直接的关系如图:


图片.png

三、架构设计

下图是关于Otter运行原理图:


图片.png

根据上图里面关键几个元素进行介绍

  • db : 数据源以及需要同步到的库
  • Canal : 用户获取数据库增量日志
  • manager : 配置同步规则设置数据源同步源等
  • zookeeper : 协调node进行协调工作
  • node : 负责任务处理,即根据任务配置对数据源进行解析并同步到目标数据库的操作。

原理描述:

  1. 基于Canal开源产品,获取数据库增量日志数据。
    a. 开源链接地址:http://github.com/alibaba/canal
    b. 推荐一个讲Canal源码的博客:http://www.tianshouzhi.com/api/tutorials/canal/380

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

    a. manager运行时推送同步配置到node节点

    b. node节点将同步状态反馈到manager上

  3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.

流程:

  1. 定义数据源
  2. 定义数据介质
  3. 建立映射规则
  4. 建立字段映射
  5. 建立字段组

四、代码结构

工程结构:

clipboard.png

包含三部分:Share | Node | Manager。 其中Share是Node和Manager共享的子系统,并不是独立部署的节点。Node和Manager是独立部署的。

  • Node:一个独立部署的节点,比如两个机房需要做通讯,则每个机房至少要部署一个Node节点(不考虑HA的话),数据同步的过程实际上都发生在Node之间

  • Manager:管理的节点,逻辑上只有一个(一个Manager管理多个Node节点),如果不考虑HA的话。负责管理同步的数据定义,包括数据源、Channel、PipeLine、数据映射等,各个Node节点从Manager处获取并执行这些信息。另外还有监控等信息。

Manger各个子系统说明:

  • biz 对系统数据加载(即初始化时候执行SQL初始化的系统表数据)
  • deployer 本地启动
  • web 配置管理的webUI

Node各个子系统的说明:

  • Common:公共内容定义
  • Canal: Canal的封装,Otter采用的是Embed的方式引入Canal(Canal有Embed和独立运行两种模式)
  • Deployer:内置Jetty的启动
  • etl: S.E.T.L 调度、处理的实现,是Otter最复杂、也是最核心的部分。(Select、Extract、Transform、Load)

SETL过程功能说明如图:


图片.png

Share各个子系统的说明:

  • Common: 公共内容定义
  • Arbitrate: 用于Manager与Node之间、Node与Node之间的调度、S.E.T.L几个过程的调度等;
  • Communication 数据传输的底层,上层的Pipe、一些调度等都是依赖于Communication的, 简单点说它负责点对点的Event发送和接收
  • etl:实际上并不负责ETL的具体实现,只是一些接口&数据结构的定义而已,具体的实现在Node里面。

五、基本操作

这部分操作参考官网:https://github.com/alibaba/otter/wiki

1. Manger和Node的配置和部署

2. 配置任务

六、本地调试环境搭建

1. 代码下载和导入idea

环境搭建:

  1. 进入$otter_home目录
  2. 执行:mvn clean install
  3. 导入maven项目。如果eclipse下报"Missing artifact com.oracle:ojdbc14:jar:10.2.0.3.0",修改otter_home/pom.xml中"{user.dir}/lib/ojdbc14-10.2.0.3.0.jar"为绝对路径,比如"d:/lib/ojdbc14-10.2.0.3.0.jar"

导入idea之后的结构如图:

图片.png

本地调试环境搭建:

    1. 配置Manager
    • 1.1 打开Manger下的deployer模块下的otter.properties文件
    • 1.2 修改如下属性:


      图片.png
    图片.png
  1. 配置Node

    • 2.1 打开node下的deployer模块下的otter.properties文件

    • 2.2 修改属性,这个node要连接去那个mananger,我们是本机调试写本机Ip,或者127.0.0.1


      图片.png
    • 2.3 运行OtterLauncher.java时候设置运行参数-Dnid=id,这个id为manager,web界面中配置node对应的id。
      如图:


      图片.png
    • 2.4 运行OtterLauncher.java

    • 2.5 启动完成之后可以在manager的web界面看到node已经启动

  2. 启动

    • 3.1 配置同步任务
    • 3.2 启动同步任务,修改数据源的表,可以查看输出端的表是否有数据同步过去了。

七、改造支持kafka的代码介绍

修改分为三大部分:

1. manager端的改造

  1. 修改页面 addDataSource.vm 添加 Kafka 选项;
  2. dbCheck.js 引用了 Hello.js,这里应用了dwr技术,通过js去调用后端java代码。
    配置文件manager中的biz模块下的otter-manager-service.xml文件:
<bean id="dataSourceChecker" class="com.alibaba.otter.manager.biz.utils.DataSourceChecker">
        <property name="dataMediaSourceService">
            <ref bean="dataMediaSourceService" />
        </property>
        <property name="dataSourceCreator">
            <ref bean="dataSourceCreator" />
        </property>
        <dwr:remote javascript="Hello">
            <dwr:include method="check" />
            <dwr:include method="checkMap" />
            <dwr:include method="checkNamespaceTables" />
        </dwr:remote>
    </bean>

dbCheck.js调用DataSourceChecker.java中的方法去校验数据库是否可用,增加kafka的校验方法。
dwr简单教程

  1. editDataSource.vm页面类型选项添加 Kafka 类型

  2. DataSourceList.java中增加kafka数据源处理

  3. addDataMedia.vm页面中的配置kafka的主题时如何验证主题是否存在?

  4. addDataMedia.vm页面中的kafka的主题无法验证是否存在

  5. addColumnPair.vm中如果存在kafka的数据源时候,列直接复制mysql表的列。

    数据来源:AddColumnPairGroup.java中的execute方法调用buildColumnPairFromDataMedia方法。

  6. 在kafka中没有列的概念,要把数据源的列直接赋值给kafka,这一步操作需要在几个类中进行:

com.alibaba.otter.manager.web.home.module.screen.AddColumnPair
com.alibaba.otter.manager.web.home.module.screen.AddColumnPairGroup
  1. ColumnPairAction.java 中的doSave方法中kafka没有所谓的列名,这里要处理一下进行保存。
  2. 添加 Kafka 数据源类型
com.alibaba.otter.shared.common.model.config.data.kafka.KafkaDataMedia.java
com.alibaba.otter.shared.common.model.config.data.kafka.KafkaMediaSource.java

到这里,前端的改造基本完成。可以通过manager的web界面新建出kafka的数据源。

2. node端的改造 selector部分

  1. com.alibaba.otter.node.etl.select.selector.MessageParser类负责解析数据对象解析,将对应canal送出来的Entry对象解析为otter使用的内部对象。这里对配置的数据源做了一个检查:源和目标的库名表名是否是一致。这里需要排除kafka数据源做判断。

3. node端的改造 transform部分

  1. node中的T部分工作的代码在com.alibaba.otter.node.etl.transform包下。
  2. 新增com.alibaba.otter.node.etl.transform.transformer.NoStructTransformer.java类处理RowData转到Kafka需要的数据格式。
  3. 在com.alibaba.otter.node.etl.transform.OtterTransformerFactory类中的lookup方法中增加针对KafkaDataMedia的处理。
  4. 在node中的etl模块中的otter-node-transform.xml增加NoStructTransformer的注入配置。

4. node端的改造 load部分

  1. 增加Kafka数据源的方言处理类:com.alibaba.otter.node.etl.common.db.dialect.kafka.KafkaDialect,构建kafka的producer来发送消息。
  2. com.alibaba.otter.node.etl.load.loader.db.DbLoadAction类中的doCall方法增加对kafka方言的判断和处理。
  3. kafka分区有序,所以在发送binlog数据时候需要根据数据情况设置好分区的方式,可以通过设定分区字段,然后自定义分区去完成

至此整体改造完成。
可以通过如下步骤进行验证:

  1. manager启动
  2. manager中配置mysql=>kafka的任务
  3. 启动node
  4. manager中启动同步任务
  5. mysql中修改数据
  6. 在kafka的customer中查看是否有消息发送过来
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 一、背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务...
    献给记性不好的自己阅读 46,107评论 3 40
  • DRC简介 DRC(Data Replication Center)是我在阿里听过的一个概念,它的业务域是支持异构...
    彦帧阅读 12,258评论 3 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 承認自己沒那麼正確和重要 是省視自我,成就自我的第一步 然而做到的人寥寥
    憨憨爹阅读 156评论 0 0
  • 早起又停水啦 和父皇一起出去吃了早饭 回来雨一直下 去接了婆婆爷爷过来 然后一大家人一起吃饭 吃了饭洗了碗之后的几...
    珍惜眼前始为真阅读 215评论 0 0