mysql kafka binlog_使用canal+kafka监听MySQL binlog小实践

前言

最近,想对MySQL有进一步的认识,看如何保证缓存与数据库一致性,在负责业务上也需要这方面的优化,有些文章提到使用监听MySQL binlog实现,想试下,本文纯属好奇心驱使。

所用工具:MySQL + Canal + Kafka

MySQL binlog简介

binlog是MySQL server层维护的一种二进制日志,与innodb等存储引擎中的redo/undo log是完全不同的日志;主要是用来记录对MySQL数据更新或潜在发生更新的SQL语句,并以“事务”的形式保存在磁盘中。 那么,binlog日志的作用如下:

主从复制 数据恢复 增量备份

查看binlog相关配置: show variables like '%log_bin%';

查看binlog目录:show binary logs;

查看binlog的状态:show master status;可查看当前二进制日志文件的状态信息,显示正在写入的二进制文件,以及当前的position。

那么,再来查看binlog.000038日志内容,./mysqlbinlog /usr/local/var/mysql/binlog.000038。

ROW级别下,SQL语句需要解码,需要加解码选项,./mysqlbinlog --base64-output=decode-rows -v /usr/local/var/mysql/binlog.000038。

当然,binlog的格式也是可以设定的,分别有ROW、STATEMENT、MIXED选项。

缓存与数据库一致性

首先,根据CAP理论,一个系统同时满足C、A、P是不可能的,放弃C也不是说放弃一致性,而是放弃强一致性,追求最终一致性。

此前,项目也遇到过,缓存与数据库如何保持一致性的问题,网上形形色色的答案,但我看到有些大神往往引用Cache-Aside pattern这篇文章,文章中讲的模式就是先更新数据库,再删除缓存。

The order of the steps is important. Update the data store before removing the item from the cache. If you remove the cached item first, there is a small window of time when a client might fetch the item before the data store is updated. That will result in a cache miss (because the item was removed from the cache), causing the earlier version of the item to be fetched from the data store and added back into the cache. The result will be stale cache data. 译文:如果先删除缓存,会有短暂的时间窗口,客户端访问数据库的旧值,并且导致该key下的请求全部打到数据库,然后旧值也会重新保存到缓存。

8a5ca6b65437cc65a657a2fb80963887.png

那么,更新完数据库,删除缓存失败(概率不能说没有)时,还是会有问题。。。

1、可以使用MQ重试机制,当remove抛出异常,我们可以利用MQ异步重试删除。 2、利用监控捕捉重试异常。

写到这儿,我都快觉得我跑题了,确实这部分网上各抒己见,上面纯属个人看法。下面就是满足个人好奇心了,有文章说使用MQ监听MySQL binlog的方式异步删除缓存,删除失败继续放入MQ重试。

Canal简介

为了监听MySQL binlog我搜到美团DB数据同步到数据仓库的架构与实践文章中写到使用Canal实现binlog到Kafka的连接。

Canal译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

基于日志增量订阅和消费的业务包括

1、数据库镜像 2、数据库实时备份 3、索引构建和实时维护(拆分异构索引、倒排索引等) 4、业务 cache 刷新 5、带业务逻辑的增量数据处理

然后,我们就要开始根据QuickStart的命令去启动了,大部分都是根据官网操作的,只是遇到了几个坑。

具体命令,我就不再赘述了,具体顺序为

1、先启动kafka 2、Canal instance.properties和canal.properties,包含db、用户信息、Kafka集群及topic信息 3、根据Canal配置信息,在Kafka创建相应的topic和消费者

踩坑记录

canal.properties关键配置

instance.properties关键配置

caching_sha2_password Auth failed

用mysql -hlocalhost -P3306 -ucanal -p123 -Dzacblog登录数据库,重启canal即可。

最后效果

根据对数据库表,进行修改,Canal会通过Kafka发出消息,在Consumer接收到的消息格式如下。

INSERT语句,data为关键字段

UPDATE语句,更新字段用old的list来表示

DELETE语句,data为关键字段

ALTER TABLE,直接是语句

小结

本文从MySQL binlog出发,途径缓存-数据库一致性的讨论,最后为了满足好奇心,简单动手监听了下binlog改动的Kafka消息。

其实,在实际开发当中,我们也可以参照这个消息格式,对数据库的增删改,发出对应的业务消息,这个消息格式,我觉得还是有借鉴意义的。

参考文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值