高并发系统之大忌-慢查询

最近又遇到了一次慢查把db(mariadb10)几乎打挂的案例,作为一个核心支付系统的技术负责人,真是每日如履薄冰。因为之前支付系统经常出问题,现在各个BG对支付系统都盯得很紧。这次要不是我及时让DB给暴力清理数据,没准又提一个P2故障;

抱怨归抱怨,事后复盘,一丝都不能马虎。首先,描述一下故障的全过程。起因是我们支付系统有一个异步队列,这个队列使用的一张mysql表存储,异步回调业务线的任务(姑且表名称叫task),都会首先放这里。同时这个task表还有其他的异步任务,不同的任务使用task_type字段来进行区分。然后应用系统有一个定时任务,扫描这张表是否有待消费的任务,如果有,则会取出来进行消费;典型的生产者消费者模型;

 

这里的task说的再具体一点:

1、所有的异步任务都在这张表,有支付成功通知业务线消息,有给结算系统推送支付信息的任务;

2、消费者在任务处理成功后,则会把任务从task表删除。所以这张表经常是空的;

消费者根据不同的任务,调用不同的上游订单系统和结算系统。出故障时,是因为推送支付信息的结算系统接口超时,出了问题,导致任务被积压到了task表。

 

 

任务积压之后,消费者线程池很快就被积压的任务占满,导致应该通知BG订单支付成功的任务也被block住,进而影响到订单支付成功率。

当时我已经意识到,我们的消费者线程池隔离没有做到位,立刻找DBA将推送给结算系统的任务进行了备份并清理。并且嘱咐DBA定时清理推送结算任务的数据。这样才化解支付成功率继续下滑的趋势。

危机解除后,我们和DBA配合进一步排查问题,找出了事情的根本原因。

原来是推送结算信息的逻辑中,有一个对task表的查询,而这个查询的sql,没有建索引。这样当这类任务数量积压的比较多时,查询会越来越慢,慢查导致mysql堵塞。堵塞导致消费者无法拉取任务,进而影响到其他通知BG的任务的消费;我们分析了一下日志,其实我们的程序查询数量当时3分钟大概查询了1万多次,可以说qps不多。但是问题出现在sql无法命中索引,把mysql的worker thread都用完了。给我们研发的感觉,mysql是如此的脆弱,2w多条数据,查询没有索引,几千个select,就能把它打挂。

几乎类似的案例,一年前,我们也碰到过一次。当时支付系统有一个bug,用户每支付一次,都会把支付客史中一个月之前的数据都清理一下(1月1日,清12月1日之前的数据,2月1清理1月1日之前的数据)。这个bug藏的很深,这块代码也很少有业务需求,一直没有被发现。但是,是雷就会有爆炸的一天。3月1日凌晨,支付系统突然所有接口都挂了。DBA最终定位是删除支付客史的sql。这个问题,我们研发一开始是不承认的,毕竟这个sql,在线上跑了2年多,一直没有出过问题。DBA说这个delete语句删3000w数据,而且在不断的请求,数据库当然扛不住,我们反驳说,这个客史表一共才3000w数据。事后我们发现,DBA的描述有误,不是说删除3000w,而是这个delete语句没有走索引,每次要扫描3000w数据。这样才能解释通,也就是说,这个delete进行了全表扫描。而实际上,这个delete是按照时间删除的,并且时间字段是有单列索引的,但是为什么这个delete没有走索引呢?我们最后猜测,可能是因为2月份天数太少导致。以前,可能数据比较少,每次删一天,或者2天的数据,mysql可能会走索引。但是3月1日比较特殊,因2月28日删的是1月28日一天的数据,3月1日却要删除1月29,30,31三天的数据,mysql可能认为删除这么多数据,没有必要走索引了。

 

遇到类似问题如何解决?

1、读写分离。

2、提前消灭慢查询;

3、对异步任务做好线程隔离;

 

关于mysql的线程池,我最近也了解了一下,收获也不小,给大家推荐一篇好文章;

https://www.jianshu.com/p/88e606eca2a5

 

关注我的公众号“猿界汪汪队”,关注大并发架构实战。

 

转载于:https://www.cnblogs.com/donlianli/p/11068095.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS媒体查询

