返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么使用Binlog
  • 444
分享到

怎么使用Binlog

2024-04-02 19:04:59 444人浏览 独家记忆
摘要

本篇内容介绍了“怎么使用Binlog”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不知道是否你还在为下面的

本篇内容介绍了“怎么使用Binlog”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

不知道是否你还在为下面的问题而困扰:

  • 当你使用了Redis或者其他中间件缓存的时候,经常发现缓存和数据库的数据不一致,只能通过定时任务或者缓存过期的方式去做一些限制。

  • 当你使用了ES做搜索工具,使用双写的那一套方法,还在为ES和数据库不是一个事务而担忧。

  • 当你需要迁移数据的时候,也还在使用双写的方法,如果是同一个数据库的还好,如果是不同数据库就不能保证事务,那么数据一致性也是个问题,就会写很多的修复Job和检查Job。

这些问题相信在很多同学的业务当中应该都遇到过,也可能因为这些问题常常增加了很多的工作量或者导致一些数据不一致的故障。那么我们怎么才能比较简单的解决这些问题呢?

我们想一想这个问题的本质是什么呢?就是需要保证我们的数据不论在redis还是在es都要和我们的Mysql一致,本质上是数据的复制。一想到数据的复制,熟悉mysql的朋友就会说到:Mysql的主备不也是数据复制吗?如果我们模仿Mysql的主备复制,那我们数据同步那么就会很容易了。

Mysql主从

既然我们可以模仿Mysql的主从复制来完成我们的需求,那么我们需要先了解一下mysql主从的原理,如下图所示:

怎么使用Binlog

  • Stpe 1: 作为master的mysql需要在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中,存储在本地磁盘中。

  • Step 2: 在我们的salve服务器中开启一个I/O  Thread,它会不断的从binlog中读取如果读取。如果进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。所有读取的数据都会写到Relay  log(中继日志)中。

  • Step 3:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。

在主从复制中过程中,其中最为重要的就是binlog,从库会根据binlog的信息从而来复制出一份主库的数据。

如果我们能在业务代码中拿到binlog,通过binlog的数据,复制到redis或者es中,那我们就完全不用担心数据的一致性的问题了。

binlog

binlog(Binary  Log)顾名思义就是Mysql中二进制的日志,记录了Mysql对数据库执行更改的所有操作。binlog也是server层产生的日志和我们的存储引擎没有关系,不论你使用哪种存储引擎,都可以使用我们的binlog。

binlog格式

在binlog中有三种格式,分别是:Statement,Row, Mixed三种,可以通过show variables like  'binlog_fORMat'进行查看当前数据库的binlog格式,如下图所示就是一个Row格式的binlog:

怎么使用Binlog

Statement

Statement也就是语句类型,他会记录每一条修改数据的Sql到binlog中。

?优点:空间占比是最小的,不会记录没有修改的字段。相比其他模式减少了很多的日志亮,提高I/O性能。

?缺点:异构系统不方便使用,比如redis缓存复制的时候,很难模拟mysql的从操作,需要数据重查一次。并且slave也会有问题,比如使用一些UUID函数,slave重放的时候并不能保证两边是一致的。我们可以查看下Statement的日志内容到底是什么?我们这里可以输入命令:show  master status;查看我们当前master正在使用的binlog,如下图:

怎么使用Binlog

然后再使用命令show binlog events in 'mysql-bin.000003', 查看这个日志中的内容是什么:

怎么使用Binlog

我们可以发现我们所有的操作都会在一个完整的事务中进行,如果事务没有提交是不会出现在我们的binlog当中的,这个大家可以下来进行实验一下,我们在数据库中的更新原始sql都会被完全的记录下来。

Row

Row模式和Statement不同,他会记录每一行被修改后的所有的数据:

  • 优点:异构系统也能比较方便的同步数据,并且不会出现UUID函数的那种问题,无论什么情况都能被复制。

  • 缺点:数据量比较多,比如update语句,他还会记录更新前的每一个字段和更新后的每一个字段。造成日志量比较大,对I/O有一定的影响。

同样的我们也查看一下其中的内容:

怎么使用Binlog

在show binlog events in  'mysql-bin.000004'命令中,我们发现在事务中是查看不了我们具体的数据的,这个时候就需要我们工具帮忙了mysqlbinlog,他也在mysql的bin目录下我们直接调用就好了,输入命令/usr/local/mysql/bin/mysqlbinlog  --base64-output=decode-rows -v mysql-bin.000004,我们可以看见:

怎么使用Binlog

这里展示的是一个update语句,他不仅显示了原始值,也展示了修改后的值。

