解析mysqlbinlog日志_Mysql binlog应用场景与原理深度剖析

专注于Java领域优质技术,欢迎关注

作者:田守枝 田守枝的技术博客

本文深入介绍Mysql Binlog的应用场景,以及如何与MQ、elasticsearch、redis等组件的保持数据最终一致。最后通过案例深入分析binlog中几乎所有event是如何产生的,作用是什么。

1 基于binlog的主从复制

Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制。复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他MySQL数据库服务器(slave),以实现灾难恢复、水平扩展、统计分析、远程数据分发等功能。

二进制日志中存储的内容称之为事件,每一个数据库更新操作(Insert、Update、Delete,不包括Select)等都对应一个事件。

注意:本文不是讲解mysql主从复制,而是讲解binlog的应用场景,binlog中包含哪些类型的event,这些event的作用是什么。你可以理解为,是对主从复制中关于binlog解析的细节进行深度剖析。而讲解主从复制主要是为了理解binlog的工作流程。

下面以mysql主从复制为例,讲解一个从库是如何从主库拉取binlog,并回放其中的event的完整流程。mysql主从复制的流程如下图所示:

dde8c59eadce6472d4e4f98ad93ef48e.png

主要分为3个步骤:

  • 第一步:master在每次准备提交事务完成数据更新前,将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log event,简称event)
  • 第二步:slave启动一个I/O线程来读取主库上binary log中的事件,并记录到slave自己的中继日志(relay log)中。
  • 第三步:slave还会起动一个SQL线程,该线程从relay log中读取事件并在备库执行,从而实现备库数据的更新。

2 binlog的应用场景

binlog本身就像一个螺丝刀,它能发挥什么样的作用,完全取决你怎么使用。就像你可以使用螺丝刀来修电器,也可以用其来固定家具。

2.1 读写分离

最典型的场景就是通过Mysql主从之间通过binlog复制来实现横向扩展,来实现读写分离。如下图所示:

09ebf836cb007d3ce0154c6248f4677b.png

在这种场景下:

  • 有一个主库Master,所有的更新操作都在master上进行
  • 同时会有多个Slave,每个Slave都连接到Master上,获取binlog在本地回放,实现数据复制。
  • 在应用层面,需要对执行的sql进行判断。所有的更新操作都通过Master(Insert、Update、Delete等),而查询操作(Select等)都在Slave上进行。由于存在多个slave,所以我们可以在slave之间做负载均衡。通常业务都会借助一些数据库中间件,如tddl、sharding-jdbc等来完成读写分离功能。

因为工作性质的原因,笔者见过最多的一个业务,一个master,后面挂了20多个slave。笔者之前写过一篇关于数据库中间件实现原理的文章,感兴趣的读者可以参考:数据库中间件详解

2.2 数据恢复

一些同学可能有误删除数据库记录的经历,或者因为误操作导致数据库存在大量脏数据的情况。例如笔者,曾经因为误操作污染了业务方几十万数据记录。

如何将脏数据恢复成原来的样子?如果恢复已经被删除的记录?

这些都可以通过反解binlog来完成,笔者也是通过这个手段,来恢复业务方的记录。

2.3 数据最终一致性

在实际开发中,我们经常会遇到一些需求,在数据库操作成功后,需要进行一些其他操作,如:发送一条消息到MQ中、更新缓存或者更新搜索引擎中的索引等。

如何保证数据库操作与这些行为的一致性,就成为一个难题。以数据库与redis缓存的一致性为例:操作数据库成功了,可能会更新redis失败;反之亦然。很难保证二者的完全一致。

遇到这种看似无解的问题,最好的办法是换一种思路去解决它:不要同时去更新数据库和其他组件,只是简单的更新数据库即可。

如果数据库操作成功,必然会产生binlog。之后,我们通过一个组件,来模拟的mysql的slave,拉取并解析binlog中的信息。通过解析binlog的信息,去异步的更新缓存、索引或者发送MQ消息,保证数据库与其他组件中数据的最终一致。

在这里,我们将模拟slave的组件,统一称之为binlog同步组件。你并不需要自己编写这样的一个组件,已经有很多开源的实现,例如linkedin的databus,阿里巴巴的canal,美团点评的puma等。

当我们通过binlog同步组件完成数据一致性时,此时架构可能如下图所示:

2d2b9482a5a0ec5660dfaccc89b5b55e.png

增量索引

通常索引分为全量索引和增量索引。对于增量索引的部分,可以通过监听binlog变化,根据binlog中包含的信息,转换成es语法,进行实时索引更新。当然,你可能并没有使用es,而是solr,这里只是以es举例。

可靠消息

可靠消息是指的是:保证本地事务与发送消息到MQ行为的一致性。一些业务使用本地事务表或者独立消息服务,来保证二者的最终一致。Apache RocketMQ在4.3版本开源了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值