首页 > 其他分享 >[转帖]日常Bug排查-读从库没有原子性?

[转帖]日常Bug排查-读从库没有原子性?

时间:2024-01-11 14:12:27浏览次数:27  
标签:主从 转帖 排查 原子 从库 Bug select

https://zhuanlan.zhihu.com/p/658508920

 

3 人赞同了该文章

日常Bug排查系列都是一些简单Bug排查。问题虽小,但经常遇到,了解这些问题,会让我们少走点弯路,提升效率。说不定有些问题你遇到过哦:)

Bug现场

业务开发同学突然问了笔者一个问题,从库读会不会没有原子性?我下意识的反应怎么可能,只要是遵守MySQL主从Replication协议的原子性至少是能够保证的。但他们遇到了一个比较诡异的现象。如下图所示:

 

 

这么一看确实像从库没有保证原子性。但这个明显有违背笔者的常识,这个问题背后肯定还有其它的因素没有挖掘到。

数据库拓扑

于是笔者看了看这个库的拓扑,是一主两从的结构。如下图所示:

 

 

真相大白

看到这个拓扑的那一刻笔者立马反应过来,是踩了一个主从延迟变种的坑。由于请求B的两条select是不在事务内的,而且都是select。这两很有可能路由到两个不同的从库,而这两个从库的主从延迟是不一样的。例如一个100ms,一个200ms。那么落到100ms从库的那条sql就会查到请求A的提交,而200ms从库的那条sql查不到。以致与错误的认为从库不保证原子性!

 

 

应该怎么做

遇到这种情况,其实我们所需要做的只是在某次请求中稳定的路由到某个特定的从库上面,这样就能保证原子性(要么能查到,要么都查不到)。

 

 

如上图所示,一般在第一次请求之后,在threadLocal中打上相关粘性标签(SlaveA),那么在这次线程请求中。后来的从库select都走SlaveA即可。这个选择逻辑可以通过重载数据源DataSource的getConnection逻辑来实现。

总结

主从延迟是个非常常见的问题。最常见的是主库写入后读从库没有相应的数据,当然也有本文描述的这种看上去”不符合原子性”的变种。看似违背常识的背后可能有其它的隐变量(多从库不同延迟)。多挖掘一点问题现场的上下文信息就很容易揪出问题的根因。

标签:主从,转帖,排查,原子,从库,Bug,select
From: https://www.cnblogs.com/jinanxiaolaohu/p/17958474

相关文章

  • win下php7.2安装xdebug和php-redis
    先通过phpinfo()查看自己的php信息确定版本为:7.2-nts-vc15-x861、安装xdebughttps://xdebug.org/download.php下载对应的版本dll文件将dll文件复制到php文件夹的ext文件夹内修改php.ini,添加zend_extension=php_xdebug-2.7.0beta1-7.2-vc15-nts.dll重启apache,再次查看phpinfo()2、安......
  • [转帖]从Linux源码看TIME_WAIT状态的持续时间
    https://zhuanlan.zhihu.com/p/286537295 从Linux源码看TIME_WAIT状态的持续时间前言笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右。线上实际却存在TIME_WAIT超过100s的Socket。由于这牵涉到最近出现的一个复杂Bug的分析。所以,笔者就去Linux源码里面,......
  • IntelliJ IDEA Debug模式下结束后继续执行代码问题
    1.默认的配置默认的Debug模式下点击Stop后会继续执行代码。2.设置不继续执行后续代码Preferences->Build,Execution,Deployment->Debugger找到Java那一栏下边可以看到Killthedebugprocessimmediately选项,勾选后点击确定就可以了。或是直接在设置搜索框里输入Kil......
  • [转帖]修改Linux内核参数,减少TCP连接中的TIME-WAIT
    https://www.cnblogs.com/xiaoleiel/p/8340346.html 一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作。要提高Linux系统下的负载能力,当网站发展起来之后,web连接数过多的问题就会日益明显。在节省成本的情况下,可以考虑修改Linux的内......
  • python的各种bug
    通过pip安装certifi后,终端下pip和conda的各种命令都会报错,python控制台里importrequests也会报错,报错信息:PermissionError:[WinError32]另一个程序正在使用此文件,进程无法访问。:'C:\\Users\\Name\\AppData\\Local\\Temp\\tmp1ilrfbwf'解决办法:https://stackoverflow.com......
  • IDEA Debug 调试技巧(基础版)
    前言Debug是程序员的开发神器,使用好了可以帮助我们非常高效的工作、学习、排查问题等。毫不客气的说,是决定我们进阶到更高层级的一个重要技能。正文Debug的常见使用场景需求代码测试:通过debug你才能知道你的代码究竟是怎么运行的,更容易发现问题问题排查:只要能进入到问题流......
  • 解决mac arm 中 goland 无法 debug 问题
    新电脑不知道装了什么,导致无法debug现象可以run,没有问题不能debug,报错信息如下单元测试报错^Cgotooltest2json:signal:interruptmain方法debug报错^Ccouldnotlaunchprocess:stubexitedwhilewaitingforconnection:signal:interrupt解决之路网上找遍......
  • 将Debug目录下的所有文件打包到exe
    关闭杀毒软件, 最终结果    设置图标 ......
  • 如何使用xdebug调试php程序
    1由于我的是phpstudy集成环境,直接找到php.ini的位置:D:\phpstudy_pro\Extensions\php\php7.3.9nts\php.ini在文件尾部直接添加[Xdebug]zend_extension=D:/phpstudy_pro/Extensions/php/php7.0.9nts/ext/php_xdebug.dllxdebug.idekey=phpstormxdebug.remote_enable=Onxde......
  • [转帖]Linux中的lstopo命令(详细指南)
    https://juejin.cn/post/7117544110856077343 目录:简介语法命令总结参考文献介绍lstopo命令是用来显示系统的拓扑结构的。它提供了关于NUMA内存节点、共享缓存、CPU包、处理器内核和线程等信息。语法它渲染由hwloc发现的机器拓扑结构,有两种主要模式:文本渲染或图......