canal
在实现缓存和数据库数据一致性的时候,我们会用到延时双删等同步策略,但是在删除缓存失败时,会再次出现缓存和数据库不一致的问题。为了应对删除缓存失败的情况,可以通过回溯数据库日志文件,提供一个保障的重试机制即可。
流程如下图所示:
(1)更新数据库数据
(2)数据库会将操作信息写入binlog日志当中
(3)订阅程序提取出所需要的数据以及key
(4)另起一段非业务代码,获得该信息
(5)尝试删除缓存操作,发现删除失败
(6)将这些信息发送至消息队列
(7)重新从消息队列中获得该数据,重试操作。
可以借鉴阿里的方法:使用中间件canal,可以完成订阅binlog日志的功能,工作原理为:
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
canal将自己伪装成mysql的从库,从主库那里消费并解析binlog,通过日志来保持数据的一致性。
搭建mysql环境
- 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
- canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限 ,授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
以上就是修改mysql的配置,这个配置一般是再/etc/my.cnf中
针对已有的账户可通过grants查询权限
show grants for 'canal'
搭建canal环境
- 下载 canal, 访问 release 页面 , 选择需要的包下载, 如以 1.0.17 版本为例