文章目录

  • 一、前言
  • 二、docker-compose部署canal
    • docker-compose-canal.yml
  • 三、`canal-admin`可视化管理
    • 1、canal.properties
    • 2、example/instance.propertios
  • 四、springboot整合canal实现数据同步
    • 1、`pom.xml`引入mq依赖
    • 2、`application.yml`配置
    • 3、mq监听canal消息数据
    • 4、测试
  • 五、canal-spring-boot-starter
    • 1、`pom.xml`中引入依赖
    • 2、`application.yml`配置
    • 3、监听canal数据 -- 订阅数据库增删改操作
  • 本文案例demo源码

一、前言

canal:阿里巴巴 MySQL binlog 增量订阅&消费组件
https://github.com/alibaba/canal

tips: 环境要求和配置参考 https://github.com/alibaba/canal/wiki/AdminGuide

这里额外提下Redis缓存和MySQL数据一致性解决方案

  1. 延时双删策略
  2. 异步更新缓存(基于订阅binlog的同步机制)

我们的canal即可作为MySQL binlog增量订阅消费组件+MQ消息队列将增量数据更新到redis

二、docker-compose部署canal

tips: 详情可查看 https://gitee.com/zhengqingya/docker-compose

# 准备
git clone https://gitee.com/zhengqingya/docker-compose.git
cd docker-compose/Liunx# 导入初始化SQL
Liunx/canal/canal_admin/canal_manager.sql# 运行  (tips:先修改配置文件信息)
docker-compose -f docker-compose-canal.yml -p canal up -d

相关配置文件

docker-compose-canal.yml
# 可参考 https://github.com/alibaba/canal/wiki/QuickStartversion: '3'# 网桥canal -> 方便相互通讯
networks:canal:services:canal_admin:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5      # 原镜像`canal/canal-admin:v1.1.5`container_name: canal_admin               # 容器名为'canal_admin'restart: unless-stopped                   # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录- "./canal/canal-admin/bin/startup.sh:/home/admin/canal-admin/bin/startup.sh"- "./canal/canal-admin/logs:/home/admin/canal-admin/logs"environment: # 设置环境变量,相当于docker run命令中的-eTZ: Asia/ShanghaiLANG: en_US.UTF-8canal.adminUser: admincanal.adminPasswd: 123456spring.datasource.address: www.zhengqingya.com:3306spring.datasource.database: canal_managerspring.datasource.username: rootspring.datasource.password: rootports:- "8089:8089"networks:- canalcanal_server:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5      # 原镜像`canal/canal-server:v1.1.5`container_name: canal_server              # 容器名为'canal_server'restart: unless-stopped                   # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器volumes:                                  # 数据卷挂载路径设置,将本机目录映射到容器目录- "./canal/canal-server/logs:/home/admin/canal-server/logs"environment:                              # 设置环境变量,相当于docker run命令中的-eTZ: Asia/ShanghaiLANG: en_US.UTF-8canal.register.ip: www.zhengqingya.comcanal.admin.manager: canal_admin:8089canal.admin.port: 11110canal.admin.user: admincanal.admin.passwd: 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9ports:- "11110:11110"- "11111:11111"- "11112:11112"depends_on:- canal_adminlinks:- canal_adminnetworks:- canal

访问地址:http://ip地址:8089
默认登录账号密码:admin/123456


三、canal-admin可视化管理

tips: 页面使用自行多点点就会了^_^
将数据投递到RabbitMQ配置为例,附带些其中重要的配置信息
mq的交换机和队列可通过后面java代码自动生成,无需自己手动建立

1、canal.properties

# canal admin config
#canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9# tcp, kafka, rocketMQ, rabbitMQ
canal.serverMode = rabbitMQrabbitmq.host = www.zhengqingya.com:5672
rabbitmq.virtual.host = my_vhost
rabbitmq.exchange = canal.exchange
rabbitmq.username = admin
rabbitmq.password = admin

2、example/instance.propertios

canal.instance.master.address=www.zhengqingya.com:3306
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8# table regex 只同步test数据库下的t_user表
canal.instance.filter.regex=test\\.t_user
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*# mq config
canal.mq.topic=canal_routing_key

四、springboot整合canal实现数据同步

1、pom.xml引入mq依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、application.yml配置

# RabbitMQ配置
spring:rabbitmq:addresses: www.zhengqingya.com:5672,www.zhengqingya.com:5673 # 指定client连接到的server的地址,多个以逗号分隔# 填写自己安装rabbitmq时设置的账号密码,默认账号密码为`guest`username: adminpassword: adminvirtual-host: my_vhost # 填写自己的虚拟机名,对应可查看 `127.0.0.1:15672/#/users` 下Admin中的`Can access virtual hosts`信息

3、mq监听canal消息数据

@Slf4j
@Component
public class CanalRabbitMqListener {@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = MqConstant.CANAL_QUEUE, durable = "true"),exchange = @Exchange(value = MqConstant.CANAL_EXCHANGE),key = MqConstant.CANAL_ROUTING_KEY)})public void handleCanalDataChange(String message) {log.info("[canal] 接收消息: {}", JSON.toJSONString(message));}}
public interface MqConstant {String CANAL_EXCHANGE = "canal.exchange";String CANAL_QUEUE = "canal_queue";String CANAL_ROUTING_KEY = "canal_routing_key";}

4、测试

先启动项目让程序自动建立所需mq中的交换机和队列

再修改canal监听的表数据

查看程序监听的mq消息数据如下,拿到数据就可以进行数据解析处理了…

五、canal-spring-boot-starter

tips: 可参考 https://github.com/NormanGyllenhaal/canal-client
此方式需将canal.properties配置文件中的canal.serverMode属性值修改为tcp

