狩猎摸拟器
52.83M · 2026-02-06
Binlog技术大家应该耳熟能详了,遇到实在无法解释数据的变化,就只能请出Binlog终极大招,来查数据的变化。它在项目中是如何使用的呢,以及遇到应用的场景是什么样的?
Binlog(Binary Log)是 MySQL 的二进制日志,记录了对数据库执行的所有更改操作(DDL 和 DML),但不包含 SELECT 和 SHOW 等查询操作。
| 格式 | 特点 | 适用场景 |
|---|---|---|
| STATEMENT | 记录 SQL 语句 | 日志量小,但可能存在不确定性 |
| ROW | 记录每行数据的变更 | 数据一致性好,日志量大 |
| MIXED | 混合模式 | 根据情况自动选择以上两种 |
应用框架中解析Binlog多采用的格式是:ROW
应用的框架主要分为两类:嵌入式和独立部署
嵌入式的框架需要在项目引入依赖,直接集成在项目使用,具有一定的侵入性。比较早的框架: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…
独立部署的框架有很多,有付费的也有免费的。
CloudCanal:社区虽然免费,但是同步任务限制了5个,除非放血使用商业版。当然CloudCanal的功能更加强大,类似工具还有很多,各大厂商都有自己的DTS。这个收到一定的限制,显然不是我们的首选。Canal:阿里的开源产品,是一个优秀的同步框架,也需要搭建服务,支持将的数据Sink到其他中间件里面。Maxwell:是国外的一个同步软件,类似的阿里的Cannal,但是没有Cannal的功能强大。FlinkCDC:是Flink实时计算框架衍生的一款工具,虽然开源,但是使用成本比较高,需要有一定的Flink基础。数据库同步我们暂且不管,无论是异构数据库,还是主从同步。各个厂商都有独属于自己的DTS同步工具,我们就聊聊项目中可以用到的场景。
缓存与数据库的一致性问题可以通过Binlog解决。面试八股文中都会问到双写一致性的问题。
无论是先更新数据库还是先更新缓存,都是从代码层面主动发起额修改。而Binlog为我们提供了另一种思路。
我们业务代码只需要操作数据库即可,缓存就可以通过数据库Binlog来更新。但是对于少量的数据来说,这种方式有显的有点复杂,没有直接删除缓存在加载数据来的实在。
正常的业务中,我们对于数据的更新,都是通过同步、多线程、MQ等方式进行。但是业务的入口比较多,我们可以使用Binlog的方式主要节点的变更,然后处理对应的逻辑。
随着业务复杂度的增大,很多时候我们需要对于重要的节点数据坚控,然后推送消息。面临的问题如同4.2一致,入口无法完全统计。通过Binlog坚控需要坚控的节点,然后根据业务推送不同的消息。
使用Binlog的方式比较多,嵌入式的做法可以应对比较简单的场景,但是对于复杂的场景,代码就会冗余。个人比较倾向于独立部署的方式,因为独立,所以可以应对更多的场景,又完全解耦业务代码。