MySQL增量同步工具OTTER

背景:    

鉴于****项目中有使用Otter同步数据,同时重庆资源池ESOP也有同样的需求,之前采用的是Federated引擎来实现,但是爱可生RDS不支持该引擎,必须采用其他的工具来实现该需求,记录一下学习OTTER的过程。

一、 otter简介

基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统。

架构: 
  

组件:

Canal:MySQL binlog增量解析,提供增量数据消费和订阅,otter已集成。

manager:管理节点,WEB管理与监控

node:负责具体的任务处理

依赖:

JAVA >1.6.25

zookeeper

MySQL

aria2 (node跨机房传输时使用HTTP多线程传输技术,依赖aria2作为下载客户端)

 

二、环境规划

manager

192.168.73.104

8080、1099

zookeeper

192.168.73.104

2181

otter mysql

192.168.73.101

3306

node

192.168.73.101

2088

Source(主)

192.168.73.103

3307

Source(备)

192.168.73.104

3307

target

192.168.73.102

3307

 

三、otter manager安装步骤:

1、JDK、MySQL、Zookeeper安装(省略)

2、安装包下载

https://github.com/alibaba/otter/releases 下载对应的安装包并解压,建议二进制包即可。

https://github.com/alibaba/otter/blob/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql 获取元数据

3、otter manager安装

tar zxvf manager.deployer-4.2.18.tar.gz -C otter_manager/

4、元数据导入(node节点执行,省略)

5、otter manager配置(重要配置)

otter.domainName = 192.168.73.104

otter.port = 8080 #WEB端口

otter.database.driver.url = jdbc:mysql://192.168.73.101:3306/otter #otter数据库配置

otter.database.driver.username = otter

otter.database.driver.password = Otter@2020

otter.communication.manager.port = 1099 #manager端口,与node通信

otter.zookeeper.cluster.default = 192.168.73.104:2181 #zk配置

6、启动并验证

./startup.sh

netstat -tlnup|grep 8080查看端口是否正常

http://192.168.73.104:8080/ 能正常打开说明正常,管理员账号密码:admin/admin

 

四、otter node安装步骤

1、node安装

tar zxvf node.deployer-4.2.18.tar.gz -C otter_node/

2、node 配置(重要配置)

otter.manager.address = 192.168.73.104:1099

3、生成node id

WEB管理端--机器管理--zookeeper管理,添加安装的zookeeper 
  

WEB管理端--机器管理--node管理,添加node节点信息--保存 
  

  

4、配置node id

echo 1 > conf/nid

5、启动node

./startup.sh

netstat -tlnup|grep 2088 查看端口是否正常

WEB管理端--机器管理--node管理页面,查看node状态是否为已启动

 

五、同步任务配置(单向同步任务)

1、配置canal

数据库地址:是源端的IP:PORT。

其他信息可以后期更改。 
  

2、数据源配置

输入源端和目标端MySQL的信息 
  

3、添加表配置

添加源表和目标表 
  

4、在同步管理中配置Channel

行模式:整行记录同步

列模式:根据binlog中变更的具体字段,按需同步 
  

5、添加pipeline

点击刚刚新增的Channel,配置pipeline 
  

 

6、配置映射关系

点击刚刚添加的pipeline,配置映射关系--配置同步的字段等 
  

 

7、导出源表数据到目标表、记录位点信息并配置

{"journalName":"bin-log.000029","position":8254691,"timestamp":0,"gtid":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-5533:1001480-1001579,d41f6cc1-9fc2-11ea-925d-000c293ddb5b:1-43"}; 
  

TIPS:字符集这里不能设置为UTF8MB4,这里并不是数据库的字符集,是获取binlog时候用的字符集。

8、新增第二张同步的表

假设新增的表为空表,在源端建表。

a、在配置管理--数据表配置,添加新增的表。

b、在同步管理中现停用channel通道,然后在channel管理--pipeline管理--映射关系列表中添加映射关系。

c、启动channel通道,观察日志

假设新增的表不空,建议在源端将该表设置为只读,然后在按照步骤添加;或者另新增canal、channel等。

 

六、主备源配置

1、配置管理-主备配置

添加主备数据库信息 
  

2、canal配置

数据库地址:添加主库信息

HA机制:选择media

media group key:输入主备配置处的key值 
  

    

3、数据源配置

URL:配置为jdbc:mysql://groupKey=1(1为主备配置中的key值) 
  

4、其他配置参考《五、同步任务配置》中的2~7。

 

七、模拟主库故障

1、Channel配置中停用当前的同步任务。

2、在node03主库上新增一条记录,并关闭node03主库。

3、切换主备

配置管理--主备配置页面点击切换按钮 
  

4、推送新主给Channel

Channel管理页面点击推送 
  

5、查看同步状态与进度

Channel管理--Pipeline管理--监控--同步进度查看同步状态,可以发现已经切换到node04。 
  

TIPS:早期使用file:position作为同步起点时,主挂了,则只能重新在canal中重新配置起点。得益于GTID的集群唯一性,现在切换变得简单了。但是要想使用主备配置,从库必须开启log_slave_updates,否则主备切换时,会找不到对应的binlog。

 

 

八、注意事项

1、otter只支持ROW模式的数据同步,其他两种模式不支持

2、源库只支持mysql,目标库支持mysql和oracle

3、同步的表必须要有主键

4、支持部分ddl同步  (支持create table / drop table / alter table / truncate table / rename table / create index / drop index,其他类型的暂不支持,比如grant,create user,trigger等等),同时ddl语句不支持幂等性操作,所以出现重复同步时,会导致同步挂起,可通过配置高级参数:跳过ddl异常,来解决这个问题。

5、不支持带外键的记录同步

附录:

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

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

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

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

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

·  ColumnPair : 定义字段映射关系

·  ColumnGroup : 定义字段映射组

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

posted @   Harda  阅读(1194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示