格式(style:{})元素设置: body{background-color:#0033FF;}/*媒体查询:当页面宽度最大为960px时*/media screen and (max-width: 960px){/*body背景颜色为*/body{background-color:#FF6699}}media screen and (max-width: 768px){…

(单元测试)JavaBeans的技巧

如果您正在编写Java代码,那么您至少要编写一些遵循JavaBean约定的类,即,具有带有公共getter和setter方法的私有属性的类,包含无参数的构造函数,可序列化,并且遵守Equals和HashCode合同。 最重要的是&#x…

js中的正则表达式

正则表达式等名称并不能让人一下就能明白是什么意思,我认为称之为 规则表达式 更为合理,就是描述一个字符串规则的表达式。 语法 正则表达式的语法有两种,下面第一种语法稍显 怪异,但确实是合法的并且相对方便,推荐。…

Hadoop namenode启动瓶颈分析

转载:http://blog.csdn.net/AE86_FC/archive/2010/08/26/5842020.aspx NameNode启动过程详细剖析 NameNode中几个关键的数据结构 FSImage Namenode会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有…

Java 9 –终极功能列表

这篇文章将针对即将到来的Java 9版本进行更新,新增功能 ( 最新更新:2014年 9月9日 ) OpenJDK开发正在加快速度:2014年3月Java 8发布之后,我们预计将进入2年的发布周期。 据报道,Java 9将于2016…

2018.3.30 边框应用与导航栏设置

<!DOCTYPE html><html> <head> <meta charset"utf-8" /> <title></title> <style type"text/css"> /*制作三角形*/ #one{ width: 0px; …

centos 更改用户登录宿主机时间

chage -l username (查看用户登录时间&#xff1a;username为查看的用户) chage -M 90 username &#xff08;将用户登录主机的时间更改为90天&#xff09; 转载于:https://www.cnblogs.com/MUQINGFENG123/p/11075912.html

js中的作用域和作用域链

作用域就是变量与函数的可访问范围。在js中只有 全局作用域 和 函数作用域 &#xff0c;并没有块级作用域。 全局作用域 在所有函数外定义的变量、声明的函数就是全局作用域&#xff0c;在全部环境下都可以访问。 var a 111;function fn(){console.log(a); }fn(); // 打印了…

CryEngine3 引擎非商业用途将免费

CryEngine3引擎非商业用途将免费:8月发布 http://t.cn/hdEr45】Crytek日前宣布将在今年8月免费推出CryEngine3引擎的开发包&#xff0c;登录Crytek官网注册&#xff0c;签署保密协议保证不将CryEngine3用作商业用途&#xff0c;就可获得CryEngine3软件授权。Crytek官网上的一份…

vue打包后不使用服务器直接访问方法

根据官网打包执行npm run build 后dist文件夹打开的index.html 是空白 需要开启http服务器才能访问&#xff0c;以下是解决办法 1、找到config文件夹下的index文件 修改成 2、找到build文件夹下的until文件 修改成 然后执行npm run build重新打包下就ok了 更多专业前端知…

IntelliJ中的键盘快捷键

我上周参加了Hadi Hariri在JavaOne上的演讲。 他介绍了很多我不知道的IntelliJ键盘快捷键。 非常有用的谈话。 我在下面列出了一些最有用的。 Cmd-1&#xff1a;将焦点移到“项目”窗口 在此输入任何类名&#xff08;包括使用Camel Case&#xff0c;例如HW来查找HelloWorld&a…

OpenStack虚机网卡的创建过程

原文&#xff1a;https://www.sdnlab.com/20286.htmlOpenStack最基本和常用的操作就是启动虚机。虚机启动的过程中涉及很多内容&#xff0c;其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡。虚机的创建和管理是Nova的任务&#xff0c;虚机网络的创建和管理是Neutron的任务…

js中的原型与原型链

js的学习有三座大山&#xff0c; 原型/原型链 、 作用域/闭包 、 异步/单线程&#xff0c;这三个知识点虽然基础但是入门时理解起来比较困难&#xff0c;本文先整理总结原型和原型链这一知识点。 1. 原型链怎么来的&#xff1f;对象的原型和function的prototype属性有什么关系…

线性表--算法设计题2.29

已知A&#xff0c;B和C为三个递增有序的线性表&#xff0c;现要求对A表作如下操作&#xff1a;删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法.&#xff08;注意&#xff1a;题中没有特别指明同一表中的元素值各不相同&#xff09;。C code: #in…

HTML5 audio 如何实现播放多个MP3音频

<audio>标签是HTML5中的新标签&#xff0c;定义声音用于嵌入音频内容&#xff0c;比如音乐或其他音频流。用的比较多音频格式是.mp3。 <audio>标签常用属性如下表 属性值描述autoplayautoplay添加该属性后&#xff0c;音频会自动播放controlscontrols设置后&…

Java代码中的典型错误

该页面包含在与我一起工作的人的Java代码中看到的最典型的错误。 静态分析&#xff08;出于明显的原因&#xff0c;我们使用查询无法捕获所有错误&#xff0c;这就是为什么我决定在此处列出所有错误的原因。 如果您要在此处添加其他内容&#xff0c;请告诉我&#xff0c;我们将…

windwos下ntp服务器配置 arm平台ntp客户端获取同步时间

项目需要使用同步时间&#xff0c;在arm-linux开发板上&#xff0c;移植了ntp客户端&#xff0c;查看了一些资料&#xff0c;最终发现使用windows自带的ntp服务器比较方便&#xff0c;而且很靠谱&#xff0c;使用配置了一番&#xff0c;已经能够正常使用 详细步骤&#xff1a; …

css 控制图片最大宽度

CSS 限制图片最大宽度 (本文来自本站原创&#xff0c;转载请务必注明出处&#xff01;)我们在制作一个网页的时候&#xff0c;经常要对一个区域里可能出现的图片的宽度进行限制&#xff0c;不然它可能会把页面撑得很烂很烂。如果你采用固定宽度&#xff0c;长度来设置的话&…

BOM(Browser Object Model)

BOM&#xff08;浏览器对象模型&#xff09;&#xff0c;提供了一系列操作浏览器&#xff0c;获取浏览器信息的接口。这些接口在平时的工作中会经常用到&#xff0c;例如当前页面的刷新&#xff0c;获取url的参数等等。 注&#xff1a;图片来自 http://www.dreamdu.com/javascr…

入门 IT 行业,该具备哪些技能?

对于刚开始进入IT的新人来说&#xff0c;“必备技能”往往意味着一个长长的、标有重要度的学习列表&#xff0c;但是过长的列表通常会导致新人不知如何开始学习&#xff0c;压力倍增。本文尝试列举出最重要的几个技能&#xff0c;也期望通过此列表能给新人一个比较明确的学习重…