大家好,我是架构摆渡人。这是实践经验系列的第三篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。

binlog 用于记录用户对数据库操作的SQL语句信息,同时主从复制也是依靠binlog来实现的,由此可见binlog的重要性。

在业务中的使用场景

binlog除了数据库本身使用它实现一些功能,在业务中我们也会经常依靠binlog实现各种需求。

数据异构

基于binlog的数据异构是用的最多的一个场景,可以通过监听binlog将数据异构成其他维度,方便查询。

比如多表聚合成一张宽表,搜索相关的异构到ES中,订单可以异构成买家视角,卖家视角等等诸多场景。

缓存失效

对于高并发的互联网业务,数据库往往是最后的瓶颈,用缓存来提高性能是最常见的一种优化手段。也就是在访问数据库之后会将数据放入一份在缓存中,下次请求的时候直接从缓存取来提高响应速度和减少对数据库的压力。

一提到缓存,大家立马能想到的问题就是缓存和数据的一致性要怎么保障?这种还是得结合业务场景来讲,本身能用缓存的业务基本上还是能够接受短暂的不一致问题,也就是并非强一致性。

最常见的方式就是在操作数据后,立马对缓存进行操作。这样的方式意味着业务代码中都是这种缓存失效的代码,当然也有封装成注解的形式,让使用更加便捷。

binlog在这个场景中也能产生重大作用,可以基于binlog的变更来淘汰对应的缓存,而且可以和业务代码解耦,为我们解决缓存数据一致性问题多提供了一种方案。

数据分发

数据分发也是一种比较常见的业务场景,当很多下游依赖上有的数据,常见的实现方式有下面几种:

  • 代码中通过消息进行数据分发

    如果自己在代码中通过消息将数据分发出去,就会比较被动。因为一旦有字段变更,有下游想要其他的数据,你都得需要改动代码来满足下游的需求,基本上不可取。

  • 多搭建几个从节点,给下游直接使用从节点

    这种方式如果是在一个部门内还好点,如果是跨部门的,本来权限就管的比较严,不可能让其他部门直接连接你们的数据库,而且增加从节点的成本也是你们自己的,所以这种方式基本上也不会用。

  • 让下游消费binlog自己构建数据

    下游需要使用数据,那么就用下游自己的数据库,用什么库都跟你没关系。我们只需要通过中间件将binlog发布出去,哪个业务方需要数据就自己消费,自己存储即可。

这种方式我们既不用改业务代码,也不用申请数据库增加我们的成本,是一种完全解耦的方式,但是这种方式也是有弊端的,请继续往下看。

给业务带来的风险点

字段变更

如果上游的字段发生了变更,比如把name换成了username,对消费binlog的下游来说,这个字段就有可能影响了现有的逻辑,导致取值错误。不过在实际工作中这种场景还是比较少的,一般都不会去随意变更字段名称,也不能说完全没有变更的情况。

数据变更

字段变更带来的影响相对来说较小,最让人头痛的就是数据的变更了。特别是数据量特别大的表进行数据变更的时候,比如你的表有10亿条数据,当然是分库分表的。然后有个字段需要重新清洗下数据,也就是update某个字段。看上去对业务没有任何影响,其实对下游是有影响的。

如果数据清洗过快,binlog就会很多,下游消费不过来就会出现消息堆积,影响正常的业务逻辑,因为下游都依赖了binlog做业务。

所以在这种场景下,大家有数据清洗的需求,一定要考虑到对下游的影响,本来你洗数据可能一天就洗完了,但是下游扛不住,可能需要10天才能慢慢洗完。但是感觉不合理啊,我自己的表变更还要问问别人,我能洗这么快么?

解决方案

对于字段名称尽量不做变更,非得变更的话得提前和下游沟通好,让下游消费2个字段,如果哪个有就消费哪个,这样你改名称之后就不会影响下游的逻辑。

对于数据清洗之类的导致大量binlog场景,最简单的就是控制清洗速度,始终保持下游能够接受的程序去清洗,缺点就是时间会比较长。

另一种方案就是按需订阅,比如有的场景你清洗的这个字段下游压根就不消费,这个时候可以在消息投递处进行处理,按需进行消息的投递,比如对消息打Tag, 下游根据Tag进行消息过滤。

或者下游消费时直接过滤,这样速度也是很快的。

如果你的改动下游真的要感知,并且速度还不能慢,要赶时间,那么只能让下游扩容了。

大家好,我是从古代穿越过来的美男子:架构摆渡人。我将把我的武功秘籍全部传授与你们,觉得有用请分享给身边的朋友。来个三连吧,感谢各位!