1、pom.xml中引入依赖

<!-- https://mvnrepository.com/artifact/top.javatool/canal-spring-boot-starter -->
<dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version>
</dependency>

2、application.yml配置

canal:server: www.zhengqingya.com:11111destination: example # tips:canal-admin中Instance管理下需存在example实例配置

3、监听canal数据 – 订阅数据库增删改操作

@Slf4j
@Component
@CanalTable(value = "t_user")
public class UserHandler implements EntryHandler<User> {@Overridepublic void insert(User user) {log.info("insert message  {}", user);}@Overridepublic void update(User before, User after) {log.info("update before {} ", before);log.info("update after {}", after);}@Overridepublic void delete(User user) {log.info("delete  {}", user);}}
@Data
@Table(name = "t_user")
public class User implements Serializable {/*** 主键*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "user_id")private Integer userId;/*** 用户名*/@Column(name = "username")private String username;/*** 密码*/@Column(name = "password")private String password;/*** 性别*/@Column(name = "sex")private Integer sex;/*** 备注*/private String remark;/*** 时间*/private Date date;}

经测试发现这个jar存在一些bug,ex:针对表字段,数据原本为空,修改为有值的时候,如果java这边用非String字段类型去接收会报错!

本文案例demo源码

https://gitee.com/zhengqingya/java-workspace


今日分享语句:
如果心胸不似海,又怎能有海一样的事业。

SpringBoot(53) 整合canal实现数据同步相关推荐

  1. Springboot:整合redis对接口数据进行缓存

    文章目录 Springboot:整合redis对接口数据进行缓存 一.注解及其属性介绍 @Cacheable @CacheEvict @CachePut @CacheConfig 二.代码实现 1.创 ...

  2. canal mq数据同步

    canal mq数据同步 官网:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart ************** ...

  3. php阿里的同步工具canal,基于阿里的Canal实现数据同步

    一.开启同步数据库的binlog功能 (1)开启同步数据端的数据库服务(比如我的将一号虚拟机上的mysql数据库作为同步操作数据库) systemctl start mysql.service mys ...

  4. canal mysql 数据同步

    首先canal是什么呢? canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL:简单来说,canal 会将自己伪装成 ...

  5. solr mysql 自动同步_MongoDB和Solr的整合以及实现数据同步功能

    使用mongo-connector实现mongodb与solr数据同步: 1.solr搭建.这个我有记录,可以去找,这里不说了.(此次采用solr版本为4.7) 2.mongo搭建,要搭建集群,就是副 ...

  6. canal mysql数据同步mysql

    前言 canal 数据实时同步,读取Mysql Binlog 日志, 首先需要开启Binlog日志 一.canal 是什么? canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量 ...

  7. java中SpringBoot项目定时将MySql数据同步到ES中

    项目所用依赖 <modelVersion>4.0.0</modelVersion><artifactId>tm-shop-model</artifactId& ...

  8. 数据同步的解决方案Canal

    Canal实现数据同步的原理: 1.是根据模拟mysql slave的主从交互协议,伪装自己是mysql slave,向mysql master发送dump请求. 2.mysql master收到du ...

  9. 大数据同步工具Canal

    目录 1 什么是canal 2 canal能做什么 3 如何搭建canal 3.1 首先有一个MySQL服务器 3.2 安装canal 4 Java客户端操作 5 总结 6 ClientAdapter ...

  10. SAP工具箱 数据同步平台(九 与PO整合)

    点击蓝字 关注我们 一 前言 数据同步平台是在ABAP中开发的一个数据同步工具,类似于LTRC,通过配置实现任意两个数据库的数据同步(ABAP需要配置相关的外部数据库连接). 数据同步平台的底层通过调 ...

最新文章

  1. 5种云计算安全基础知识和最佳实践
  2. GridSearchCV和交叉熵
  3. protobuf2和3同时安装_在 Ubuntu 上安装 Protobuf 3 的教程详解
  4. 快速构建网站或移动端页面:关于Bootstrap的学习笔记
  5. 多维数组做参数,内存可以看做是线性的
  6. 大数据分析,在中国找个身高1米7年入20万的老公,到底有多难?
  7. python 拦截windows弹窗广告_Win10如何拦截桌面弹窗广告?流氓软件怎么彻底清除?...
  8. 天才小毒妃 第922章 把金针还给我
  9. 农业物联网系统功能特点
  10. 在ubuntu上搭建IC数模混合环境
  11. ThinkPHP中IP地址定位,包括IP地址库文件
  12. 力扣(566.303)补8.25
  13. android底部导航切换实现(md)
  14. C语言——大整数加法
  15. android 一天多少毫秒,Android中的日期和时间以毫秒为单位
  16. XCopy复制文件夹命令及参数详解以及xcopy拷贝目录并排除特定文件
  17. 丁丽萍:云计算环境下的隐蔽信道分析
  18. R语言-HTTP协议
  19. 《老子·道德经》系列开篇
  20. python标识符区分大小写吗_python代码区分大小写吗

热门文章

  1. 求实数的整数部分和小数部分python_python求实数的整数部分
  2. Python解析XML文档
  3. matlab检验数据异方差,求教!怀特异方差检验方法在matlab中的实现,以及广义最........
  4. EPLAN史上最全部件库,官网下载,部件宏,EDZ格式,239G,导入后一劳永逸
  5. win8 机器硬盘异响
  6. NMOS和PMOS详解以及电路设计
  7. python创建excel并冻结首行
  8. 每天一练:html简单文字排版
  9. cubic算法优化_CUBIC拥塞拥塞控制算法
  10. python datetime库的基本使用