一 序

本文属于极客时间MySQL45讲读书笔记系列。

本篇的更偏向dba同学,普通开发同学我觉得没有这么大权利去处理,尤其是在数据库遇到重大故障需要处理。可以理解为救急。

二短连接风暴

正常的短连接模式就是连接到数据库后,执行很少的SQL语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰 期的时候,就可能出现连接数突然暴涨的情况。

MySQL建立连接的过程,成本是很高的。除了正常的网络连接三次握手外,还需要做登录权限判断和获得这个连接的数据读写权限。在数据库压力比较小的时候,这些额外的成本并不明显。

但是,短连接模型存在一个风险,就是一旦数据库处理得慢一些,连接数就会暴涨。max_connections参数,用来控制一个MySQL实例同时存在的连接数的上限,超过这个值,系统就会拒绝接下来的连接请求,并报错提示“Too many connections”。对于被拒绝连接的请求来说,从业务角度看就是数据库不可用。

在机器负载比较高的时候,处理现有请求的时间变长,每个连接保持的时间也更长。这时,再有新建连接的话,就可能会超过max_connections的限制。

碰到这种情况时,一个比较自然的想法,就是调高max_connections的值。但这样做是有风险的。因为设计max_connections这个参数的目的是想保护MySQL,如果我们把它改得太大,让更多的连接都可以进来,那么系统的负载可能会进一步加大,大量的资源耗费在权限验证等逻辑上,结果可能是适得其反,已经连接的线程拿不到CPU资源去执行业务的SQL请求。

这里:举个之前遇到的例子,正常情况下一个服务有3个节点,每个节点链接数最小配置50,最大100.这样算下来就是300.假设dba对数据库的最大链接数是500 (这个数据就是评估出来的篇保守一些).业务访问量大,有新增了3个节点。刚开始没问题,到业务高峰就报数据库链接打满了。这种情况下dba可以临时调大一些到600.要是几倍的增长,只能采取别的措施。

下面还有两种别的方法,但要注意,这些方法都是有损的。

第一种方法:先处理掉那些占着连接但是不工作的线程。

max_connections的计算,不是看谁在running,是只要连着就占用一个计数位置。对于那些不需要保持的连接,我们可以通过kill connection主动踢掉。这个行为跟事先设置wait_timeout的效果是一样的。设置wait_timeout参数表示的是,一个线程空闲wait_timeout这么多秒之后,就会被MySQL直接断开连接。

但是需要注意,在show processlist的结果里,踢掉显示为sleep的线程,可能是有损的。我们来看下面这个例子。

图1 sleep线程的两种状态

在上面这个例子里,如果断开session A的连接,因为这时候session A还没有提交,所以MySQL只能按照回滚事务来处理;而断开session B的连接,就没什么大影响。所以,如果按照优先级来说,你应该优先断开像session B这样的事务外空闲的连接。

但是,怎么判断哪些是事务外空闲的呢?session C在T时刻之后的30秒执行show processlist,看到的结果是这样的。

图2 sleep线程的两种状态,show processlist结果

图中id=4和id=5的两个会话都是Sleep 状态。而要看事务具体状态的话,你可以查information_schema库的innodb_trx表。

图3 从information_schema.innodb_trx查询事务状态

这个结果里,trx_mysql_thread_id=4,表示id=4的线程还处在事务中。

因此,如果是连接数过多,你可以优先断开事务外空闲太久的连接;如果这样还不够,再考虑断开事务内空闲太久的连接。

从服务端断开连接使用的是kill connection + id的命令, 一个客户端处于sleep状态时,它的连接被服务端主动断开后,这个客户端并不会马上知道。直到客户端在发起下一个请求的时候,才会收到这样的报错“ERROR 2013 (HY000): Lost connection to MySQL server during query”。

从数据库端主动断开连接可能是有损的,尤其是有的应用端收到这个错误后,不重新连接,而是直接用这个已经不能用的句柄重试查询。这会导致从应用端看上去,“MySQL一直没恢复”。dba做这种操作要即使通知下业务侧同学。

第二种方法:减少连接过程的消耗。

有的业务代码会在短时间内先大量申请数据库连接做备用,如果现在数据库确认是被连接行为打挂了,那么一种可能的做法,是让数据库跳过权限验证阶段。这个危险级高,属于不推荐操作。

除了短连接数暴增可能会带来性能问题外,实际上,我们在线上碰到更多的是查询或者更新语句导致的性能问题。其中,查询问题比较典型的有两类,一类是由新出现的慢查询导致的,一类是由QPS(每秒查询数)突增导致的。

其实好的dba ,应该更重视预防,把监控做好,应急总不是长久之策。

慢查询性能问题

