二十七,基于Canal实现缓存同步.md

123 阅读2分钟

一,数据同步策略

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

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

image


image

二,Canal介绍

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

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

image

image

三,安装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

    image

    说明:

    • -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

image


image


image

image

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