玩转Otter、Canal系列 - 工作原理、全系列搭建及使用流程详解

一 3w分析及原理运行机制说明

首先, 在了解问题答案之前, 依据3w法则分析一波Otter/Canal。了解了这些更有利于我们解决相关的问题。

why: 为什么要用 ?

简而言之,在数据同步这块儿,目前独树一帜、功能强大、场景覆盖面广。

1. 异构库同步

    a. mysql -> mysql/oracle. (目前开源版本只支持mysql增量,目标库可以是mysql或者oracle,取决于
    canal的功能)

2. 单机房同步 (数据库之间RTT < 1ms)

    a. 数据库版本升级

    b. 数据表迁移

    c. 异步二级索引

3. 异地机房同步 (比如阿里巴巴国际站就是杭州和美国机房的数据库同步,RTT > 200ms,亮点)

    a. 机房容灾

4. 双向同步

    a. 避免回环算法 (通用的解决方案,支持大部分关系型数据库)

    b. 数据一致性算法 (保证双A机房模式下,数据保证最终一致性,亮点)

5. 文件同步

    a. 站点镜像 (进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片).

how怎么用?

安装完之后在Web界面可以配置主库从库的信息,Canal、Pipeline等信息,此外还需要主库开启binlog模式,开通具有salve权限的账号等,之后就可以很轻松在web页面使用数据同步的功能,后文将会详细解析搭建及配置的具体情况。

what是什么?

Canal属于Otter的一个核心组件, Otter除使用了Canal还使用了Node、Manager、Zookeeper等以支持了图形化界面、多节点同步,分布式协调等功能。它能更便捷的利用数据库主从复制的特性,准实时同步增量日志到本机房或异地机房,更便捷的利用到数据同步的场景。简而言之,就是搞数据同步的非常棒的一个开源项目。

原理及运行机制:

otter工作原理

说明:为了更好的支持系统的扩展性和灵活性,将整个同步流程抽象为Select/Extract/Transform/Load,这么4个阶段。

Select阶段: 为解决数据来源的差异性,比如接入canal获取增量数据,也可以接入其他系统获取其他数据等。

Extract/Transform/Load 阶段:类似于数据仓库的ETL模型,具体可为数据join,数据转化,数据Load等。

  1. 基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, 请点击

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

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

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

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

特性:

  • 使用纯 Java 开发,占时资源比较高
  • 基于Canal获取数据库增量日志,Canal是阿里爸爸另外一个开源产品
  • 使用manager(web管理)+node(工作节点),manager负责配置监控,node负责处理任务
  • 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作
  • 使用aria2多线程传输技术,对网络依赖带宽依赖较低

缺点:

Otter使用的技术栈较老,且官方社区目前不是很活跃。

官方文档不够详细且很久没有更新了,学习成本较高。

二 Otter搭建

Otter依赖aria2、Manager、Node、Mysql、Zookeeper等,

  • Manager:Web管理页面

  • Node:工作节点

  • Mysql:存储依赖的表数据

  • Zookeeper:解决分布式状态调度的,允许多node节点之间协同工作

  • aria2:是一个文件通道来保证需要同步的数据通过极快的速度同步到需要同步的服务器上

官方提供了两种搭建方式,一种是Docker部署,一种是Release包部署,这里笔者两种方式都会做相应说明。

1.Docker部署
//拉取镜像
docker pull canal/otter-all

//脚本启动
curl -fsSL https://raw.githubusercontent.com/alibaba/otter/master/docker/run.sh | bash

端口默认8080, 账号密码默认是admin/admin。启动完成访问 http://localhost:8080 ,界面如下:

otter首页

Dockerfile及启动脚本说明:

https://github.com/alibaba/otter/wiki/Docker_QuickStart

上述安装方式包含了otter所依赖的所有组件,比如mysql、zookeeper、manager、node、aria2等,几个组件的互相依赖的配置都已经初始化完成。

整个镜像设计为单机的QuickStart启动模式,全部都是单点启动,并没有高可用的能力。如果需要高可用的组件,可以借助k8s做docker节点的高可用调度,或者参考Dockerfile按照业务需求改造为多docker协同部署的模式。

注意事项:

默认的镜像启动失败概率较大,原因是因为依赖的组件可能会因为宿主机的服务占用了相关端口导致启动失败。

