关注我的公众号:【编程朝花夕拾】,可获取首发内容。
01 引言
Binlog技术大家应该耳熟能详了,遇到实在无法解释数据的变化,就只能请出Binlog终极大招,来查数据的变化。它在项目中是如何使用的呢,以及遇到应用的场景是什么样的?
02 Binlog基础概念
Binlog(Binary Log)是 MySQL 的二进制日志,记录了对数据库执行的所有更改操作(DDL 和 DML),但不包含 SELECT 和 SHOW 等查询操作。
2.1 主要作用
- 数据复制:主从复制的基础
- 数据恢复:基于时间点的数据恢复
- 数据同步:异构系统间的数据同步
- 数据分析:数据变更审计和分析
2.2 Binlog 的三种格式
| 格式 | 特点 | 适用场景 |
|---|---|---|
| STATEMENT | 记录 SQL 语句 | 日志量小,但可能存在不确定性 |
| ROW | 记录每行数据的变更 | 数据一致性好,日志量大 |
| MIXED | 混合模式 | 根据情况自动选择以上两种 |
应用框架中解析Binlog多采用的格式是:ROW
03 应用框架
应用的框架主要分为两类:嵌入式和独立部署
3.1 嵌入式
嵌入式的框架需要在项目引入依赖,直接集成在项目使用,具有一定的侵入性。比较早的框架:mysql-binlog-connector-java
mysql-binlog-connector-java是Github上开源的一款产品,有2.3K的star,846的Fork。很多开源框架都是根据其演变而来。
GitHub地址:github.com/shyiko/mysq…
另一款是出自dromara社区的binlog4j,它底层就是用了上面的框架(因为我看到shyiko包的日志了)。它支持 传统项目 与 Spring Boot 项目集成,同时兼容 Spring Boot 2.x 与 3.x 版本,算是比较新的框架了。但是自动更新1.9.1版本之后,已经2年没有更新了,提问的Issues也无人问津。
Gitee地址:gitee.com/dromara/bin…
3.2 独立部署
独立部署的框架有很多,有付费的也有免费的。
CloudCanal:社区虽然免费,但是同步任务限制了5个,除非放血使用商业版。当然CloudCanal的功能更加强大,类似工具还有很多,各大厂商都有自己的DTS。这个收到一定的限制,显然不是我们的首选。Canal:阿里的开源产品,是一个优秀的同步框架,也需要搭建服务,支持将监听的数据Sink到其他中间件里面。Maxwell:是国外的一个同步软件,类似的阿里的Cannal,但是没有Cannal的功能强大。FlinkCDC:是Flink实时计算框架衍生的一款工具,虽然开源,但是使用成本比较高,需要有一定的Flink基础。
04 使用场景
数据库同步我们暂且不管,无论是异构数据库,还是主从同步。各个厂商都有独属于自己的DTS同步工具,我们就聊聊项目中可以用到的场景。
4.1 双写一致性
缓存与数据库的一致性问题可以通过监听Binlog解决。面试八股文中都会问到双写一致性的问题。
无论是先更新数据库还是先更新缓存,都是从代码层面主动发起额修改。而Binlog为我们提供了另一种思路。
我们业务代码只需要操作数据库即可,缓存就可以通过监听数据库Binlog来更新。但是对于少量的数据来说,这种方式有显的有点复杂,没有直接删除缓存在加载数据来的实在。
4.2 解耦
正常的业务中,我们对于数据的更新,都是通过同步、多线程、MQ等方式进行。但是业务的入口比较多,我们可以使用Binlog的方式监听主要节点的变更,然后处理对应的逻辑。
4.3 业务监控
随着业务复杂度的增大,很多时候我们需要对于重要的节点数据监控,然后推送消息。面临的问题如同4.2一致,入口无法完全统计。通过Binlog监控需要监控的节点,然后根据业务推送不同的消息。
05 小结
使用Binlog的方式比较多,嵌入式的做法可以应对比较简单的场景,但是对于复杂的场景,代码就会冗余。个人比较倾向于独立部署的方式,因为独立,所以可以应对更多的场景,又完全解耦业务代码。