这里要注意的是binlog_row_image用于决定row是否会记录原始值,默认是FULL代表会记录,也就是我们上面的这种情况,还有个参数是minimal,代表只记录更新后的值。

Mixed

在mixed模式下,MySQL默认仍然采用statement格式进行记录,但是一旦它判断可能会有数据不一致的情况(UUID函数)发生,则会采用row格式来记录。

我们目前默认使用的是Row模式,在Row模式下可以比较方便的将数据异构,其实Row模式对I/O影响在业务当中来说感知并不是特别明显。

Canal

当我们知道binlog是什么之后,我们就需要怎么去使用这个binlog。binlog的同步工具常见的有:databus,canal,maxwell,阿里云dts等等,在这里我们就不比较他们各自的优劣点了,重点去介绍canal。

canal(GitHub地址:https://github.com/alibaba/canal),译意为水道/管道/沟渠,主要用途是基于 MySQL  数据库增量日志解析,提供增量数据订阅和消费

早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010  年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。后面在阿里云中逐渐演化称DTS项目

怎么使用Binlog

canal大体原理也是模仿mysql的slave,从master上不断的去拉取binlog,然后将binlog可以投放到不同的地方,比如我们常见的消息队列kafka,RocketMQ等等。当然在阿里云的付费dts上面也是可以直接同步到redis,es或者其他的一些存储介质当中。

canal的简单使用可以查看quickStart:Https://github.com/alibaba/canal/wiki/QuickStart  ,这里不做过多的介绍。接下来主要是更多的介绍canal的整体架构,以及实现的原理等等。

Canal整体架构

怎么使用Binlog

CanalServer:一个JVM就可以理解成一个CanalServer,如果是集群模式的Canal的话 那么就会有多个CanalServer。

CanalInstance:  可以理解为一个作业为一个Instance,比如有一个把A库的binlog同步到A消息队列,B库的binlog同步到B的消息队列,那么这就是两个不同的Instance,至于哪个Instance在哪个CanalServer上跑,需要看谁先在ZK抢占到临时节点,如果分配得足够均匀得话,可以在集群模式下缓解很多压力。

CanalParser: 用于拉取mysql-binlog,并进行解析。

EventSink: 将解析的数据进行处理加工(过滤,合并等)。

CanalEventStore: 这个有点类似slave中的relay  log,用于将日志进行中继存储,但是在canal中目前只支持了在内存中存储,目前不支持落盘存储。

CanalParser,EventSink,CanalEventStore这三个都是属于Canal中非常重要的组件,他们之间的关系如下:

怎么使用Binlog

CanalParser产生数据让EventSink进行加工,加工后的数据会存储在CanalEventStore中,然后MQ从CanalEventStore中不断的拉取最新数据,然后投递到MQ。

CanalParser

我们来讲讲在CanalParser中Canal是如何伪装成slave去拉数据的,在AbstractEventParser.java这个类中有如下步骤:

  • Step1: 构建一个数据库链接,并且生成一个slaveId,用于标示自己slave的身份。

  • Step2: 获取数据库的元信息,比如binlogFormat,binRowImage等等。

  • Step3: 通过show variables like 'server_id' 命令,获取我们需要监听binlog服务的serverId。

怎么使用Binlog

Step4: 获取这一次需要消费的位置,如果有存储上一次的就从上一次中获取,如果没有的话需要通过show master  status命令中获取到的最新的Position进行消费。

怎么使用Binlog

Step5: 进行dump操作,模拟slave发送注册slave请求,以及dump  binlog请求,然后用一个死循环不断的从binlog中拉取数据:

怎么使用Binlog

Step6: 将获取到的二进制数据,根据mysql binlog协议转换成logEntry,方便后续处理。

EventSink

EventSink会将上面获取到的logEntry来进行加工:

  • 过滤:

  • 过滤空的事务

  • 过滤心跳

  • 自定义过滤

记录,这里使用了prometheus,来进行数据的统计上报。

合并,现在有很多分库分表的业务需要,他们的数据来源都是从不同的Parser中来的,但是最后都需要汇总到同一个EventStore中。在这个场景需要注意的我们可以需要注意的是会做时间归并控制,也就是尽量让每个分库的数据汇总后都是递增的方式提交,避免出现某个分库的数据比其他的领先或者落后很多。

EventStore

我们先看看EventStore中提供的接口:

怎么使用Binlog

可以看见EventStore其实就是一个简单的存储,在canal中提供了MemoryEventStoreWithBuffer,在内存中进行中转的数据,其中的原理是通过RingBuffer(无,高性能队列)实现的,有关于RingBuffer的信息可以参考我之前的文章你应该知道的Disruptor,在3.1中有对RingBuffer进行详细讲解。

然后CanalMq通过EventStore不断的获取数据,来进行数据发送。

怎么使用Binlog

“怎么使用Binlog”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么使用Binlog

本文链接: https://lsjlt.com/news/84655.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用Binlog
    本篇内容介绍了“怎么使用Binlog”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不知道是否你还在为下面的...
    99+
    2024-04-02
  • MySQL的binlog怎么使用
    这篇文章主要介绍了MySQL的binlog怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL的binlog怎么使用文章都会有所收获,下面我们一起来看看吧。MySQ...
    99+
    2024-04-02
  • 怎么在mysql中使用Binlog日志
    今天就跟大家聊聊有关怎么在mysql中使用Binlog日志,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、Statement基于SQL语句的复制,每一条会修改数据的sql都会记录在...
    99+
    2023-06-15
  • 怎么使用mysql binlog恢复数据
    这篇文章主要介绍“怎么使用mysql binlog恢复数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用mysql binlog恢复数据”文章能帮助大家解决问题。如果想通...
    99+
    2023-07-05
  • MySQL的binlog、redo log和undo log怎么使用
    这篇文章主要介绍“MySQL的binlog、redo log和undo log怎么使用”,在日常操作中,相信很多人在MySQL的binlog、redo log和undo log怎么使用问题上存在疑惑,小编查...
    99+
    2024-04-02
  • 如何使用SHOW binlog events查看binlog内容
    本篇内容主要讲解“如何使用SHOW binlog events查看binlog内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用SHOW binlog ...
    99+
    2024-04-02
  • 如何使用mysqlbinlog备份binlog搭建Binlog Server
    这篇文章给大家分享的是有关如何使用mysqlbinlog备份binlog搭建Binlog Server的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 ...
    99+
    2024-04-02
  • MySQL中如何使用binlog时binlog格式的选择
    这篇文章主要介绍MySQL中如何使用binlog时binlog格式的选择,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、binlog的三种模式1.statement level模式...
    99+
    2024-04-02
  • mysql 怎么查看binlog
    怎查看binlog binlog本身是一类二进制文件。二进制文件更省空间,写入速度更快,是无法直接打开来查看的。 因此mysql提供了命令mysqlbinlog进行查看。 一般的statement格式...
    99+
    2023-09-15
    mysql 数据库 sql
  • 如何使用mysqlbinlog查看binlog
    这篇文章主要介绍了如何使用mysqlbinlog查看binlog,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。示例[root@iz2ze6j...
    99+
    2024-04-02
  • MySQL的binlog日志使用详解
    binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但...
    99+
    2022-05-25
    MySQL binlog日志使用 MySQL binlog日志
  • MySQL中binlog日志如何使用
    本篇文章给大家分享的是有关MySQL中binlog日志如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。binlogbinlog用于记录数...
    99+
    2024-04-02
  • MySQL中binlog有什么用
    这篇文章将为大家详细讲解有关MySQL中binlog有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 一、binlog文件和文件的逻辑、物理表现形式 ...
    99+
    2024-04-02
  • MySQL中binlog日志的使用方法
    这篇文章主要介绍MySQL中binlog日志的使用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日...
    99+
    2023-06-14
  • mysql怎么清除binlog日志
    这篇文章主要介绍“mysql怎么清除binlog日志”,在日常操作中,相信很多人在mysql怎么清除binlog日志问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql怎...
    99+
    2024-04-02
  • binlog 备份是怎么样的
    本篇文章给大家分享的是有关binlog 备份是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 binlo...
    99+
    2024-04-02
  • mysql怎么关闭binlog日志
    可以通过以下步骤来关闭MySQL的binlog日志:1. 使用root用户登录MySQL服务器。2. 执行以下命令来查看当前的bin...
    99+
    2023-09-22
    mysql
  • java怎么监听binlog日志
    要监听binlog日志,可以使用MySQL的binlog监听工具。以下是使用Java进行binlog日志监听的一个示例: 首先,...
    99+
    2023-10-25
    java
  • mysql怎么删除binlog日志
    要删除MySQL的binlog日志,可以使用以下两种方法: 使用PURGE BINARY LOGS命令: PURGE BINAR...
    99+
    2024-04-09
    mysql
  • mysql5.7使用binlog 恢复数据的方法
    第一步:保证mysql已经开启binlog show variables like '%log_bin%'; log_bin 为 on是开启。 第二步:进入binlog文件目录,找到二进制日志文件 ...
    99+
    2022-05-15
    mysql binlog 恢复数据 mysql 恢复数据
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作