当前位置: 首页 > 编程日记 > 正文

【踩坑记录】记一次MySQL主从复制延迟的坑

最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误。

情景

一个活动信息需要审批,审批之后才能生效。因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容,考虑到字段比较多,也要保存审批活动的内容,因此设计采用了一张临时表,审批中的活动写进审批表(activity_tmp),审批通过之后才把真正的活动内容写进活动表(activity)。表的简要设计如下,这里将活动内容字段合并为content展示:


activity_tmp()
id
status // 审批状态    
content //  审批阶段提交的活动内容activity
id
content // 审批通过后真正展示的活动内容

遇到的问题

当时是有编辑触发审批的情况,发现审批通过之后活动内容是空的,于是开始追查问题的原因。这里说一句,当程序出问题的时候,95%都是代码的问题,先不要去怀疑环境出问题。好好的查日志,然后看看你的代码吧。

追查问题回溯

1、查activity_tmp表,发现当时提交审批的活动内容是正常的,而且状态也更新为审批通过了,怀疑是写入activity表失败
2、查activity表,发现审批后的内容确实没有写入,怀疑是代码问题
3、查看代码,代码逻辑没看出问题,怀疑数据库操作失败,查看日志
4、日志显示,有一句insert语句的活动内容为空,活动内容来自上一个mysql执行的是select语句,把该select语句拿出来放到线上的备库查询,发现活动内容是存在的。运行时查询为空,执行完毕后查询时内容存在,初步怀疑是主从延迟问题。
5、报错只是部分失败,确定是主从延迟的问题。

当时的问题代码

$intStatus = $arrInput[‘status’];
$this->objActTmp->updateInfoByAId($intActId, $intStatus);
// 更新后,马上查
$arrActContent = $this->objActTmp->getActByStatus($intStatus);

这就是主从延迟出现的地方,update后,马上get,这是主从复制架构上开发的一个大忌。

解决方案

这类问题的解决方案有两种:

  • 修改代码逻辑

  • 修改系统架构

对于修改代码逻辑,鄙人有两点见解:

  • 如果第二步获取的数据不需要第一步更新的status字段,那就先读,然后再更新

  • 如果第二步获取的数据需要依赖第一步的status字段,那就在读出来的时候先判断是否为空,如果是空的,报错,下一次重试。

总结

其实之前也听到过这样的例子,但是由于没有亲身经历,所以只保留了一种理论上的记忆,实际上印象不深,经历了这么一次踩坑后,印象特别深刻,现在看到别人写这样的代码也能马上发现并指出。还是自己亲身去踩坑印象最深。

日志很重要,详细的日志更重要。日志要记录有用的信息,方便追查问题的时候去追溯问题的本质原因。我觉得日志就应该尽量做成飞机中的黑匣子,帮助我们保存“事故“发生时的所有相关信息。

接下来,会去学习主从复制的原理,敬请期待。

更多精彩内容,请关注个人公众号。

图片描述

相关文章:

ASP.NET 应用中大文件上传研究

在项目中经常要用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,两个控件的方法是:利用隐含的HttpWorkerRequest,…

哪家互联网公司涨薪最厉害?居然不是阿里腾讯

最近脉脉职言区有一条讨论火了:哪家互联网公司涨薪最厉害?按照拼多多员工的说法,应届毕业生可以拿比腾讯阿里高30%的薪资,而有工作经验的员工普遍薪资水平也高出业内30%~50%以上。而且在去年由于疫情众多企业降薪、甚至裁员的状况…

如何修改 远程桌面的 默认端口号 3389

修改注册表的以下位置的键值: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]"PortNumber"dword:00000d3d

Yolov11-detect训练自己的数据集

至此,整个YOLOv11的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

联通和阿里云合作 建互联网云化卡号管理系统

1月17日晚间消息,继去年11月中国联通与阿里巴巴签订战略合作框架协议之后,今天下午阿里云宣布将于中国联通建卡号管理系统“cBSS2.0集中号卡系统”。据了解,这将是电信行业第一个核心业务系统云化改造的重点工程,也是云计算技术在…

