网站Logo 苏叶的belog

基于Canal实现缓存同步

wdadwa
2
2026-03-30

一,数据同步策略

缓存数据同步常见方式有三种:

  • 设置有效期:给缓存设置有效期,到期后自动删除,再次查询时更新
    • 优点:简单。方便
    • 缺点:时效性差,缓存过期之前可能不一致
    • 场景:更新频率较低,时效性要求较低的业务
  • 同步双写:在修改数据库的同时,直接修改缓存
    • 优点:时效性强,缓存与数据库强一致
    • 缺点:对代码入侵,耦合度高
    • 场景:对一致性,时效性要求较高的缓存数据
  • 异步通知:修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
    • 优点:低耦合,可以同时通知多个缓存服务
    • 缺点:时效性一般,可能存在中间不一致状态
    • 场景:时效性要求一般,有多个服务需要同步

2953321-20240808221036196-1086723454.png


2953321-20240808221036165-1422734327.png

二,Canal介绍

Canal,翻译为水道 / 管道 / 沟渠,Canal 是阿里巴巴旗下开源项目,基于 Java 开发,基于数据库增量日志解析,提供增量数据订阅 & 消费:https://github.com/alibaba/canal

Canal 是基于 Mysql 的主从同步来实现的,MySQL 主从同步原理如下:

2953321-20240808221036238-808372645.png

2953321-20240808221036185-1322424300.png

三,安装Canal

  1. 开启 MySQL 主从

    Canal 是基于 MySQL 的主从同步功能的,因此必须先开启 MySQL 的主从功能

    vi /tmp/mysql/conf/my.cnf
    

    添加内容

    log-bin = /var/lib/mysql/mysql-bin
    binlog-do-db=heima
    

    配置解析:

    • log-bin = /var/lib/mysql/mysql-bin:设置binary log文件的存放地址和文件名
    • binlog-do-db=heima:指定对哪个数据库记录binary log events
  2. 设置用户权限

    接下来添加一个仅用于数据同步的账号,出于安全考虑,这里仅提供对 heima 这个库的操作权限

    create user canal@'%' IDENTIFIED by 'canal';
    GRANT Select,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%' identified by 'canal';
    FLUSH PRIVILEGES;
    

    重启 mysql,查看主从状态

    show master status;
    
  3. 创建网络

    我们需要创建一个网络,将 MySQL,Canal 放到同一个 Docker 网络中

    docker network create heima
    

    让 mysql 加入这个网络

    docker network connect heima mysql
    
  4. 安装 Canal
    2953321-20240808221036271-139214742.png

    说明:

    • -p 1111:1111:这里是canal的默认监听端口
    • -e canal.instance.master.address=mysql:3306:数据库地址和端口,如果不知道mysql容器地址可以通过docker inspect 容器id来查看
    • -e canal.instance.dbUsername=canal:数据库的用户名
    • -e canal.instance.dbPassword=canal:数据库的密码
    • -e canal.instance.filter.regex=:要监听的表名

    表名监听支持的语法

    mysql 数据解析关注的表,Perl正则表达式
    多个正则表达式之间用 (,) 分割转义符需要双斜杠 (\\)
    常见举例:
    1. 所有表:.* 或者 .*\\..*
    2. canal schema下的所有表:canal\\..*
    3. canal下以canal开头的表:canal\\.canal.*
    4. canal schema下的一张表:canal.test1
    5. 多个规则组合然后用逗号隔开:canal\\..*,mysql.test1,mysql.test2
    

四,监听Canal

2953321-20240808221036094-1197331802.png


2953321-20240808221036218-1602598802.png

2953321-20240808221036285-732231855.png

2953321-20240808221036209-942580920.png

变量名驼峰自动转换,不需要加 @Column

动物装饰