MySQL Binlog的那些个用途

MySQL作为一个可插拔式的数据库系统,支持插件式的存储引擎。在设计上,MySQL分为Server层和Storage层,Server层主要包括数据库连接池、SQL语法解析器、优化器、复制等,Storage层主要负责数据的存储、索引的存储等。Binlog作为Server层的日志系统,主要以events的形式顺序纪录了数据库的各种操作,同时可以纪录每次操作所花费的时间。在MySQL官方文档上,主要介绍了Binlog的两个最基本核心作用:备份和复制。
之所以说这是Binlog的两个最基本功能,是因为很多公司都对这两个功能进行了进一步扩张,比如很多公司都利用复制来实现数据库的高可用,比如网易的RDS;而DBA热衷于使用Binlog进行备份,主要是看中可以使用Binlog的备份完成Point-In-Time Restore和flash back功能,使得数据可以回滚到某一个完整地时刻点,比如AWS RDS ,阿里 RDS,网易RDS都提供了Point-In-Time Restore的功能,网易RDS在接下来还会提供flash back功能。

那是不是Binlog就只能做这些事情呢?

先看看下面两个业务场景:
场景一: 一个朋友知道我在学习MySQL,就问了我一个关于MySQL的问题,这里给大家说说,看大家有什么好的想法。他问:现在一个表格差不多有1000w条记录,不想每次都query所有的数据,有么有一种方式只拿出一段时间内更新过的数据?
场景二:在大数据时代,相信很多公司都有对数据库中数据进行离线分析的需求,最简单的实现方案,就是每隔一段时间将数据库中的所有数据荡下来进行分析,对于许多小库来讲这也许可行,对于很多动不动500G的大库来说很显然是不切实际的,如何优雅地解决这种问题?
分析这两个业务需求,其实说的是同一件事,如何增量地获取数据库中更新过的数据?有点像Copy On Write的诉求,只获取更新过的数据。
在介绍具体的解决方案前,来看看下面一段话, 这段话是耙自去哪儿高级DBA   nettedfish  博文里面的一段话(原博文

我们重点关注红色方框中的那句,是不是有种恍然大悟的赶脚。的确,可以通过解析binlog来实现增量获取变更数据的需求。binlog可以基于binlog filename + binlog position定位唯一一个event,因此只要每次获取数据之后记录此时的binlog filename和binlog position,下次就可以从这个位置开始增量地获取新增的event,基于event就可以解析出变更后的数据。

除此之外,还有一种特殊的业务需求:比如很多电商都对订单价格特别敏感,一旦数据库中的订单价格发生变动,上层应用需要马上得到通知,而不是继续使用cache中的脏数据。这种业务场景就是典型的数据订阅消费,如何实现这种需求呢?
ORACLE数据库的JDBC支持Database Change Notification的功能,可以很方便的支持这种功能需求,可遗憾的是MySQL JDBC却没有这种feature。其实还有一种解决方案,就是使用trigger+Http的方式实现,一旦用户关注的数据发生更新,就会触发自定义的trigger,trigger再将更新后的数据通过HTTP的方式发送给应用方,这种解决方案可以参考开源工具 mysql-udf-http 。是不是很麻烦,而且真心不通用。这个时候纠结了吧,别着急,来看看Binlog。
我们都知道MySQL是基于Binlog实现的主从复制,复制原理见下图:
一旦主上有事务提交,Master就会将事务写到Binlog并发送给Slave,Slave回放接收到的Binlog就可以得到一份和Master完全相同的数据。这也是很多公司实现数据库高可用的基本方案。
那能不能基于此实现数据订阅消费呢? 这里简单介绍一个基于Binlog实现数据订阅消费的开源项目 canal,其核心思想可以简要的概括为:
1. 准备阶段:创建一个进程A模拟Slave的行为,向Master请求Binlog。这样,一旦Master上的数据发生变更,都会马上将Binlog发送给此进程。
2. 订阅阶段:假设应用程序对Product表中的Price字段很敏感,就向A进程订阅Product表Price字段
3. 解析阶段:进程A接收到Master发送过来的Binlog之后对其进行解析,将解析到的数据按照一定形式存储
4. 消费阶段:在解析的过程中一旦发现Product表中的Price字段有变更,就会通知到相应的应用程序
原理是不是很简单,但实际上canal项目还是很复杂,需要模拟MySQL复制协议进行Binlog请求,对Binlog进行解析,实现canal的HA等等,对canal感兴趣的可以移步其主页

总结:MySQL Binlog作为MySQL系统中最重要的日志之一,不仅可以用来实现数据的备份和复制,在增量获取数据库数据、实现数据的订阅&消费这两个领域也是一把锋利的锐器,这篇博文主要是为用户提供一种使用Binlog实现这两种业务的思路和相关可以参考的项目。很显然,无论是哪种业务,归根到底是需要对Binlog进行解析。
本文来自网易实践者社区,经作者范欣欣授权发布。