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

最近又遇到了一次慢查把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,一经查实,立即删除!

相关文章

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…

js中的作用域和作用域链

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

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

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

OpenStack虚机网卡的创建过程

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

js中的原型与原型链

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

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

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

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

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

BOM(Browser Object Model)

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

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

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

实验七作业

Part 1:验证性实验 将line29&#xff1a;for(i0;i<N;i)改为while(!feof(fp)) // 从文本文件file1.dat中读取数据&#xff0c;找出最高分和最低分学生信息&#xff0c;并输出在屏幕上 #include <stdio.h> #include <stdlib.h>#define N 10// 定义一个结构体类型…

块级格式化上下文(Block Formatting Context)

CSS块级格式化上下文是块级盒子的一种能力&#xff0c;这种能力并不是直接通过css属性声明而获得的&#xff0c;而是添加css的一部分相关属性之后自动获得的能力&#xff0c;也就是说没有一个明确的属性就是生成块级格式化上下文的。 块级格式化上下文的能力就是让具有该能力的…

前端性能优化方法总结

一个网站前端性能的好坏很大程度上影响了用户愿不愿意使用访问这个网站&#xff0c;因此对前端进行性能优化是个很重要的事情。  对于前端性能优化这个问题&#xff0c;主要学习自yahoo前端性能团队总结的35条黄金定律总结&#xff0c;觉得很全很赞&#xff0c;做个学习总结和…

Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单&#xff0c;一旦您开始看到性能改进&#xff0c;它就会变得非常有趣。 但是&#xff0c;当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时&a…

Java英雄:丹·艾伦

“ Java英雄 ”系列休息了很长时间。 老实说&#xff0c;我想即使有很多人想在这里收录&#xff0c;它也可能会以虚无收场。 其中之一是丹。 我第一次要求他捐款已经将近一年半了&#xff0c;与此同时发生的一切&#xff0c;让我不再有任何答案就让我安心了。 但是以下内容在Ja…

Java-Class-I:java.util.List

ylbtech-Java-Class-I&#xff1a;java.util.List1.返回顶部 1.1、import java.util.ArrayList;import java.util.List; 1.2、List<Integer> newList new ArrayList<Integer>();newList.add(3); 2、 2.返回顶部1.1、import java.util.*;public class Test{public …

推荐:个人时间跟踪工具 ManicTime

在《个人管理 &#xff0d; 目标管理之前&#xff0c;你会时间管理吗》中我介绍的时间管理三阶段之一“对时间的实际去处进行记录”时说过现在有很多时间管理工具&#xff0c;也有人希望我介绍一下我使用的工具&#xff0c;那么我就利用中午休息时间&#xff0c;马上给大家介绍…

SQL Server 2005怎样进行性能排错

很少会有偶然的性能下降。设计不良的数据库或工作负载配置不正确的系统会经常导致性能问题。管理员需要能预先阻止或最小化问题的影响&#xff0c;当管理员遇到问题时&#xff0c;应该诊断问题并采取正确操作来修复问题。本文提供了按部就班的指导&#xff0c;通过使用可用的工…

JVM PermGen –您在哪里?

这篇文章介绍了JVM内存结构的一些基础知识&#xff0c;并快速窥视了PermGen&#xff0c;以了解自Java SE 8出现以来它已消失的地方。 裸基础 JVM只是系统上运行的另一个进程&#xff0c;魔术始于java命令。 像任何OS进程一样&#xff0c;它需要内存才能运行。 记住– JVM本身是…

python6-函数

转载于:https://www.cnblogs.com/WIU1905/p/11101249.html