• springboot集成canal实现同步双写


    一.canal服务端

    canal 是阿里巴巴 MySQL 数据库 Binlog 的增量订阅 & 消费组件。基于数据库增量日志解析,提供增量数据订阅 & 消费。

    二.基于docker搭建

    在docker环境中

    1.执行 docker search canal 获取到需要下载的canal镜像

    2.执行docker pull 选择下载的canal镜像

    3.执行run

    1. docker run \
    2. --name canal \
    3. -p 11111:11111 \
    4. -d canal/canal-server:latest

    4.获取配置文件到宿主机

    1. 进入canal
    2. docker exec -it canal /bin/bash
    3. //查看对应的conf文件在那个目录
    4. 复制配置文件到宿主机指定目录
    5. docker cp /home/admin/canal-server/conf /docker/canal/config

    3.在自己的liunx系统创建需要挂载的文件夹 我这边创建了config和logs文件

    1. docker run \
    2. --name canal \
    3. -p 11111:11111 \
    4. -v /docker/canal/config:/home/admin/canal-server/conf \
    5. -v /docker/canal/logs:/home/admin/canal-server/logs \
    6. -d canal/canal-server:latest

    4.修改canal.properties配置

    重要配置:

    # canal端口
    canal.port = 11111
    
    # 可以支持tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
    canal.serverMode = tcp
    #实例名称,可以配置多个,配置多个会生产多个文件夹
    canal.destinations = example

    5.修改对应实力instance.properties配置

    重要配置:

    # 配置你连接的数据库地址
    canal.instance.master.address=127.0.0.1:3306
    # 配置数据库的username/password
    canal.instance.dbUsername=root
    canal.instance.dbPassword=123456
    # table regex 监听的数据库规则
    #.your_database 表示你要同步的数据库名,\\.表示匹配一个点号(.)的转义字符,.在正则表达式中表示匹配任意字符,因此需要转义表示匹配点号。.*表示匹配所有以 your_database.开头的字符串。
    canal.instance.filter.regex=your_database\\..*
    三.开启binglog日志

     1.使用canal需要mysql开启binlog日志

    1. [mysqld]
    2. #设置服务器id(确保唯一)
    3. server-id=666
    4. #设置日志个数默认ROW 根据需求选择
    5. binlog_format=ROW
    6. #开启binlog日志(mysql-bin 日志名称)
    7. log-bin=mysql-bin
    8. #设置需要复制的数据库,默认复制全部
    9. #binlog-do-db=mydb

    2.重启mysql服务

    systemctl restart mysqld

    3.查看状态(如果不为空则配置成功)

    SHOW MASTER STATUS;
    四.集成canal

    1.引入jar

    1. <!-- canal 同步双写-->
    2. <dependency>
    3. <groupId>top.javatool</groupId>
    4. <artifactId>canal-spring-boot-starter</artifactId>
    5. <version>1.2.1-RELEASE</version>
    6. </dependency>

    2.yml配置

    1. canal:
    2. server: 192.168.1.1:11111
    3. destination: example

    3.代码

    1. import lombok.Data;
    2. import javax.persistence.Column;
    3. import javax.persistence.Id;
    4. @Data
    5. public class UserBean {
    6. @Id
    7. public Integer id;
    8. @Column(name = "name")
    9. public String name;
    10. @Column(name = "age")
    11. public Integer age;
    12. @Override
    13. public String toString() {
    14. return "UserBean{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
    15. }
    16. }
    1. import com.pw.canal.bean.UserBean;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.stereotype.Component;
    4. import top.javatool.canal.client.annotation.CanalTable;
    5. import top.javatool.canal.client.handler.EntryHandler;
    6. @Slf4j
    7. @CanalTable("sc_user")
    8. @Component
    9. public class UserBeanHandler implements EntryHandler<UserBean> {
    10. @Override
    11. public void insert(UserBean userBean ) {
    12. log.info("对象{}",userBean );
    13. //添加本地缓存
    14. //添加redis缓存
    15. }
    16. @Override
    17. public void update(UserBean before, UserBean after) {
    18. log.info("对象{}",before);
    19. log.info("对象{}",after);
    20. //添加本地缓存
    21. //添加redis缓存
    22. }
    23. @Override
    24. public void delete(UserBean userBean ) {
    25. log.info("对象{}",userBean );
    26. //添加本地缓存
    27. //添加redis缓存
    28. }
    29. }
    五.注意

    1.如果控制台又打印日志,但是没有进入hardler,注意对象的转换字段类型是否匹配.

    2.mysql配置文件中,是否设置了 binlog_format=ROW 

  • 相关阅读:
    【java期末复习题】第3章 运算符与流程控制
    简历技术栈redis点
    注册Java 引用类型 (class、interface) 用法总结详解
    【数据结构取经之路】希尔排序
    从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)
    C3P0反序列化链分析
    【kotlin 协程】万字协程 一篇完成kotlin 协程进阶
    linux安装Promethus普罗米修斯监控
    Linux——匿名管道
    Facebook内容的类型
  • 原文地址:https://blog.csdn.net/weixin_42714661/article/details/132977801