当前位置:网站首页>canal实现mysql数据同步
canal实现mysql数据同步
2022-08-04 05:24:00 【小东西的东西】
前言
canal是实现mysql数据备份,异地灾备,异地数据同步等重要的中间件,在实际的业务场景中有着广泛的使用,本文基于小编所在项目中一个异地数据同步的场景为例,通过案例演示下利用canal实现mysql数据同步的过程

同步原理

如上图所示,为canal同步mysql数据的原理的简单示意图,归纳如下:
- canal 模拟mysql slave 的交互协议,伪装自己为mysql slave,向mysql master 发送dump 协议。
- mysql master 收到dump请求,开始推送binary log给canal (slave)
- canal解析binary log对象(原始为byte流)
如果亲手配置过mysql读写分离架构的同学,对canal做数据复制的原理很好理解了,简单来说,就是伪装成master的从节点,监听并解析binlog日志的元数据到目标数据库的数据表
环境准备
- 一个开启了binlog日志的mysql服务,IP地址为: IP1
- 另一个安装并启动了mysql服务器的机器,IP地址为 : IP2
- canal安装包,包括:canal.adapter-1.1.4.tar.gz , canal.deployer-1.1.4.tar.gz
canal安装包下载地址:https://github.com/alibaba/canal/releases

实现步骤
实现本文需求的话,主要是基于下载的两个安装包的配置,其实对canal有所了解的同学对其实现原理并不陌生,就是两个springboot的服务,对于开发者来说,只需要按照官方wiki提供的同步实现,做各种配置即可
在上一篇springboot整合canal一篇中,我们初步演示了canal的server端配置过程,即 deployer 的配置,本篇,需要对 deployer 和 adapter同时做配置
deployer 配置
1、解压canal.deployer-1.1.4.tar.gz 到指定目录
tar -zxvf canal.deployer-1.1.4.tar.gz -C 目标文件目录

2、进入conf目录,修改canal.properties

如果是msyql同步到mysql,该配置文件无需做修改,保持默认即可,需要注意的地方如下:

3、进入example目录,修改instance.properties

主要需要修改的地方如下:
canal.instance.master.address=IP:3306 #mysql源地址

mysql源地址授权canal获取数据的账户名和密码
canal.instance.dbUsername=root
canal.instance.dbPassword=123456

4、启动deployer服务
进入到bin目录,直接使用下面的脚本启动,启动后检查下进程

adapter 配置
1、解压 canal.adapter-1.1.4.tar.gz 到指定目录
tar -zxvf canal.adapter-1.1.4.tar.gz 指定目录


2、进入conf 目录,首先修改application.yml 文件
主要需要修改的地方如下,
server:
port: 8081
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
canal.conf:
mode: tcp # kafka rocketMQ
canalServerHost: Canal的deployer服务所在IP地址:11111
# zookeeperHosts: slave1:2181
# mqServers: 127.0.0.1:9092 #or rocketmq
# flatMessage: true
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
srcDataSources:
defaultDS:
url: jdbc:mysql://mysql源数据库IP:3306/shop001?useUnicode=true
username: root
password: root
canalAdapters:
- instance: example # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: rdb
key: mysql1
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://目标同步IP:3306/shop001?useUnicode=true
jdbc.username: root
jdbc.password: root
3、进入rdb 目录,首先修改mytest_user.yml 文件

下面贴出核心修改的文件内容,需要注意的地方包括:
groupId: g1 ,这个和上面第二步中的该配置保持一致
outerAdapterKey: mysql1 ,这个和第二步中的该配置保持一致
mapAll: true,如果源表和目标表的字段结构等完全一致,直接开启此配置即可,下面的targetColumns可以注释掉
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
database: shop001 #mysql源数据库名称
table: user_info #mysql源数据库下的表名称
targetTable: shop001.tar_user #同步到目标数据库-数据表名称
targetPk:
id: id
mapAll: true #如果源表和目标表的字段结构等完全一致,直接开启此配置即可,下面的targetColumns可以注释掉
#targetColumns:id:
name:
role_id:
c_time:
test1:
#etlCondition: “where c_time>={}”
#commitBatch: 3000 # 批量提交的大小
4、启动 adapter 服务
进入bin目录下,使用下面的启动脚本进行启动,然后检查服务进程

在测试之前,我们分别在IP1和IP2上面安装的mysql数据库下创建了 user_info 表和 tar_user表,现在的需求是,数据要从 IP1:user_info => IP2: tar_user 表同步,

当前的状态为,两个库下的两个表均为空,执行下面的数据插入 sql ,给 user_info表插入一条数据
INSERT INTO `shop001`.`user_info` (`id`, `name`, `sex`) VALUES ('1', 'xiaoma', 'male');

可以看到,数据几乎是准实时的插入到tar_user表中,当然,当你执行删除、修改等操作时候,同样会同步过去
基于上面的操作,我们完成了一个使用canal实现mysql数据同步的过程,官方提供了诸多的同步方案,比如可以将数据从mysql同步到mysql,es,redis等等,有兴趣的同学可以继续深入研究!
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 擎朗智能全国研发创新中心落地光谷:去年曾获2亿美元融资
- System design. Seckill system
- Dynamic programming of the division of numbers
- C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.5 数组和指针的其他区别
- 高性能高可靠性高扩展性分布式防火墙架构
- npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
- 《看见新力量》第四期免费下载!走进十五位科技创业者的精彩故事
- 企业需要知道的5个 IAM 最佳实践
- 想低成本保障软件安全?5大安全任务值得考虑
- share总结
猜你喜欢

Typora 使用保姆级教程 | 看这一篇就够了 | 历史版本已被禁用

【流程图】

DP4398:国产兼容替代CS4398立体声24位/192kHz音频解码芯片

Tactile intelligent sharing - SSD20X realizes upgrade display progress bar

Mini program + e-commerce, fun new retail

For Qixi Festival, I made a confession envelope with code

腾讯136道高级岗面试题:多线程+算法+Redis+JVM

share总结

如何将 DevSecOps 引入企业?

Performance testing with Loadrunner
随机推荐
详解八大排序
Will the 2023 PMP exam use the new version of the textbook?Reply is here!
string类简介
[One step in place] Jenkins installation, deployment, startup (complete tutorial)
Use Patroni callback script to bind VIP pit
day13--postman interface test
leetcode 12. Integer to Roman numeral
Dynamic programming of the division of numbers
npm报错Beginning October 4, 2021, all connections to the npm registry - including for package installa
【云原生--Kubernetes】Pod资源管理与探针检测
SLSA 框架与软件供应链安全防护
代码重构:面向单元测试
C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.2 我的代码为什么无法运行
TSF微服务治理实战系列(一)——治理蓝图
8款最佳实践,保护你的 IaC 安全!
The 2022 PMP exam has been delayed, should we be happy or worried?
The Road to Ad Monetization for Uni-app Mini Program Apps: Full Screen Video Ads
2023年PMP考试会用新版教材吗?回复来了!
DataTable使用Linq进行分组汇总,将Linq结果集转化为DataTable
Plus版SBOM:流水线物料清单PBOM