扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦
Otter项目地址:https://github.com/alibaba/otter
Otter文档地址:https://github.com/alibaba/otter/wiki
Ottter是由阿里开源的一个数据同步产品,它的最初的目的是为了解决跨国异地机房双A架构,两边可写的场景,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了Otter。Otter基于数据库增量日志解析,支持mysql/oracle数据库进行同步。核心就一个分布式数据库同步系统。
名称:otter ['ɒtə(r)]
译意: 水獭,数据搬运工
语言: 纯java开发
定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统
名称:canal [kə'næl]
译意: 水道/管道/沟渠
语言: 纯java开发
定位: 基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql
Channel:
同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成;Pipeline:从源端到目标端的整个过程描 述, 主要由一些同步映射过程组成;
DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等;
DataMedia: 抽象的数据介质概念,可以理解为数据表/mq队列定义;
DataMediaSource: 抽象的数据介质源信息,补充描述DateMedia;
ColumnPair: 定义字段映射关系;
ColumnGroup: 定义字段映射组;
Node: 处理同步过程的工作节点,对应一个jvm;
工作原理图
原理描述:
1. 基于Canal开源产品,获取数据库增量日志数据。
2. 典型管理系统架构,manager(web管理)+node(工作节点)
a. manager运行时推送同步配置到node节点
b. node节点将同步状态反馈到manager上
3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
canal 支持mysql系列的5.1 ~ 5.6版本,目前maridb经测试暂不支持. (全面支持ROW/STATEMENT/MIXED几种binlog格式的解析)mysql做为master,otter只支持ROW模式的数据同步,其他两种模式不支持. (只有ROW模式可保证数据的最终一致性)
Cannal是基于数据库增量日志解析,提供增量数据订阅,消费,目前主要支持mysql。
这里我们首先来说一下mysql自己的master/slave是实现原理:
主要分为三步:
1:master将改变记录到二进制日志(binarylog)中
2:slave将master的binary logevents 拷贝到自己的中继日志(relay log)
3: slave重做relay log 中的事件,将改变反应到自己的数据库中
了解了mysql主从复制的基本原理,canal就简单多了:
原理相对比较简单:
a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工作 (一般是Select和Extract在一个机房的Node,Transform/Load落在另一个机房的Node)
b. node节点可以有failover / loadBalancer. (每个机房的Node节点,都可以是集群,一台或者多台机器)
说明:为了更好的支持系统的扩展性和灵活性,将整个同步流程抽象为Select/Extract/Transform/Load,这么4个阶段.
Select阶段: 为解决数据来源的差异性,比如接入canal获取增量数据,也可以接入其他系统获取其他数据等。
Extract/Transform/Load 阶段:类似于数据仓库的ETL模型,具体可为数据join,数据转化,数据Load的
otter的环境需要mysql ,jdk, zookeeper , node , manager,aria2
这里zk,jdk的安装就不在讲了,我的其他博客有介绍,主要介绍,node和manager的安装流程
otter manager依赖于mysql进行配置信息(元数据)的存储,所以需要预先安装mysql用于存储otter的元数据,并初始化otter manager所需的系统库和表,source otter-manager-schema.sql, 执行show databases可以看到脚本创建了一个名字叫otter的数据库。manager依赖于mysql进行配置信息的存储,所以需要预先安装mysql
# yum install -y mysql-server mysql mysql-devel
# service mysqld start //启动mysql服务
# mysqladmin -u root password 'root' // 给root账号设置密码为 root
初始化otter manager系统表(元数据表):
otter-manager-schema.sql下载地址:
# wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
启动otter的元数据mysql载入sql:
# mysql -uroot -proot
/root/cloud/otter-manager-schema.sql为otter的安装目录
mysql> source /root/cloud/otter-manager-schema.sql
manager下载安装
下载页面:https://github.com/alibaba/otter/releases/
下载manager:
wget https://github.com/alibaba/otter/releases/download/v4.2.14/manager.deployer-4.2.14.tar.gz
创建manager目录 : mkdir ~/manager
tar zxvf manager.deployer-4.2.14.tar.gz -C ~/manager
进入conf下面修改,添加otter的元数据库信息
# vim otter.properties
otter.domainName = ip 修改为manager的ip,用户web访问
## otter manager database config manager上面的mysql信息
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter
otter.database.driver.username = root
otter.database.driver.password = *******(保密)
## default zookeeper address 选择一个就近的zookeeper集群地址
otter.zookeeper.cluster.default = 本地ip:2181
准备启动
# bin/startup.sh
查看日志
tail -f logs/manager.log
出现如下图的日志表示安装成功
验证
访问: http:// 127.0.0.1::8080/,出现otter的页面,即代表启动成功
初始密码为:admin/admin,点击右上角即可完成登录。目前:匿名用户只有只读查看的权限,登录为管理员才可以有操作权限
到此manager安装完成。
这里访问主页时报了一个错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections,将mysql连接数调大就行了
node会受到otter manager进行管理,需要在manager页面为node定义配置信息,并生成一个唯一id。
a. 首先访问manager页面的机器管理,添加zookeeper管理,点击添加
b. 访问manager页面的机器管理,点击node管理,点击添加机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid
几点说明:
机器名称:可以随意定义,方便自己记忆即可
机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口, 实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088
下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090
外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。
zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群.
node这种设计,是为解决单机部署多实例而设计的,允许单机多node指定不同的端口通过上面的操作,获取到了 node节 点对应的唯一标示,称之为node id,简称:nid. 记录该nid,后续启动nid时会使用
只需要node节点上安装,找个目录,安装即可,manager不需要
node节点进行跨机房传输时,会使用到HTTP多线程传输技术,目前主要依赖了aria2c做为其下载客户端,所以我们现在需要安装aria2node 需要aria2支持,在slave1和slave2机器上分别安装了一套。
aria2下载地址:http://sourceforge.net/projects/aria2/files/stable/
# tar -zxvf aria2-1.17.1.tar.gz
进入目录: cd aria2-1.17.1
编译:
./configure
可能会出现如下错误:
configure: error: in `/root/cloud/aria2-1.17.1':
configure: error: no acceptable C compiler found in $PATH
# yum -y install gcc
然后./configure,现在就成功通过了。
# make 报错的话,再重新执行一次/configure这个就好了。
# make install
下载node
wget https://github.com/alibaba/otter/releases/download/v4.2.14/node.deployer-4.2.14.tar.gz
注意1:node要在其他的slave机器上安装
# mkdir node
# tar -zxvf node.deployer-4.2.13.tar.gz -C node
配置修改
nid配置 (将上面获取到的序号,保存到conf目录下的nid文件,比如我添加的机器对应序号为1)
# echo 1 > conf/nid
注意2:这步一定要有,不然node启动报错不同node的nid就是在manager页面指定的nid号
## otter arbitrate & node connect manager config
otter.manager.address =managerip:1099 修改为manager服务地址,1099不用改,只改地址
准备启动
# sh startup.sh
查看日志
看到如上日志,代表node启动完成.
验证
访问: http:// ipÇ:8080,查看对应的节点状态,如果变为了已启动,代表已经正常启动。(ps,如果是未启动,会是一个红色高亮)
注意:如果发现一直都是未启动状态可以查阅/node/logs中的日志,查看具体原因
slave2机器上也安装上面的部署安装aria2和node
到此otter安装成功。
前提:
有一点特别注意:目前canal支持mixed,row,statement多种日志协议的解析,但配合otter进行数据库同步,目前仅支持row协议的同步,使用时需要注意
SET SESSION binlog_format = 'ROW';
SET GLOBAL binlog_format = 'ROW';
第一步: 添加数据库,点击配置管理,选择数据源配置
配置顺序:数据源-->数据表-->canal-->channel配置-->pipline
配置完后,编辑完后可以验证。
在源mysql上面创建库
注意:源数据可以任意,就是你需要拉数据的数据库,一定要和otter的元数据数据库分清
在元数据库上键库建表: create database otter ;
CREATE TABLE IF NOT EXISTS `user`(
`name` VARCHAR(100) NOT NULL,
`age` VARCHAR(100) NOT NULL,
`money` VARCHAR(40) NOT NULL,
PRIMARY KEY ( `name` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8
源数据库配置完成,目标库一样,选取目标库的URL地址即可。
配置完后如下图:
第二步:同步数据源,源库和目标库的库和表
目标库一样的配置方式
配置完后
第三步:配置同步库mater源的cannal
然后点击保存.
注意:canal中的数据源类型可以配多个,多个用分号隔开,看你的需求。切、且只需要配置源数据库的url地址即可。你需要从几个源数据库拉取数据,就写几个源数据库的url地址。
第四步: 添加channel,点击同步管理,选择添加
第五步:添加pipeline,点击同步管理
注意: 选取运行机器和load机器时,一个就可以,多个的意思是,其中一个挂了,其他的顶替。
选择刚才新创建的channel
第六步:添加同步映射规则,点击配置管理,选择canal配置
点击Pipeline管理中刚才新创建的pip1,然后点击添加
注意,如果是mysql到mysql ,两个白方框里面什么都不用写
注意:红框表明的是自己自定义代码,也可以为空,那么就是mysql->mysql的同步
最后:选择创建的cahnal启动,进入查看pipline是否正常启动,如果延时时间在500ms以内为正常。
异常表现为:chananl挂起,可查看pipline日志进行查看
三步缺一不可,尤其第三步bin-log开启,否则
自定义版本的kafka版本与实际kafka版本统一,否则报各种异常数据,后来采用0.8.2.2版本与生产环境版本一致最终解决
3、node日志没有打印出来,需要配置log4j.properties(定位并解决用时1天)
4、故障:channel挂起,从库未同步主库表数据。(解决方案同DDL语句不能 执行故障Exception: no support ddl for)
解决方案;在otter的管理界面,点击同步管理,停用Channel,点击进入Pipeline==>管理=>最下面高级=>跳过ddl异常
5、故障;node未找到
原因:node机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid,node节点对应的唯一标示
扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦
扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦
扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