前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql日志binlog消费初体验

mysql日志binlog消费初体验

原创
作者头像
kl博主
发布2018-04-13 16:43:55
2.2K0
发布2018-04-13 16:43:55
举报
文章被收录于专栏:kl的专栏
mysql日志binlog消费初体验
mysql日志binlog消费初体验

前言碎语

早期,阿里巴巴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。

  1. –基于SQL语句的复制(statement-based replication,SBR), 
  2. –基于行的复制(row-based replication,RBR), 
  3. –混合模式复制(mixed-based replication,MBR)。

Statement  每一条会修改数据的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?

bog_bin为NO表示数据库已开启

创建项目,加入binlog消费组件?

代码语言:javascript
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言碎语
  • 什么是binlog?
  • mysql中的binlog?
  • 开启mysql的binlog?
  • 验证是否开启binlog?
  • 创建项目,加入binlog消费组件?
  • 连接mysql,监听数据库操作?
  • 数据库sql测试脚本?
  • 回到程序看到已经监听到数据库操作了
  • 典型的应用场景
  • 可选的binlog解析组件
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档