binlog真的是银弹吗?有些时候也让人头疼
大家好,我是架构摆渡人。这是实践经验系列的第三篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。
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真的是银弹吗?有些时候也让人头疼的更多相关文章
- 讲真的,千万别得罪会PS的人
传说中有一种软件炒鸡可怕 那就是PS,专业术语是photoshop! 它能让你貌美如花 也能让你瞬间丑得掉渣 更可怕的是网络上大神的出现 简直让我们难以想象的厉害! 下面大家一起来欣赏一下 那些大神帮 ...
- 实验吧_登陆一下好吗(骚注入)&你真的会PHP吗?(代码审计)
登陆一下好吗 首先看到两个输入框,分别对应账号密码,随手输个admin,admin进去,提交后发现有回显,既然题目说了过滤了一切,那就先看看过滤了些啥 经过一波测试,发现服务器过滤了union,sel ...
- 你真的了解webview么?
你真的了解webview么? 写在前面: Webview是我们前端开发从PC端演进到移动端的一个重要载体,现在大家每天使用的App,webview都发挥着它的重要性.接下来让我们从webview看世界 ...
- ZT 人生真的是一场马拉松吗?
中国合伙人:孟晓俊:生活应该是什么样的?自己提出的问题应该由自己来回答,别人的回答是别人的答案,是别人的生活,而你应该过自己的生活,不是别人的生活. 人生真的是一场马拉松吗? 投递人 itwr ...
- Maven快照版本要这样用才真的香!
Bug的身世之谜 今天又分享一个问题解决的故事.请看下图框起来的错误,明显就是找不到这个class嘛! 下面我们按照正常人的思路去排查这个问题,既然找不到class那就先看这个依赖的jar包有没有,如 ...
- http协议详细介绍
HTTP协议/IIS 原理及ASP.NET运行机制浅析[图解] 转自:http://www.cnblogs.com/wenthink/archive/2013/05/06/HTTP_IIS_ASPNE ...
- R语言︱机器学习模型评估方案(以随机森林算法为例)
笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...
- 区块链技术现状&前景
炒作周期 Gartner 在 2017 年发布的新兴技术炒作曲线,这张图是去年 8 月发布的,当时估计它们也没料到随后能有那么火,当时区块链在这个位置,其实是已经过了炒作的巅峰期,正在往低谷走的这个阶 ...
- 分布式存储中HDFS与Ceph两者的区别是什么,各有什么优势?
过去两年,我的主要工作都在Hadoop这个技术栈中,而最近有幸接触到了Ceph.我觉得这是一件很幸运的事,让我有机会体验另一种大型分布式存储解决方案,可以对比出HDFS与Ceph这两种几乎完全不同的存 ...
随机推荐
- 21.10.14 test
题目 WOJ5078 到 WOJ5081 T1 Problem A \(\color{green}{100}\) 由于每轮要选择尽量多的边删除,所以想到无向图的生成树,因为在生成树上再加一条边就会形成 ...
- (总结)Linux下su与su -命令的本质(转)
转载地址:http://www.ha97.com/4001.html 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户 ...
- hdu 5100 Chessboard (额,,,,,就叫它趣味数学题吧)
题意: 用K*1的砖块去覆盖N*N的大矩形,问最多能覆盖多少块. 详细证明:(转载自matrix67) Matrix67: The Aha Moments 趣题:用 k × 1 的矩形覆盖 n × n ...
- mysql数据库导入导出文件sql文件
window下 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > dbname.sql ...
- 【浏览器】聊聊DOM
[浏览器]聊聊DOM 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 作为前端开发,在以前的工作中大多是和DOM打交道,到 ...
- JavaScript 事件循环
JavaScript 事件循环 事件循环 任务队列 async/await 又是如何处理的呢 ? 定时器问题 阻塞还是非阻塞 实际应用案例 拆分 CPU 过载任务 进度指示 在事件之后做一些事情 事件 ...
- elasticsearch在postman中创建复杂索引
body,所选类型为raw和JSON,写的代码为 { "settings":{ "number_of_shards":1, "number_of_re ...
- golang常用库:日志记录库-logrus使用
介绍 logrus 它是一个结构化.插件化的日志记录库.完全兼容 golang 标准库中的日志模块.它还内置了 2 种日志输出格式 JSONFormatter 和 TextFormatter,来定义输 ...
- k8s之mutating webhook + gin
1.知识准备 1.Webhook 是一种用于接收准入请求并对其进行处理的 HTTP 回调机制 2.Webhook 接收来自apiserver的回调,对回调资源做一些校验.注入.修改元数据等工作 3.来 ...
- Azure Virtual NetWoker(一)对等互连网络
一,引言 Virtual NetWork Peering 可以无缝连接两个 Azure Virtual NetWork,Virtual NetWork Peering 直接的网络流量是专用的.在实际项 ...