如何最大限度提高.NET的性能

优化 .NET的性能 1)避免使用ArrayList。 因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。.net 2.0提供了一个新的类型,叫泛型…

别找了,Thonny 才是 Python 小白的最理想的 IDE

来源 | Python编程时光作者 | 写代码的明哥头图 | 下载于视觉中国当你在搜索引擎(如百度)或者各种问答社区(如知乎)搜索『学习Python 最好的 IDE/编辑器是哪个?』的时候,我想答案肯定是:PyCharm…

图书抄袭何时休,技术人的版权在哪里?

今天,一个很偶然的机会,看到了一本北京邮电大学出版社出版的技术图书《Linux服务器架设、性能调优、集群管理教程——实训与项目案例》,感觉有种似曾相识的感觉,于是打开目录大概了解了下,一个我不想看到的现象发生了&…

让MySql支持表情符号(MySQL中4字节utf8字符保存方法)

UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去。解决方案:将编码从utf8转换成utf8mb4。 1. 修改my.ini [mysqld] character-set-serverutf8mb4 2. 在Connector/J的连接参数中&a…

短信编码类无错版PDUdecoding.cs

////程 序 员:武志文(蚕蛹)/// sillnet163.net///文 件:PDUdecoding.cs///概 要:针对国内短信编码(USC2)///组成结构:包含四个函数:/// smsDecodedCenterNumber(string…

你还有学了三年建模的朋友吗?他有救了

【 编者按】“我朋友学了 3 年建模”系列,一直以浮夸的操作占据于各大视频网站搞笑榜。此前,来自布拉格捷克理工大学、 Google 研究院、和华盛顿大学以及苏黎世联邦理工学院的研究者们发布了 Monster Mash 项目的论文和动效视频。用户绘制二维图像&#…

iOS培训objective-c——实例化对象

蓝鸥iOS培训推荐:好像好长时间没和大家分享了,那么今天主要和大家说说OC内容创建实例化对象,基本让也就分为几大类:1.ClassName*myNewClassName;//指针2.myNewClassName[ClassNamealloc];//通过alloc这个命令申请一个空间来存放我…

#423 Div2 D

#423 Div2 D 题意 构造一个 n 个节点的树,恰好有 k 个叶子节点 (叶子节点的定义是只与树上的某一个节点存在连边),要求任意两个叶子节点的距离的最大值最小,距离为两个节点间边的数量,输出距离的最大值,以及 n - 1 条边…

CDMA模块上网设置的过程

CDMA模块上网设置的过程一) AT指令设置部分(1) ATCSQ 检查信号 若返回10—31,99之间的信号数字则继续,如果信号是99,99,则应该考虑不停的键入A/命令,不停的让模块去搜寻网络。&…

RedHat 年度报告:只索取不贡献的开源消费“大户”不受待见

编译 | 清儿爸编辑 | 夕颜头图 | 下载于视觉中国据 Red Hat 公司委托发布的一份新报告称,新冠疫情可能在云计算基础设施和企业开源软件方面留下不可磨灭的印记。Red Hat 是 IBM 于 2018 年以 340 亿美元收购的企业开源软件产品供应商。第三次年度《企业开源现状》&a…

做产品的一些思考

从我当前的职业经历来看,做过两种类别的产品:一种是客户定义好了需求由我们去实现,我姑且称其为做项目;一种是自己去探索用户需求然后在不断的摸索中引导用户,实现价值,这是我笔下真正的产品。做项目目标明…

查看JDK的历史版本

1.打开如下链接http://www.oracle.com/technetwork/java/javase/downloads/index.html2.查找如下内容,点击进行3.选择你需要的版本,点击进入4.找到相应的版本下载即可转载于:https://blog.51cto.com/suyanzhu/1947530

终于有人解救Python人了!

从事Python开发的这些年中,我见过很多相关的入门教程和书籍,他们大都这样讲 :先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构,然后再介绍字符串处理和正则表达式,介绍文件等IO操作.... 就这样一点一点往…

WISMO模块GPRS上网设置的过程

