一,数据同步策略
缓存数据同步常见方式有三种:
- 设置有效期:给缓存设置有效期,到期后自动删除,再次查询时更新
- 优点:简单。方便
- 缺点:时效性差,缓存过期之前可能不一致
- 场景:更新频率较低,时效性要求较低的业务
- 同步双写:在修改数据库的同时,直接修改缓存
- 优点:时效性强,缓存与数据库强一致
- 缺点:对代码入侵,耦合度高
- 场景:对一致性,时效性要求较高的缓存数据
- 异步通知:修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
- 优点:低耦合,可以同时通知多个缓存服务
- 缺点:时效性一般,可能存在中间不一致状态
- 场景:时效性要求一般,有多个服务需要同步
二,Canal介绍
Canal,翻译为水道/管道/沟渠,Canal是阿里巴巴旗下开源项目,基于Java开发,基于数据库增量日志解析,提供增量数据订阅&消费:github.com/alibaba/can…
Canal是基于Mysql的主从同步来实现的,MySQL主从同步原理如下:
三,安装Canal
-
开启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
-
设置用户权限
接下来添加一个仅用于数据同步的账号,出于安全考虑,这里仅提供对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; -
创建网络
我们需要创建一个网络,将MySQL,Canal放到同一个Docker网络中
docker network create heima让mysql加入这个网络
docker network connect heima mysql -
安装Canal
说明:
-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
变量名驼峰自动转换,不需要加@Column