总体流程
- 开启mysql的 主从复制的 binlog 日志
- 部署 canal服务 并配置监听的库表
- springboot集成canal
mysql相关
开启mysql 的主从复制
如果不会 docker 部署 可以点击 docker部署mysql
修改配置文件 my.cnf 。在/etc/mysql 目录下或者 /etc目录下
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=test
配置解读:
#备注:
- #server-id 服务器唯一标识。
- #log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
- #log_bin_index指定了binlog索引文件的基础命名和存储路径,也可以通过–log-bin-index来指定,index文件存储了启用的binglog文件名
- #binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
- #binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
- #其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。
添加用户
创建用户并给用户指定权限 ,改用户 用于数据同步 既然是 canal使用,用户名和密码就设置为canal吧
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
FLUSH PRIVILEGES;
部署canal
拉去canal镜像
docker部署canal的官方文档
docker pull canal/canal-server:v1.1.5 这个文件有900m
docker load 命令:
从一个存储文件或一个标准输入流中加载一个镜像
语法
docker load [OPTIONS] +准备的镜像文件名
参数说明
-i : --input string :读取一个tar文件,取代标准输入
docker load -i ${filePath}
-q : --quiet :简化输出信息
docker load -q
加载canal镜像命令
docker load -i canal.tar
canal 镜像百度云盘资源
[链接:https://pan.baidu.com/s/1GCcRGNh_ceGLJla4tiRhiQ?pwd=oa2x
提取码:oa2x]
canal的启动命令可以直接复制官网给的文档
或者 复制下面的命令
注意: 在启动canal前 如果用的docker部署的mysql 要创建一个docker网络。
创建docker网络
docker network create mynetwork
把mysql容器加入到该网络
docker network connect mynetwork mysql #后面的mysql 是启动的mysql的容易名称
启动canal命令
docker run -p 11111:11111 --name canal \
-e canal.destinations=test \ #canal 列表名称 springboot集成成是要
-e canal.instance.master.address=mynetwork :3306 \ #数据库的地址端口 mynetwork 是docker网络 ,如主机部署 可替换成ip地址
-e canal.instance.dbUsername=canal \ # 上面创建的 mysql用户名
-e canal.instance.dbPassword=canal \ # 上面创建的mysql用户密码
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=test\\..* \ # 要监听的表
--network mynetwork \ # 加入docker网络
-d canal/canal-server:v1.1.5
springboot 集成canal
流程
由于我们集成是三方提供的 canal-boot版的依赖 ,开发成本会降低很多,所以
springboot 集成canal 比较简单 ,分三个步骤:
- 引 pom
- 改配置
- 实现EntryHandler 接口
引pom
<dependency>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>
改配置
只需要指定端口号和库 和canal的实例名称
canal:
destination: test # canal的集群名字,要与安装canal时设置的名称一致
server: xx.xxx.xxx.xxx:11111 # canal服务地址 ip
实现 EntryHandler 接口
实现三个接口 新增 删除和更新 ,泛型为表示的映射实体类。
当库表发生该表时 会执行对应的这三个方法
package com.li.cannal;
import com.li.pojo.Item;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;
/**
* @author liqiuliang
* @version 1.0
* @date 2022/8/19 22:53
*/
@Component
@CanalTable("test") //指定需要监控的表名
@Slf4j
public class CanalHandle implements EntryHandler<Item> {
@Override
public void insert(Item item) {
log.info("监控到新增操作");
// 可以执行更新 redis操作
System.out.println(item);
}
@Override
public void update(Item before, Item after) {
log.info("监控到更新操作");
// 可以执行更新 redis操作
System.out.println(before);
System.out.println(after);
}
@Override
public void delete(Item item) {
// 可以执行更新 redis操作
log.info("监控到删除操作");
System.out.println(item);
}
}
测试
随便在库表里删除一条数据