WISMO模块GPRS上网设置的过程一) AT指令设置部分(1) ATCGCLASS“B”置为“B”模式。(2) ATCGDCONT1,“IP”,“CMNET”设置APN。(3) ATCSQ 检查信号 若返回10—31&#x…

【虚拟化实战】VM设计之一vCPU

作者:范军 (Frank Fan) 新浪微博:frankfan7虚拟机需要多少个vCPU呢?是不是个数越多性能越好呢?这方面存在着很多误区。给VM配置CPU资源的时候,要精打细算才能最大可能的利用已有资源&#xff0c…

新手小白 python之路 Day1 (三级菜单功能实现)

直接上需求: 实现一个多级菜单 三级菜单的实现 可以依次选择进入各个子菜单 也可以返回上级菜单 所需知识 列表 字典 需求也比较简单,但实际上做起来还是遇到许多的问题,我这边主要用到的知识点大概就是 字典 等 大致的思路 我…

简要AT命令介绍

FUNCTIONSAT COMMANDSDETAILS厂家认证ATCGMI获得厂家的标识模式认证ATCGMM查询支持频段修订认证ATCGMR查询软件版本生产序号ATCGSN查询IMEI NO.TE设置ATCSCS选择支持网络查询IMSIATCIMI查询国际移动电话支持认证卡的认证ATCCID查询SIM卡的序列号功能列表ATGCAP查询可供使用的功…

CentOS 5.6下创建KVM虚拟机

【51CTO专家投稿】RedHat 的下一代旗舰产品RedHat Enterprise Linux 6只包含 KVM,这一点 RedHat 官方已经在很久以前、在不同场合都确认过。KVM 发展很快,稳定性有了很大提高,随着 RHEL 6 的正式到来,KVM 应用到生产环境的日子应该…

手把手教你如何制作可视化大屏!

在我们生活和工作中,经常会看到可视化大屏,主要用于展示一些汇总信息,那如何制作一个酷炫的可视化大屏呢?今天带大家看个github上的案例。项目地址:https://github.com/yyhsong/iDataV/tree/master/case09效果如下&…

ES5和ES6数组遍历方法详解

ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1、原始的for循环语句2、Array.prototype.forEach数组对象内置方法3、Array.prototype.map数组对象内置方法4、Array.prototype.filter数组对象内置方法5、Array.prototype.reduce数组对象内置方法6、Array.prototype…

短信猫GSM Modem

短信猫是用来收发短信的设备,和手机一样 插入SIM卡,通过(USB或串口)数据线/PCI插槽接到电脑上 在电脑上通过相关软件就可以实现短信收发的功能相关软件也就是收发短信的短信应用软件 可以自己开发,也可以要求短信猫设备…

数量级提升!深度学习让机器人抓取更高效

作者 | Jeffrey Ichnowski等译者 | 凌霄出品 | AI科技大本营(ID:rgznai100)摘要电子商务仓库中的拣选机器人需要快速计算各种配置之间有效且平稳的机器人手臂运动。最近的研究中是将抓取力分析与手臂运动规划结合,以计算最佳的手臂平滑运动&a…

phpcms_v9修改文章会提示 [hash]数据验证失败

收藏备用&#xff1a;phpcms\modules\content\templates\content_edit.tpl.phpaction"?mcontent&ccontent&aedit改成action"?mcontent&ccontent&aedit&pc_hash<?php echo $_SESSION[pc_hash];?>"转载于:https://blog.51cto.com/w…

横向ListView(一) ——开篇,基础逻辑实现

2019独角兽企业重金招聘Python工程师标准>>> 第一次写博文&#xff0c;写得不好的地方还望各位看客见谅 为了学习自定义软件开发&#xff0c;且定制出满足自己需求的控件&#xff08;不需要将就地使用第三方源码&#xff09;&#xff0c;本人花了一周的时间开发了个…

HTTP Response中的Chunked编码

进行Chunked编码传输的HTTP Response会在消息头部设置&#xff1a; Transfer-Encoding: chunked 表示Content Body将用Chunked编码传输内容。 Chunked编码使用若干个Chunk串连而成&#xff0c;由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分&#xff0c;头部…