此外该镜像均设计为单点启动, 更适合利用在测试的场景上。为确保上述方式成功,尽量保证服务器预留3306、2181、8080、8081、2088、2089、2090等镜像启动内置的端口。

2.Release包部署

这种部署方式需要单独部署mysql、zookeeper、manager、node等。

安装mysql,zookeeper的方式很多,不再多做说明。下面的搭建需要已经提前搭建好mysql和zookeeper。

1.需要先创建好otter所依赖的数据库
//下载sql脚本
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql 

//载入
source otter-manager-schema.sql

2.下载manager、node
//下载manager
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gz


//下载node
wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gz
3.解压缩并配置manager(需要首先配置manager, 再配置node)
//解压缩
tar zxvf manager.deployer-4.2.18.tar.gz  -C ./manager

//进入conf目录, 修改otter.properties,主要修改域名端口配置、Mysql配置、zk配置等

##修改为解析的域名和端口,建议修改为公网ip或域名
## otter manager domain name
otter.domainName = 127.0.0.1
## otter manager http port
otter.port = 8080
## jetty web config xml
otter.jetty = jetty.xml

##修改为配置好的mysql地址账号密码
## otter manager database config
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://172.17.18.118:3307/otter
otter.database.driver.username = root
otter.database.driver.password = root

##配置manager端口, 后续配置node时需要用到该配置
## otter communication port
otter.communication.manager.port = 1099

##修改为配置好的zk地址
## default zookeeper address
otter.zookeeper.cluster.default = 127.0.0.1:2181
## default zookeeper sesstion timeout = 60s

//进入bin目录执行启动脚本
 ./bin/startup.sh 
 
//日志查看
tailf logs/manager.log

执行成功使用http://localhost:8080 即可访问manager界面 ! 默认账号密码: admin/admin

otter首页

4.安装aria2
//安装 epel 源
yum install epel-release

//直接安装aria2
yum install aria2 -y
5.安装node
//解压缩
tar zxvf node.deployer-4.2.18.tar.gz  -C ./node

//写入配置node的id到conf目录,且文件名为nid
echo 1 > conf/nid

//修改conf目录下的配置文件otter.properties, 主要配置manager的地址及端口

## otter arbitrate & node connect manager config
otter.manager.address = 127.0.0.1:1099

//启动node
./bin/startup.sh 

//查看日志
 tailf logs/node/node.log 
6.manager页面进行相关配置就可以开始食用了

❶ 配置zookeeper

进入 机器管理 → zookeeper管理, 点击添加按钮

配置zk
在这里插入图片描述

配置成功如上图, 如点击刷新按钮报错, 是因为缺少nc命令导致的, 安装即可;

yum install nc

❷配置node

进入 机器管理 → Node管理, 点击添加按钮

配置Node

配置node成功

node配置成功如图, manager会自动检测node节点的启动情况, 多节点直接添加机器即可。

至此已全部搭建完成, 可以尽情食用了。

3.源码部署

源码部署和第二种Release包部署类似, 唯一差别的地方在于需要通过下载源码进行编译打包获取manager和node文件(下方加粗标注部分)。流程如下:

搭建mysql、zookeeper → 创建otter依赖的数据库 → 下载otter源码 → 编译打包获取manager、node压缩包 → 安装aria2 → 安装node → manager页面配置zk、node

⑴ 下载源码

git clone [email protected]:alibaba/otter.git

⑵ 导入maven仓库拉取不到的jar包, 主要是jtester-1.1.8.jar 和 ojdbc6.jar

//install jtester-1.1.8.jar, 记得替换jar包所在的绝对路径
mvn install:install-file -Dfile=XXXXXX\otter\lib/jtester-1.1.8.jar -DgroupId=org.jtester -DartifactId=jtester -Dversion=1.1.8 -Dpackaging=jar

//install ojdbc6.jar, 记得替换jar包所在的绝对路径
mvn install:install-file -Dfile=XXXXXX\otter\lib/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar

//编译
mvn clean install -Dmaven.test.skip -Denv=release

编译成功后会产生 manager.deployer-x.x.xx-SNAPSHOT.tar.gz 和 node.deployer-x.x.xx-SNAPSHOT.tar.gz 。其它步骤同Release包部署。