在MySQL中,会引发性能问题的慢查询,大体有以下三种可能:

  1. 索引没有设计好;

  2. SQL语句没写好;

  3. MySQL选错了索引。

接下来,我们就具体分析一下这三种可能,以及对应的解决方案。

导致慢查询的第一种可能是,索引没有设计好。

这种场景一般就是通过紧急创建索引来解决。MySQL 5.6版本以后,创建索引都支持Online DDL了,对于那种高峰期数据库已经被这个语句打挂了的情况,最高效的做法就是直接执行alter table 语句。

阿里云的数据库支持双主备份,所以非大表在线加索引已经比较安全。

导致慢查询的第二种可能是,语句没写好。

找出慢SQL,对应的优化就好。这个的确危险,有的慢SQL经过接口提供出去,被业务方调用多了导致数据库cpu100%最终导致数据库挂了的也经历过。所以dba把日常的慢sql发出来,开发及时的迭代修复。这是一个动态的过程,非一簇而就。

导致慢查询的第三种可能,MySQL选错了索引。

这时候,应急方案就是给这个语句加上force index。

上面我和你讨论的由慢查询导致性能问题的三种可能情况,实际上出现最多的是前两种,即:索引没设计好和语句没写好。而这两种情况,恰恰是完全可以避免的。比如,通过下面这个过程,我们就可以预先发现问题。

  1. 上线前,在测试环境,把慢查询日志(slow log)打开,并且把long_query_time设置成0,确保每个语句都会被记录入慢查询日志;

  2. 在测试表里插入模拟线上的数据,做一遍回归测试;

  3. 观察慢查询日志里每类语句的输出,特别留意Rows_examined字段是否与预期一致。(我们在前面文章中已经多次用到过Rows_examined方法了,相信你已经动手尝试过了。如果还有不明白的,欢迎给我留言,我们一起讨论)。

不要吝啬这段花在上线前的“额外”时间,因为这会帮你省下很多故障复盘的时间。

**************************************

老师说的这种方式,实际情况不一定做得到,很多公司线下测试环境数据跟线上差异巨大,测试不出来。起码得有个准线上环境。测试才能暴露问题。

QPS突增问题

有时候由于业务突然出现高峰,或者应用程序bug,导致某个语句的QPS突然暴涨,也可能导致MySQL压力过大,影响服务。

我之前碰到过一类情况,是由一个新功能的bug导致的。当然,最理想的情况是让业务把这个功能下掉,服务自然就会恢复。

而下掉一个功能,如果从数据库端处理的话,对应于不同的背景,有不同的方法可用。我这里再和你展开说明一下。

  1. 一种是由全新业务的bug导致的。假设你的DB运维是比较规范的,也就是说白名单是一个个加的。这种情况下,如果你能够确定业务方会下掉这个功能,只是时间上没那么快,那么就可以从数据库端直接把白名单去掉。

  2. 如果这个新功能使用的是单独的数据库用户,可以用管理员账号把这个用户删掉,然后断开现有连接。这样,这个新功能的连接不成功,由它引发的QPS就会变成0。

  3. 如果这个新增的功能跟主体功能是部署在一起的,那么我们只能通过处理语句来限制。这时,我们可以使用上面提到的查询重写功能,把压力最大的SQL语句直接重写成"select 1"返回。

当然,这个操作的风险很高,需要你特别细致。它可能存在两个副作用:

  1. 如果别的功能里面也用到了这个SQL语句模板,会有误伤;

  2. 很多业务并不是靠这一个语句就能完成逻辑的,所以如果单独把这一个语句以select 1的结果返回的话,可能会导致后面的业务逻辑一起失败。

所以,方案3是用于止血的,跟前面提到的去掉权限验证一样,应该是你所有选项里优先级最低的一个方案。

同时你会发现,其实方案1和2都要依赖于规范的运维体系:虚拟化、白名单机制、业务账号分离。由此可见,更多的准备,往往意味着更稳定的系统。用阿里云就好了,虽然我们之前阿里云也有抖动的情况。这些基础功能都做好了。

小结

今天这篇文章,我以业务高峰期的性能问题为背景,和你介绍了一些紧急处理的手段。

主要是解决方法主要集中在server层。功夫在平常比较好,靠救急不是常态。

