对应的教程视频:
一、数据同步策略
缓存数据同步的常见方式有三种:
•设置有效期:给缓存设置有效期,到期后自动删除。再次查询时更新
•优势:简单、方便
•缺点:时效性差,缓存过期之前可能不一致
•场景:更新频率较低,时效性要求低的业务
•同步双写:在修改数据库的同时,直接修改缓存
•优势:时效性强,缓存与数据库强一致
•缺点:有代码侵入,耦合度高;
•场景:对一致性、时效性要求较高的缓存数据
•**异步通知:**修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
•优势:低耦合,可以同时通知多个缓存服务
•缺点:时效性一般,可能存在中间不一致状态
•场景:时效性要求一般,有多个服务需要同步
二、安装和配置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)]
修改文件:
1 | vi /tmp/mysql/conf/my.cnf |
添加内容:
1 | log-bin=/var/lib/mysql/mysql-bin |
配置解读:
log-bin=/var/lib/mysql/mysql-bin
:设置binary log文件的存放地址和文件名,叫做mysql-binbinlog-do-db=heima
:指定对哪个database记录binary log events,这里记录heima这个库
最终效果:
1 | [mysqld] |
1.2.设置用户权限
接下来添加一个仅用于数据同步的账户,出于安全考虑,这里仅提供对heima这个库的操作权限。
1 | create user canal@'%' IDENTIFIED by 'canal'; |
重启mysql容器即可
1 | docker restart mysql |
测试设置是否成功:在mysql控制台,或者Navicat中,输入命令:
1 | show master status; |
2.安装Canal
2.1.创建网络
我们需要创建一个网络,将MySQL、Canal、MQ放到同一个Docker网络中:
1 | docker network create heima |
让mysql加入这个网络:
1 | docker network connect heima mysql |
2.3.安装Canal
课前资料中提供了canal的镜像压缩包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvuASqcG-1662205186198)(assets/image-20210813161804292.png)]
大家可以上传到虚拟机,然后通过命令导入:
1 | docker load -i canal.tar |
然后运行命令创建Canal容器:
1 | docker run -p 11111:11111 --name canal \ |
说明:
-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正则表达式. |
三、监听Canal
Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。不过这里我们会使用GitHub上的第三方开源的canal-starter。地址:GitHub - NormanGyllenhaal/canal-client: spring boot canal starter 易用的canal 客户端 canal client