MySQL与Redis缓存的同步的两种方案
方案2:解析MySQL的binlog 实现,将数据库中的数据同步到Redis。数据库每一步操作都会写入binlog,通过订阅监听binlog实时感知数据变化,根据数据变化情况删除reids并添加重试机制。
引入消息队列:若Redis删除失败,则将Redis key放入消息队列,消费端监听消息队列并删除Redis直至删除成功;
如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。
1、MySQL主从复制过程
1) Master 主库将改变记录,写入二进制日志(Binary Log)中;
2) Slave 从库向 MySQL 发送dump协议,将 Master主库的 binary log events 进行拷贝到它的中继日志(relay log)
3) Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
2、Canal的工作原理 (ROW级别)
-- $ 将自身伪装成 Slave , 假装从 Master 复制数据。
-- $ Otter是阿里用于进行异地数据库之间的同步框架,Canal是其中一部分。
https://blog.csdn.net/weixin_55769150/article/details/128997455
mysql binlog增量订阅消费+消息队列+增量数据更新到redis
1)读redis:热数据基本都在redis
2)写mysql:增删改都是操作mysql
3)更新redis数据:mysq的数据操作binlog,来更新到redis
查询
show variables like 'log_%' -- 开启 Binlog 写入功能,开启bin-log权限
SHOW VARIABLES like "%binlog_format%"; -- 配置 binlog-format 为 ROW 模式
SHOW VARIABLES like "%server_id%"; -- 主数据库的唯一值
show master status; -- 查询此主库的状态
show slave status; --查询从库的状态
show binary logs; -- 查看当前所有binlog的日志存储
show binlog events in 'mysql-bin.000001'; -- 查看当前已经消费到了什么位置
binlog配置
# windows下mysql的配置文件是my.ini。一般放到安装的根目录
# Linux下MySQL的配置文件是my.cnf,一般会放在/etc/my.cnf,/etc/mysql/my.cnf
[mysqld]
# *** Replication related settings ***
#在复制方面的改进就是引进了新的复制技术:基于行的复制。
binlog-format=ROW
#开启二进制日志功能,binlog数据位置
log-bin="mysql-binlog"
#服务端ID,用来高可用时做区分
server_id=100
#二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
#expire-logs-days=2 mysql8.x中准备作废
binlog_expire_logs_seconds=86400
# 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
server_id=100
创建Mysql ,canal,用户
#创建用户
CREATE USER canal IDENTIFIED BY 'canal';
#赋权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
#刷新
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
注意:如果使用的是阿里云的 RDS for MySQL。已经是默认打开binlog了,并且账号默认具有 binlog dump 权限, 不需要任何权限或者 binlog设置,可以直接跳过这一步
https://blog.csdn.net/zcl111/article/details/119670138
https://github.com/alibaba/canal/releases
cd /usr/local
mkdir canal
tar -zxvf canal.deployer-1.1.6.tar.gz -C /usr/local/canal/
这个文件是 canal 的基本通用配置,canal 端口号默认就是 11111
vim /usr/local/canal/canal.properties
修改 instance.properties
进入example目录,修改instance.properties配置文件
vi /usr/local/canal/example/instance.properties
canal.instance.mysql.slaveId=5
canal.instance.master.address=rm-wz90xxxu7.mysql.rds.aliyuncs.com:3306
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
注:不配置canal.instance.tsdb相关属性。
常见的匹配规则:
所有表:.* or .\…
canal schema下所有表: canal\…*
canal下的以canal打头的表:canal.canal.*
canal schema下的一张表:canal.test1
多个规则组合使用:canal\…*,mysql.test1,mysql.test2 (逗号分隔)
链接:https://blog.csdn.net/yy139926/article/details/127768446
server 代表一个 canal 运行实例,对应于一个 jvm
instance 对应于一个数据队列 (1个 canal server 对应 n个 instance )
instance 下的子模块:
eventParser: 数据源接入,模拟 slave 协议和 master 进行交互,协议解析
eventSink: Parser 和 Store 链接器,进行数据过滤,加工,分发的工作
eventStore: 数据存储
metaManager: 增量订阅 & 消费信息管理器
链接:https://blog.csdn.net/yy139926/article/details/127768446
top.javatool
canal-spring-boot-starter
1.2.1-RELEASE
canal:
server: localhost:11111
destination: example
屏蔽日志
logging:
level:
tracer: trace # 开启trace级别日志,控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.
#top.javatool.canal.client: warn #禁止AbstractCanalClient 打印常規日志 获取消息 {}
import com.java.pojo.SysDictData;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;
@CanalTable("sys_dict_data") //要监听的表
@Component
public class CacalHandlerService implements EntryHandler {
@Override
public void insert(SysDictData t) { log.info("canal insert event." + t); }
@Override
public void update(SysDictData before, SysDictData after) { log.info("canal update event." + after); }
@Override
public void delete(SysDictData t) { log.info("canal delete event." + t); }
}
SpringBoot整合Canal实现缓存一致性
https://blog.csdn.net/qq_49059667/article/details/124076985
Canal1.1.6安装部署
https://blog.csdn.net/weixin_47491957/article/details/127967141