Canal 实现 Mysql数据库实时数据同步
简介
1.1 canal介绍
Canal是一个基于MySQL二进制日志的高性能数据同步系统。Canal广泛用于阿里巴巴集团(包括https://www.taobao.com),以提供可靠的低延迟增量数据管道,github地址:https://github.com/alibaba/canal
Canal Server能够解析MySQL binlog并订阅数据更改,而Canal Client可以实现将更改广播到任何地方,例如数据库和Apache Kafka。
它具有以下功能:
- 支持所有平台。
- 支持由Prometheus提供支持的细粒度系统监控。
- 支持通过不同方式解析和订阅MySQL binlog,例如通过GTID。
- 支持高性能,实时数据同步。(详见Performance)
- Canal Server和Canal Client都支持HA / Scalability,由Apache ZooKeeper提供支持
- Docker支持。
缺点:
不支持全量更新,只支持增量更新。
完整wiki地址:https://github.com/alibaba/canal/wiki
1.2 运作原理
原理很简单:
1、Canal模拟MySQL的slave的交互协议,伪装成mysql slave,并将转发协议发送到MySQL Master服务器。
2、MySQL Master接收到转储请求并开始将二进制日志推送到slave(即canal)。
3、Canal将二进制日志对象解析为自己的数据类型(原始字节流)
如图所示:
准备工作
2.1 下载解压canal-server
通过 github 下载 canal-server release 版本(本次安装文档使用v1.1.4)
root@locahost:/# wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
解压
tar -zxvf canal.deployer-1.1.4.tar.gz
2.2 下载解压 canal-adapter
通过 github 下载 canal-adapter release 版本(本次安装文档使用v1.1.4)
root@locahost:/# wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
解压
tar -zxvf canal.adapter-1.1.4.tar.gz
配置 canal-server
3.1 canal-server 配置
解压之后进入 conf文件夹中,修改 canal.properties 根据实际需要来修改(如果不使用kafka或MQ 默认tcp即可)
canal.destinations = prod # 指定instance的名字多个使用逗号分隔
保存之后在conf目录创建 prod 文件夹并将 example文件夹中的 nstance.properties copy 到and_prod中
mkdir ant_prod #创建文件夹
cp example/nstance.properties prod/ # copy 文件
修改 nstance.properties 配置如下:
canal.instance.master.address=127.0.0.1:3306 # 源Mysql地址
canal.instance.dbUsername=canal # 源Mysql账号
canal.instance.dbPassword=canal # 源Mysql密码
canal.instance.connectionCharset=UTF-8 # 与源数据库编码格式一致
canal.instance.defaultDatabaseName=test_database # 默认监听源数据库
3.2 canal-server 启动
进入 canal-server bin 目录 启动
cd canal-server/bin # 进入目录
./startup.sh & # 后台启动
查看日志,是否启动成功
cd canal-server/logs/ant_prod #进入日志目录
启动成功:
2020-06-09 17:13:04.956 [main] WARN o.s.beans.GenericTypeAwarePropertyDescriptor - Invalid JavaBean property 'connectionCharset' being accessed! Ambiguous write methods found next to actually used [public void com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.setConnectionCharset(java.nio.charset.Charset)]: [public void com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.setConnectionCharset(java.lang.String)]
2020-06-09 17:13:04.990 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
2020-06-09 17:13:04.990 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [ant_prod/instance.properties]
2020-06-09 17:13:05.305 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-ant_prod
2020-06-09 17:13:05.311 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$
2020-06-09 17:13:05.311 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter :
2020-06-09 17:13:05.315 [main] INFO c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2020-06-09 17:13:05.422 [destination = ant_prod , address = rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position
2020-06-09 17:13:05.423 [destination = ant_prod , address = rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status
2020-06-09 17:13:06.483 [destination = ant_prod , address = rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000234,position=6676924,serverId=184376678,gtid=,timestamp=1591693973000] cost : 1051ms , the next step is binlog dump
配置 canal-adapter
4.1 canal-adapter 配置
由于Mysql 是8.0 这里需要下载 mysql-connector-java-8.0.20.jar,并将其放入lib中
cp mysql-connector-java-8.0.20.jar /canal-adapter/lib/
解压之后进入 conf文件夹中,修改 application.yml
server:port: 8089
spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8default-property-inclusion: non_null
canal.conf:mode: tcp # kafka rocketMQcanalServerHost: 127.0.0.1:11111batchSize: 500syncBatchSize: 1000retries: 0timeout:accessKey:secretKey:
# 源Mysql 地址账号密码等srcDataSources: defaultDS:url: jdbc:mysql://localhost:3306/test_database?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaiusername: canalpassword: canal
# 需要实时同步数据库,如果多个实例进行区分即可canalAdapters:- instance: prod # canal instance,在canal-server中指定instance的名称groups:- groupId: g1outerAdapters:- name: rdbkey: mysql1 # 唯一标示properties:jdbc.driverClassName: com.mysql.jdbc.Driverjdbc.url: jdbc:mysql://localhost:3306/test_database_01?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaijdbc.username: canaljdbc.password: canal
编辑rdb目录下面表的映射文件,数据库/表 (多个表创建多个映射文件,文件名对应表名)以此类推
dataSourceKey: defaultDS
destination: prod
outerAdapterKey: mysql1
concurrent: true
dbMapping:database: test_database_01table: testtargetTable: test_database_01.testtargetPk:id: idmapAll: true
4.1 canal-adapter 启动
进入 canal-adapter/bin 目录 启动
cd canal-adapter/bin # 进入目录
./startup.sh & # 后台启动
查看日志,是否启动成功
cd canal-adapter/adapter/logs/ #进入日志目录
tail -f adapter.log # 查看日志是否启动成功
测试数据库同步
更新/删除/批量插入/批量更新/批量删除
参考链接 :
原文链接:https://www.jianshu.com/p/d4c177f0d831
作者:qingwenLi
Canal 实现 Mysql数据库实时数据同步 https://mp.weixin.qq.com/s/jtT-pjzxgeHLKdtYoxPBiA
Canal 实现 Mysql数据库实时数据同步相关推荐
- ubuntun系统mysql数据库同步_Canal 实现 Mysql数据库实时数据同步
简介 1.1 canal介绍 Canal是一个基于MySQL二进制日志的高性能数据同步系统.Canal广泛用于阿里巴巴集团(包括https://www.taobao.com),以提供可靠的低延迟增 ...
- Canal监控MySQL数据库实现数据同步
canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL. canal简介 需求:将MySQL中某些表的数据实时的同步到 ...
- 基于Canal的MySQL=>ES数据同步方案
文章目录 1.MySQL和ES的主要区别? 1.1 功能性 1.2 性能指标 1.3 在搜索业务上的区别 1.3.1 查询 1.3.2 检索 2.为什么要做数据同步 2.1 检索性能 2.2 写入性能 ...
- MySQL异构同步_详解MySQL数据库异构数据同步
本文主要向大家介绍了MySQL数据库异构数据同步,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 在实现levelDB挂载成MySQL引擎时,发现在实际存储是key-value格式 ...
- 使用canal解决Mysql和Redis数据同步问题
前言 千呼万唤始出来,停了好个月,终于又开始动手写文章了,今天带给大家的是阿里的一个工具Canal,这个工具是企业做数据同步使用的比较多的方案,希望对你有所帮助,喜欢的话请给个好评 工作原理分析 我们 ...
- 如何保证elasticsearch和mysql数据库的数据同步?
在应对大数据量的电商网站时,通常我们把热门数据放在elasticsearch中.但如何保证es和mysql的数据同步? 方法一:.双写模式 1.首先添加商品入数据库,添加商品成功后,商品入ES, 2. ...
- MySQL 到 DM DB 达梦数据库实时数据同步实操分享
- oracle数据库实时数据同步
1.查询当前用户是否有添加dblink的权利: select * from user_sys_privs where privilege like upper('%DATABASE LINK%'); ...
- MySQL 到 MongoDB 实时数据同步实操分享
MySQL数据怎么实时同步到 MongoDB 实践分享系列 摘要:很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同 ...
最新文章
- 最火移动端跨平台方案盘点:React Native、weex、Flutter
- easyUI的combobox是否可用
- 第五章 常用Lua开发库1-redis、mysql、http客户端
- 百练2757:最长上升子序列
- VMware Tools installation cannot be started manually while Easy Install is in progress.
- 扫描二维码 扫码打电话 可以打电话的二维码
- 余额表前后台操作和对应sql
- 显卡排行榜天梯图2022 显卡性能天梯图2022
- fixed在ios失效解决方案
- MacOS系统上有什么好用的思维导图软件?
- springboot结合redis解决重复提交问题的实际应用
- iOS 手机安装Charles证书失败解决方法
- 人民大学 环境学院 雷洋(1987-2016)
- 自适应阈值(adaptiveThreshold)分割原理及实现
- PHP 发送邮件配置 转发自http://www.cnblogs.com/dee0912/p/5448350.html
- python中面向对象的缺点_python中的面向对象和面向过程
- 【性能测试】轻商城-项目实战2
- 国科大学习资料--最优化计算方法(王晓)--期末考试试卷2
- pool win10提示bad_Win10蓝屏问题:BAD_POOL_HEADER
- 数字电路实验 08 - | 555定时器及其应用