前言碎语
早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,产出了canal项目。canal的原理很简单,就是如上图片所示
-
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
-
mysql master收到dump请求,开始推送binary log给slave(也就是canal)
-
canal解析binary log对象(原始为byte流)
但是今天博主要分享的不是canal,上面只是作为一个引子,因为canal的使用相对mysql-binlog-connector-java麻烦点,不仅需要客户端写消费逻辑,还需要部署一套canal的server端,server还依赖的zookeeper组件。所以,今天分享一个简单应用的组件mysql-binlog-connector-java
什么是binlog?
binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;
mysql中的binlog?
MySQL的binlog作用类似于Oracle的归档日志,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)
binlog有三种格式:Statement、Row以及Mixed。
- –基于SQL语句的复制(statement-based replication,SBR),
- –基于行的复制(row-based replication,RBR),
- –混合模式复制(mixed-based replication,MBR)。
每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。
ps:相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。
Row
binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题.
Mixed
在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
开启mysql的binlog?
log-bin=mysql-bin #添加这一行就ok
binlog-format=row #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
在mysql的my.ini配置文件中加上如上配置后重启mysql
验证是否开启binlog?
创建项目,加入binlog消费组件?
com.github.shyikomysql-binlog-connector-java0.9.0
连接mysql,监听数据库操作?
数据库sql测试脚本?
回到程序看到已经监听到数据库操作了
典型的应用场景
除了很多主从备份,主从复制等产品外,应用在同步msyql数据库数据到ElasticSearch,solr等索引引擎等使用也是非常的nice啊
可选的binlog解析组件
本文的mysql-binlog-connector-java:https://github.com/shyiko/mysql-binlog-connector-java
阿里的canal:https://github.com/alibaba/canal
点评的puma:https://github.com/dianping/puma