当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢

Tactile intelligent sharing - SSD20X realizes upgrade display progress bar

Shocked, 99.9% of the students didn't really understand the immutability of strings

入坑软件测试的经验与建议

高性能高可靠性高扩展性分布式防火墙架构

使用Loadrunner进行性能测试

Structure function exercise

el-Select selector bottom fixed

Turn: Management is the love of possibility, and managers must have the courage to break into the unknown

3000 words, is take you understand machine learning!
![[Cocos 3.5.2]开启模型合批](/img/d9/9e8f71c9a26c8052b11291fe3ba7ac.png)
[Cocos 3.5.2]开启模型合批
随机推荐
C Expert Programming Chapter 4 The Shocking Fact: Arrays and pointers are not the same 4.4 Matching declarations to definitions
Jenkins export and import Job Pipeline
Teenage Achievement Hackers Need These Skills
渗透测试(PenTest)基础指南
What are the steps for how to develop a mall system APP?
npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
[C language advanced] program environment and preprocessing
The 2022 PMP exam has been delayed, should we be happy or worried?
注意!软件供应链安全挑战持续升级
21 days learning challenge 】 【 sequential search
About yolo7 and gpu
Mini program + e-commerce, fun new retail
string类简介
As soon as flink cdc is started, the CPU of the source Oracle server soars to more than 80%. What is the reason?
使用Loadrunner进行性能测试
详解八大排序
[Cocos 3.5.2]开启模型合批
C专家编程 第5章 对链接的思考 5.6 轻松一下---看看谁在说话:挑战Turning测验
C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.3 什么是声明,什么是定义
OpenGL绘制一个圆锥