这周刚新上了需求,在慢慢写代码的时候,突然报警群的消息多了,组长让我看看咋回事。

一开始没当回事,因为faas任务的错误日志一直很多,但是发现新的日志和以前大不相同,显示的是上游faas实例的连接被mesh拒绝。

我也没啥好办法,只能先去看看实例数量,再看看DB的QPS。

监控DB单实例QPS才3K多,平时刷数据一直这个量,所以我就觉得没问题 。

又看了看DB的CPU和io吞吐,也没到高水位,那想必不是DB问题,我就截了个日志图丢小群里继续写代码,毕竟faas任务也不是我管的(笑)。

后来faas任务的错误日志越来越多,终于吃饭时候主机房DB挂了,这会大家都急了,直接拉DBA,一看DB实例代理的CPU已经完全打满,连接数触目惊心,我才发现原来我司每台DB的端口都是有代理的。

然后DBA重启代理+扩容,终于恢复了主机房可用性。因为我们的faas任务横跨两个库,另一个大团队的通用库也打挂了,导致一小段时间整个业务写请求全部受到影响,但是幸好日常写请求不多,而且异地机房的从库很正常,所以大家也没发现。

最后小群里归因复盘,主要原因有几个:1.当天其他部门上游产出的领域事件比日常多很多,导致下午都没有消费完,平时只限于早上的高峰,问题暴露不明显;2.鸡架的领域事件设了无限重试,导致消费失败后的毫秒级重试,最后引起雪崩。这个最后是关闭重试,因为相关数据状态第二天数仓也会做同步,所以影响业务不大;3.那天调整了数据库连接池,将线程使用连接后放回连接池的时间延长了六倍,导致不得不重复创建连接,最后把代理打满;4.鸡架的限流设置并没有什么用,上游限流值设置完全失效;5.当天其他部门产出了重复的领域事件,为此当天还产生了数据库死锁的问题


所以如何解决问题,说实在作为一个组内地位最低的搬砖仔我也没啥好办法,感觉这就是管理和架构设计问题。

我们用的faas动态扩缩容,通过触发器实现消费,可以说是较多实例和较小QPS的方式,最后来批处理大量的数据,这种和传统批处理比有优有劣。

显而易见的坏处就是多实例可能会同时创建大量的连接,而不是选择复用连接,资源占用的高峰和低谷都很明显。

靠触发器而不是定时任务,以后会随着需求越来越多,占用资源的峰谷更加不稳定,带来更大的问题。

然后就是不好管理,如果鸡架稳定性不行,新创建的实例可能在每次初始化的时候都会有问题,这点不如单独部署若干台机器长期待机。


关于数据库死锁也提一嘴,批处理的时候尽量避免事务和同时更新同一行数据,如果要用事务也要尽量把同时更新的数据切小,不要同时锁住大量的行。

大厂的隔离级别一般都是读已提交,这种情况下MVCC依然有效,只是没有了间隙锁,读也是当前读,只要不是同时更新相同的大批量行问题还是不大的。

记一次线上DB被打挂的更多相关文章

  1. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  2. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

  3. 记一次线上MySQL数据库死锁问题

            最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过.这次刚好遇到了,便在此记录一下 ...

  4. 记一次线上Curator使用过程JVM栈溢出解决

       为了同学们看起来一目了,特按如下思路进行讲解. 1.出现的场景    2.分析及解决的过程    3.总结 最近公司要使用zookeeper做配置管理(后面简称ZK),然后自己就提前用虚拟机进行 ...

  5. 记一次线上coredump事故

    1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发生在业务低峰期,而且该模块提供的功能也不是核心流程功能,所以对线上业务影响比较小.发生coredump后,运维收到 ...

  6. 记一次线上事故的JVM内存学习

    今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...

  7. 记一次线上gc调优的过程

           近期公司运营同学经常表示线上我们一个后台管理系统运行特别慢,而且经常出现504超时的情况.对于这种情况我们本能的认为可能是代码有性能问题,可能有死循环或者是数据库调用次数过多导致接口运行 ...

  8. 记一次线上Kafka消息堆积踩坑总结

    2018年05月31日 13:26:59 xiaoguozi0218 阅读数:2018更多 个人分类: 大数据   年后上线的系统,与其他业务系统的通信方式采用了第三代消息系统中间件Kafka.由于是 ...

  9. 记一次线上由nginx upstream keepalive与http协议"协作"引起的接口报错率飙高事件

    年前接到个任务,说要解决线上一些手机客户端接口报错率很高的问题.拿到了监控邮件,粗略一看,各种50%+的错误率,简直触目惊心.这种疑难杂症解决起来还是挺好玩的,于是撸起袖子action. 最终的结果虽 ...

  10. 记一次线上dubbo服务超时和线程池满问题排查

    线上某dubbo服务A调用dubbo服务B的接口X方法,调用端A日志中出现了很多超时的情况,提供端B该接口X超时时间设置为60s: 查看提供端B的日志,报了很多线程池满的异常: Caused by: ...

随机推荐

  1. twenty-three

    Vue(用于构建用户界面的前端框架) Vue框架的特性,主要有 ① 数据驱动试图 ②双向数据绑定 js数据的变化,会被自动渲染到页面上 页面上表单采集的数据发生变化的时候,会被vue自动获取到,并更新 ...

  2. 《计算机是怎么跑起来的》第十章 XML(可扩展标记语言)

    资料来源 (1) <计算机是怎么跑起来的> 注1:XML是Extensible Markup Language(可扩展标记语言)的缩写; 1.XML是标记语言 (1) 通常把通过添加标签为 ...

  3. 深入理解 epoll 原理

    从网卡如何接收数据说起 CPU 如何知道接受了数据? 进程阻塞为什么不占用 CPU 资源? 工作队列 等待队列 唤醒进程 内核接收网络数据全过程 同时监视多个 socket 的方法 select 的监 ...

  4. Qt 一键部署脚本

    echo "begin deploying..." echo Setting up environment for Qt usage... set PATH=C:\Qt\Qt5.8 ...

  5. sql常用记录

    sqlserver 在已有值的列上自动增加 获取列最大的值 declare @Field int select @Field = ISNULL(Max(Field),0) from SupCsBill ...

  6. vim重复、删除、复制、粘贴命令

    0.选中 V+(上.下键)    表示选中 1.删除 1.输入10x,删除10个连续字符 2.输入3dd,将会删除3行文本 在普通模式下,你还可以使用dw或者daw(delete a word)删除一 ...

  7. MySQL时区的问题

    我这里是在application.properties文件中配置的MySQL连接信息. 开始时间显示不征程是因为没有配置时区,后来加上了setTimeZone=Asia/Shanghai,时间显示正常 ...

  8. 安装zookeeper 和 kafka

    本文用到的同步脚本   https://www.cnblogs.com/sdgtxuyong/p/16907986.html 一 . 安装zookeeper 修改hosts文件,将test1,test ...

  9. pip修改镜像源

    # 单独一次下载软件 pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple # 全局修改 pip config set gl ...

  10. Linux 释放内存及占用较高问题排查

    1. 查看内存情况 #按 k 查看 free #按兆M查看 free -m total:总计物理内存的大小. used:已使用多大. free:可用有多少. Shared:多个进程共享的内存总额. B ...