• (多级缓存)缓存同步


    对应的教程视频:

    高级篇Day4-04-缓存同步_哔哩哔哩_bilibili

    一、数据同步策略

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

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

     

     

     

    二、安装和配置Canal

     

     

    下面我们就开启mysql的主从同步机制,让Canal来模拟salve

    1.开启MySQL主从

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

    这里以之前用Docker运行的mysql为例:

    1.1.开启binlog

    打开mysql容器挂载的日志文件,我的在/tmp/mysql/conf目录:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7I8WMYyf-1662205186188)(assets/image-20210813153241537.png)]

    修改文件:

    vi /tmp/mysql/conf/my.cnf
    

    添加内容:

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

    配置解读:

    • log-bin=/var/lib/mysql/mysql-bin:设置binary log文件的存放地址和文件名,叫做mysql-bin
    • binlog-do-db=heima:指定对哪个database记录binary log events,这里记录heima这个库

    最终效果:

    1. [mysqld]
    2. skip-name-resolve
    3. character_set_server=utf8
    4. datadir=/var/lib/mysql
    5. server-id=1000
    6. log-bin=/var/lib/mysql/mysql-bin
    7. binlog-do-db=heima

    1.2.设置用户权限

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

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

    重启mysql容器即可

    docker restart mysql
    

    测试设置是否成功:在mysql控制台,或者Navicat中,输入命令:

    show master status;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvOrHLy5-1662205186193)(assets/image-20200327094735948.png)]

    2.安装Canal

    2.1.创建网络

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

    docker network create heima
    

    让mysql加入这个网络:

    docker network connect heima mysql
    

    2.3.安装Canal

    课前资料中提供了canal的镜像压缩包:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvuASqcG-1662205186198)(assets/image-20210813161804292.png)]

    大家可以上传到虚拟机,然后通过命令导入:

    docker load -i canal.tar
    

    然后运行命令创建Canal容器:

    1. docker run -p 11111:11111 --name canal \
    2. -e canal.destinations=heima \
    3. -e canal.instance.master.address=mysql:3306 \
    4. -e canal.instance.dbUsername=canal \
    5. -e canal.instance.dbPassword=canal \
    6. -e canal.instance.connectionCharset=UTF-8 \
    7. -e canal.instance.tsdb.enable=true \
    8. -e canal.instance.gtidon=false \
    9. -e canal.instance.filter.regex=heima\\..* \
    10. --network heima \
    11. -d canal/canal-server:v1.1.5

    说明:

    • -p 11111:11111:这是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=:要监听的表名称

    表名称监听支持的语法:

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

     三、监听Canal 

     Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。不过这里我们会使用GitHub上的第三方开源的canal-starter。地址:GitHub - NormanGyllenhaal/canal-client: spring boot canal starter 易用的canal 客户端 canal client

     

     

     

     

  • 相关阅读:
    有谁知道这个3D模型是哪个封装吗,power6的封装实在是找不到
    苹果关闭iOS 16和16.0.1验证通道,升级iOS 16.0.2后无法降级这2版本
    【无标题】
    elmentui el-select下拉输入不清空已选值
    Qgis加载arcgis的gdb格式数据
    数据结构——空间复杂度
    Mybatis-plus 分页 功能实现
    leetcode做题笔记175. 组合两个表
    docker文件过大,Docker容器引擎,迁移/var/lib/docker/到本机其它挂载分区或远程主机的某个分区。docker迁移
    使用github创建个人页面,以及git的两种使用方式
  • 原文地址:https://blog.csdn.net/QRLYLETITBE/article/details/126681566