后端存储实战课
李玥
美团高级技术专家
44005 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语 (1讲)
后端存储实战课
15
15
1.0x
00:00/00:00
登录|注册

08 | 一个几乎每个系统必踩的坑儿:访问数据库超时

首页降级方案
定时监控和杀慢SQL脚本
缓存命中率
避免慢SQL
数据规模评估
优化解决问题
首页缓存刷新慢
定位问题
缓存生效
排行榜查询缓存
发现特别慢的SQL
排查慢SQL
高CPU利用率
重点排查用户访问功能
访问量高峰
数据存储设计
微服务架构
临时降级方案
自我保护机制
架构层面改进
故障排查经验
架构改进建议
合理使用缓存
SQL编写注意事项
定时任务排查
缓存优化
MySQL CPU利用率分析
初步判断
系统架构
小结
如何避免悲剧重演
事故排查过程
数据库超时故障排查与解决

该思维导图由 AI 生成,仅供参考

你好,我是李玥。
每一个创业公司,它的系统随着公司的发展一起成长的过程中,都难免会发生一些故障或者是事故,严重的会影响业务。搞技术的同学管这个叫:坑儿,分析解决问题的过程,称为:填坑儿。而访问数据库超时这个坑儿,是我见过的被踩的次数最多的一个坑儿,并且这个坑儿还在被不停地踩来踩去。
今天这节课,我和你分享一个典型的数据库超时案例。我也希望你通过和我一起分析这个案例,一是,吸取其中的经验教训,日后不要再踩类似的坑儿;二是,如果遇到类似的问题,你能掌握分析方法,快速地解决问题。最重要的是,学习存储系统架构设计思想,在架构层面限制故障对系统的破坏程度。

事故排查过程

我们一起来看一下这个案例。
每一个做电商的公司都梦想着做社交引流,每一个做社交的公司都梦想着做电商将流量变现。我的一个朋友他们公司做社交电商,当年很有前途的一个创业方向,当时也是有很多创业公司在做。
有一天他找到我,让我帮他分析一下他们系统的问题。这个系统从圣诞节那天晚上开始,每天晚上固定十点多到十一点多这个时段,大概瘫痪一个小时左右的时间,过了这个时段系统自动就恢复了。系统瘫痪时的现象就是,网页和 App 都打不开,请求超时。
这个系统的架构是一个非常典型的小型创业公司的微服务架构。系统的架构如下图:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