三 otter食用

食用otter首先需要了解otter的使用约定、配置流程,尽量规避易致错的操作建立起使用的信心。

otter同步约定
1. 同步表必须有主键
2. oracle表不允许使用blob/clob (mysql无此限制)
3. 数据订正 (几种case需要和otter团队沟通 )
	a. 纯数据订正超过1000w
	b. 带文件订正超过50w
	c. 非映射关系表订正超过5000w (otter4正在做优化,尽早解除限制)
4. 新通道上线步骤 (当前)
	a. 明确同步需求
	i. 单向 / 双向 / 双写(需要明确主要写入站点) / 文件同步
	b. 全量数据初始化
	i. 行记录 + gmt_modified修改
	ii. 插入同步记录到retl_buffer表
5. 数据表字段变更
	a. 只允许新增字段到末尾 (删除字段慎重)
	b. 字段新增先加目标库,再加源库
	c. 双向同步,新增字段建议无默认值 (可确保同步无挂起)
	6. 图片同步,需要先写图片,后插数据
otter4同步延迟比较低,如果先写数据,后写图片或者两者并发写,就会有一定的概率拿到数据后,反查没有
图片,导致图片同步丢失

在企业使用过程中,可能并不会使用到上述说明的所有场景,如果只是简单的使用场景,建议提供通用的约定提高团队沟通成本。

  • 不支持无主键表同步;
  • 不支持带外键的记录同步;
  • 不支持trigger配置;
  • 对于同步表字段属性的变化、字段的增删、表的增删需要及时与要同步的团队同步信息。
数据库配置

1.首先需要建立同步需要的主库和从库, 主库需要开启binlog, mysql配置文件加入如下配置即可;

log-bin=/var/lib/mysql/mysql-bin binlog_format=ROW server-id=100

然后重启mysql即可。

2.验证mysql的binlog是否开启成功:

SHOW VARIABLES LIKE ‘log_%’;

image-20200511145908326

SHOW VARIABLES LIKE ‘binlog_format%’;

image-20200511145908326

3.从库同步需要主库提供账号密码, 且账号至少需要SELECTREPLICATION CLIENTREPLICATION SLAVE权限。

注意:REPLICATION SLAVE 可以在只读账号下分配,但权限级别需要是 global,不能仅指定某个数据库的只读。

账号创建操作如下:

CREATE USER test IDENTIFIED BY '123456';  

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test'@'%';

FLUSH PRIVILEGES;
配置流程

添加canal配置 → 添加数据源配置 → 添加数据表配置 → 添加channel → 添加Pipeline → 添加表映射关系 → 启动channel

下面以一个单向同步的例子带图同步演示otter操作。

1.添加canal配置: 配置管理 → canal配置 → 点击添加按钮

添加canal

简单使用, 填好数据库信息就可以了。库的信息是主库的数据源信息

2.添加数据源配置:

配置管理 → 数据源配置 → 点击添加按钮

添加目标数据源,即主库数据源(开启binlog)

添加数据源

添加从库数据源,即要同步的库

添加数据源2

3.添加数据表配置

配置管理 → 数据表配置 → 点击添加按钮

添加主库表

添加数据表

同理,添加从库表信息。

4.添加channel

添加channel5.添加Pipeline

添加pipeline

6.添加表映射关系

添加表映射关系

添加主库数据表和从库数据表,配置好字段映射关系,如果表结构相同, 直接保存,无需点击下一步。

7.启动channel

启动channel

点击启动,数据表就可以正常进行同步了。出现异常信息点击channel进入查看异常信息即可。

四 常见问题

1. java命令不在otter查找目录内

假定在/usr/local/software/jdk1.8.0_141/bin下, 建立软连接即可

ln -s /usr/local/software/jdk1.8.0_141/bin/java /usr/local/bin/java

2. Zookeeper页面点击刷新按钮报错

是因为缺乏nc命令导致的,安装即可

yum install nc

3. node 报内存不足

node出现java.lang.OutOfMemoryError : Gc overhead limit exceeded.

  • 调大node的-Xms,-Xmx内存设置,默认为3G,heap区大概是2GB
  • 减少每个同步的任务内存配置.

猜你喜欢

转载自blog.csdn.net/s78365126/article/details/106427168