MySQL45讲 读书笔记 22讲MySQL有哪些“饮鸩止渴”提高性能的方法相关推荐

  1. 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 ​​​​​​​ lin ...

  2. 视觉SLAM十四讲学习笔记-第二讲-初识SLAM

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 "定位"和"建图",可以看成感知的"内外之分". ...

  3. 读书笔记系列1——MySQL必知必会

    读书笔记系列1--MySQL必知必会 文章目录 读书笔记系列1--MySQL必知必会 MySQL官方文档:https://dev.mysql.com/doc/ 第一章 数据库基础 *2021.11.2 ...

  4. 【SQL】【读书笔记】《MySQL必知必会》

    本文为<MySQL必知必会>[1]读书笔记,用于总结知识点和框架,仅供参考和交流,如有不妥请联系.由于软件版本更新,书中的一些代码已经不再适用,本文主要从SQL基本语句进行增删减.窗口函数 ...

  5. 视觉SLAM十四讲学习笔记-第一讲

    第一讲:预备知识 SLAM介绍 SLAM 是 Simultaneous Localization and Mapping 的缩写,中文译作"同时定位与地图构建".它是指搭载特定传感 ...

  6. 【读书笔记】实战JAVA虚拟机JVM故障诊断与性能优化 读书笔记

    文章目录 1.概述 1.1 **第一章:初探java虚拟机** 1.2 认识java虚拟机的基本结构 1.3 常用Java虚拟机参数 1.4 垃圾回收器 1.5 垃圾收集器以及内存分配 1.6 性能监 ...

  7. Mysql中“饮鸠止渴“提高性能的方法(临时性提升)

    该文章为<MySQL实战45讲>课程学习笔记及部分摘抄,原课程链接MySQL 实战 45 讲 (geekbang.org) 不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环 ...

  8. 读书笔记-袁腾飞讲高效学习法

    作者:袁腾飞 李峰学 序言1 没有笨学生,只有笨方法 也有一些学生,他们该学的时候学,该玩的时候玩,花费的学习时间相对较少,每次考试却总能考高分,让埋头于书山题海的同学羡慕不已.这些学生的智力并不比其 ...

  9. 视觉SLAM十四讲读书笔记(2)P10-P27

    目录​​​​​​​ Q:一个视觉SLAM框架由哪几个模块组成,各模块的任务又是什么 Q:什么是机器人的自主运动能力 Q:什么是机器人的感知 Q:什么是激光雷达 Q:什么是增强现实 Q:什么是IMU单元 ...

  10. 视觉SLAM十四讲读书笔记(5)P40-P52

    目录 Q:什么是eigen Q:正交矩阵的定义和性质 Q:什么是特殊正交群 Q:什么叫齐次坐标 Q:什么是特殊欧氏群 Q:什么是运算符重载 Q:什么是g2o Q:什么是sophus Q:什么是eige ...

最新文章

  1. Python/Jupyter Notebook以及可视化的运用
  2. 上下两个x轴_点胶机:3轴,4轴,5轴,你懂了吗?
  3. C#——Ellipse(椭圆)类[继承Circle(圆)类][实现IComparable接口、IComparerrT接口]DEMO
  4. leetcode 722. Remove Comments | 722. 删除注释(Java)
  5. cad线性标注命令_CAD线性标注如何使用的
  6. 施工部署主要不包括_建筑工程施工方案及培训实例
  7. 论文学习17-Global Normalization of Convolutional Neural Networks(联合实体关系抽取CNN+CRF)2017
  8. java笔记:SpringSecurity应用(二)
  9. mysql 1500万_【IT专家】mysql分表后 如何分页 (总共160个表1500万数据)
  10. 一加手机怎么导出照片_批处理整理安卓手机微信导出的视频和照片
  11. 沟通CTBS助真科电子跨平台接入
  12. U盘装系统后容量变小解决方法
  13. 初学OpenGL(7):颜色和光照
  14. 计算机综合布线考试试题A,综合布线试题A
  15. APK查壳软件(根据so名)
  16. Corel VideoStudio会声会影2022旗舰版本视频剪辑软件
  17. python里有哪些函数_python update函数会调用哪些内置函数_Python函数之内置函数
  18. 许键树:华为云视频直播在各细分场景的体验指标优化实践
  19. 让你的文章变得‘好看’--分享一些不错的字体颜色
  20. 思科网络学院-网络互联-第二章

热门文章

  1. 查看已下载的Docker镜像latest具体版本
  2. 函数的原函数,可积性和变上限积分之间的区别和联系
  3. 三星内存编码_内存颗粒版本判断方法和编号解析(三星、美光、海力士)
  4. H5是什么?H5怎么做?带你全面了解H5游戏制作
  5. 群晖 NAS DSM 系统,只要三步使用 Docker 安装迅雷远程下载
  6. 依赖性检查工具Snyk与Dependency-check对比
  7. 关于如何有效锻炼肌肉的十个小贴士(转)
  8. [ C语言版 ] 数独计算器 [ 搜索剪枝法 ]
  9. 温故而知新,可以为师矣,回忆一下排序的思路
  10. 金融行业的数据分析应该怎么做?