这篇文章分享了一个典型的数据库访问超时案例,通过分析访问量、MySQL的CPU利用率和慢SQL日志,最终定位了问题。故障原因是由于首页缓存刷新慢,导致请求直接穿透缓存打到数据库上,影响了系统的稳定性。作者提出了解决方案,通过增加缓存、优化数据库查询等措施,成功解决了系统故障。此外,文章还提出了在编写SQL时需要小心谨慎地仔细评估,以及利用缓存减少数据库查询次数的建议。作者还在架构层面提出了改进建议,包括上线一个定时监控和杀掉慢SQL的脚本,以及做一个简单的静态页面的首页作为降级方案。这些改进都可以在一定程度上减轻故障对系统的影响。整篇文章内容详实,适合技术人员学习和参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端存储实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(42)

  • 最新
  • 精选
  • 冯玉鹏
    老师,慢SQL 我感觉也没有个人标准,个人的标准也要分场景,业务复杂度等;如果作为常规的用户业务系统,超过1秒就是慢SQL;但是如果是类似生成报表的服务,选择在业务低峰期,从库执行等策略,时间长点也不是不能接受。 避免慢SQL:第一点肯定想到的是合适的索引,毕竟SQL执行速度的快慢关键还是语句需要扫描数据的行数,如尽量不要使用 对where 条件列进行计算的做法让MySQL查询优化器不知道怎么选择索引,特定业务 可以设置联合索引让需要查询返回的列都在索引中避免回表操作。 第二:排序也是可能完成慢SQL的因素,尤其是数据量大,需要使用外部排序的时候又可以与磁盘IO性能扯上关系等,常见的问题还有limit m,n m很大又无法使用索引的时候 第三:多表联合查询的时候,尽量使用小表驱动大表。 第四:避免大事务,这也是发生死锁常见的雷区,尽量减小事务粒度,尽量注意不同事务对表操作的顺序一致,大事务其实也包含着批量操作的隐式事务,如一个update 影响100万行数据。 第五:见过的关于架构方面的慢SQL问题 1~数据量到达一定规模后,单机性能容易受限导致数据库响应慢;2~读写分离,从库提供读服务,错误的认为从库只需要提供查询服务采用了达不到性能指标的机器,其实是主库承受的数据更新压力,从库一个不落的都要承受,还要更多的提供查询服务

    作者回复: 👍👍👍👍👍

    2020-03-14
    4
    114
  • 上面那个小型创业公司的微服务架构,想知道有关 Nginx 的主备是怎么实现的?

    作者回复: 我们例子里面当时它采用的就是人肉冷备,主节点出问题的时候人肉切换到备用节点上。 其实更合理的做法是做通过负载均衡器或者域名把流量均匀的打到多个NGINX节点上,配合探活机制,当某个节点有问题的时候,自动摘掉这个节点。

    2020-03-17
    2
    17
  • 小唐
    请问老师,我有两个问题请教。1. 为什么后台服务被大量请求打死的话无法自动恢复呢? 2. 案例中用的什么cache,怎么refresh的?

    作者回复: 1. 一般“服务被打死”,比较常见的情况是内存溢出、栈溢出或者进程直接挂掉,这些情况都是不能自动恢复的。 2. 案例中用的是Memcached,刷新的策略也是根据不同业务有不同的策略。

    2020-06-11
    3
    13
  • Halo
    老师,我现在想做一个Mysql的本地熔断方案。就是监控对每一个表的操作语句,通过机器数量在配置中心配置每个服务的访问频次、访问时间等。比如Mysql的TPS是4000,我们有10台机器,平均下来每个服务的上限为400/s。碰到超限、或者超慢的情况就熔断、告警。可以整体监控,也可以对热点表进行监控,这种方案是否可行?

    作者回复: 必须可行啊。但要注意一下配置中心的高可用。别出现因为配置中心宕机,导致不能熔断了。

    2020-04-03
    2
    11
  • 美美
    个人感觉,算不算慢SQL首先取决于这条SQL有没有正确的命中索引。如果可以正确的命中索引,那么从业务上是否正确。如果业务匹配,且正常命中索引,那应该不算是慢查询。 看完本章还有一点疑惑,就是当第一个慢查询SQL处理完成后,MySQL的CPU使用率已经降到了20%以下。那么即便会有周期性的SQL执行,但是以这个利用率不足以整体导致服务不可用吧。

    作者回复: 20%左右那个是闲时的图,忙时依然是100%....

    2020-03-15
    7
  • Regis
    老师讲的非常好,给出了查找问题的思路和解决问题思路,对于项目经验少的很有用。后续课程里面有没有涉及对于视频类的大文件存储方式和使用方式的课程?这部分数据知道使用对象存储进行存储比较好,但是对于有这种大文件的存储的系统架构方面还是不清晰,老师要是了解给指导一下可以吗

    作者回复: 后面有一节课是专门讲对象存储的,敬请期待。

    2020-03-16
    5
  • 发条橙子 。
    老师 针对两个问题排查后处理的方法能不能给个思路 1. 缓存热点数据 : 因为使用连表查询等复杂语句在数据量大的时候会产生慢差 。是否该考虑修改查询语句或者上搜索(es / 阿里open search ) 然后再加一道缓存 缓存的读写策略采用旁路策略。 2. 像这种定时任务应该大部分公司都会有很多,一般都是放到凌晨来执行 ,经常会有人问当数据量大的时候 这种定时任务是否可行。 所以像数据量非常大(京东这种级别数据) 定时任务扫表是否还可行 有没有其他的解决思路 希望老师给些思路 谢谢🙏

    作者回复: 这两个问题我在后续的课程中都会讲到一些解决的经验和方法。 这种大查询,首先肯定是要用缓存,但要根据实际情况选择合适的缓存更新策略。 数据量特别大的统计分析,一般选择放到其它分析型数据库或者数据仓库中去执行,或者使用流计算来解决。

    2020-03-15
    3
    2
  • R
    老师好,我想问一下如果定时任务执行时间到了,但是数据还没执行完,这时候该怎么处理?

    作者回复: 一般还是要执行完成,下一个周期的任务就不再执行了。

    2020-03-23
    2
  • leslie
    合理使用日志系统、通过合理监控获取必要时信息和做报警提醒,每天定时排查日志中记录的问题;例:cpu使用率、IO使用率等。 指定一套完善的开发规范:严禁开发去写,上线之前做code review;规范制度+code review+架构审核,基本能避免大多数问题的发生。
    2020-03-23
    11
  • myrfy
    慢SQL要以业务场景来区分。例如做即时通讯或者消息类等有实时性要求的,可能2秒就算慢查询了,但是读从库做大数据分析的场景,可能跑一个小时也不算慢。另外,对于请数量大的时候,如果存在多个请求会加锁,即使一个查询是毫秒级别的,上百个查询访问一个热数据加锁也会有很大的问题,所以,没有慢查询的具体标准,影响到业务,拖慢了服务的,就算慢查询。
    2020-03-14
    5
收起评论
显示
设置
留言
42
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部