binlog真的是银弹吗?有些时候也让人头疼的更多相关文章

  1. 讲真的,千万别得罪会PS的人

    传说中有一种软件炒鸡可怕 那就是PS,专业术语是photoshop! 它能让你貌美如花 也能让你瞬间丑得掉渣 更可怕的是网络上大神的出现 简直让我们难以想象的厉害! 下面大家一起来欣赏一下 那些大神帮 ...

  2. 实验吧_登陆一下好吗(骚注入)&你真的会PHP吗?(代码审计)

    登陆一下好吗 首先看到两个输入框,分别对应账号密码,随手输个admin,admin进去,提交后发现有回显,既然题目说了过滤了一切,那就先看看过滤了些啥 经过一波测试,发现服务器过滤了union,sel ...

  3. 你真的了解webview么?

    你真的了解webview么? 写在前面: Webview是我们前端开发从PC端演进到移动端的一个重要载体,现在大家每天使用的App,webview都发挥着它的重要性.接下来让我们从webview看世界 ...

  4. ZT 人生真的是一场马拉松吗?

    中国合伙人:孟晓俊:生活应该是什么样的?自己提出的问题应该由自己来回答,别人的回答是别人的答案,是别人的生活,而你应该过自己的生活,不是别人的生活.     人生真的是一场马拉松吗? 投递人 itwr ...

  5. Maven快照版本要这样用才真的香!

    Bug的身世之谜 今天又分享一个问题解决的故事.请看下图框起来的错误,明显就是找不到这个class嘛! 下面我们按照正常人的思路去排查这个问题,既然找不到class那就先看这个依赖的jar包有没有,如 ...

  6. http协议详细介绍

    HTTP协议/IIS 原理及ASP.NET运行机制浅析[图解] 转自:http://www.cnblogs.com/wenthink/archive/2013/05/06/HTTP_IIS_ASPNE ...

  7. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  8. 区块链技术现状&前景

    炒作周期 Gartner 在 2017 年发布的新兴技术炒作曲线,这张图是去年 8 月发布的,当时估计它们也没料到随后能有那么火,当时区块链在这个位置,其实是已经过了炒作的巅峰期,正在往低谷走的这个阶 ...

  9. 分布式存储中HDFS与Ceph两者的区别是什么,各有什么优势?

    过去两年,我的主要工作都在Hadoop这个技术栈中,而最近有幸接触到了Ceph.我觉得这是一件很幸运的事,让我有机会体验另一种大型分布式存储解决方案,可以对比出HDFS与Ceph这两种几乎完全不同的存 ...

随机推荐

  1. hdu 2830 Matrix Swapping II(额,,排序?)

    题意: N*M的矩阵,每个格中不是0就是1. 可以任意交换某两列.最后得到一个新矩阵. 问可以得到的最大的子矩形面积是多少(这个子矩形必须全是1). 思路: 先统计,a[i][j]记录从第i行第j列格 ...

  2. popStar手机游戏机机对战程序

    DFS算,五分钟如果答案没有更新,那个解一般来说就很优了. #include <cstdio> #include <iostream> #include <string. ...

  3. 王爽汇编第五章,[bx]和loop指令

    目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...

  4. k8s入坑之路(5)kube-apiserver详解

    API Server kube-apiserver 是 Kubernetes 最重要的核心组件之一,主要提供以下的功能 提供集群管理的 REST API 接口,包括认证授权.数据校验以及集群状态变更等 ...

  5. 服务端渲染技术NUXT

    什么是服务端渲染 ​ 服务端渲染又称SSR (Server Side Render),是在服务端完成页面的内容,而不是在客户端通过AJAX获取数据. 服务器端渲染(SSR)的优势主要在于:更好的 SE ...

  6. git clone报错处理

    git clone过大的仓库时会报以下错误 remote: aborting due to possible repository corruption on the remote side. fat ...

  7. Java发展的重大事故

    1990年,在Sun计算机公司中,由Patrick Naughton.Mi keSheridan 及 James Gosling领导的小组Green Team,开发出的新的程序语言,命名为0ak, 后 ...

  8. [JS]什么是闭包?

    首先来思考一下下面的案例: function unclosure() { let count = 0 return count++ } for (let index = 0; index < 1 ...

  9. 解决IE6,边框问题

    IE6是一个让人蛋疼而又无奈的浏览器,这次不经意间发现了一个BUG的解决发放,给大家分享一下 直接中部代码<input type="text" value="&qu ...

  10. python读写文件with open

    简介 使用python的过程中肯定少不了读取文件的操作, 传统的形式是使用 直接打开.然后在操作.然后再关闭, 这样代码量稍微大些不说,一旦在操作步骤中出现报错,则无法进行文件的关闭: 案例一(读取) ...