8月Node服务的3场事故
有句话叫每一起严重事故的背后,必然有 29 次轻微事故和 300 起未遂先兆以及 1000 起事故隐患。
而我最近更是碰到了 3 起比较严重的线上事故,都是大意惹的祸。
一、数据库锁死
第一起事故发生在凌晨 4 点到 6 点,我们有个数据库被锁死了,无法更新和写入。
当天早上 5 点客服打电话给我,把我吵醒后紧急摇人,打电话给运维,打了 5 次才打通,他也马上开机排查。
原因很简单,就是有一张表,记录极速增长,超出了数据库的限定容量(1TB),从而导致库被锁,马上扩容。
去年对这张表做过一次清理,但当时没有引起重视,造成了今天这场事故。
幸亏这个数据库大部分的使用场景是管理后台,所以线上业务没有造成太大的损失,不过小范围内有点影响。
后续动作
将线上重要的业务与这个数据库做剥离,也就是不再依赖这个数据库。
对那张极速增长的表做剥离,即迁移到另一个数据库中,对于量比较大的各类日志数据,单独创建一个数据库,统一管理。
对此表做定期清理,例如只保留 3 个月的记录,其余全部删除。
二、Redis 服务故障
第二起事故发生在凌晨 2 点,不过就持续了 30 秒,看来夜深人静的时候比较容易滋生意外。
虽然只存在了 30 秒,但仍然影响了 221 个用户。排查下来是 Redis 服务连接异常,导致服务意外重启。
在重启过程中,那些请求都无法被处理,从而让业务无法响应。
在确认不是代码逻辑造成的异常之后,开始摇运维,让他去找服务供应商,
一开始服务商认为是某个 Redis 命令阻塞了请求,不过在仔细核对代码后,发现并不是这样。
于是再次去挑战服务商的维护人员,故障发生的时间也再一次缩小了范围。
最终确认在那个时间有主备切换操作(不定期),导致了报错。
后续动作
一开始就仅仅是将切换时间改成凌晨的三点,但是随后几周又出现了 Redis 的连接问题。
虽然时间只有 20 多秒,不过还是影响了小部分的线上业务,对用户体验造成了极其糟糕的影响。
再次摇运维,让他去沟通解决,一开始他觉得这么短的时间应该问题不大,可以将升级时间配置到我们在办公的时间。
好像有点道理,但是细究下来,还是有点问题的,对于用户来说,他们只看结果,若自己碰到了异常,那么就会认定你的系统不稳定。
他们只会在意 0 和 1,不会在意你这异常发生的概率是多少,影响的范围是多少。
所以后面继续和运维拉扯了一下,他了解到可以从单区升级成双区,这样就能在升级的同时而不影响线上业务。
不过,在升级期间,还是会有 30 秒左右的断开时间,但各项缓存配置不用单独做修改。
三、海外短信盗刷
短信服务已经被应用到日常业务的很多模块中,主要用于身份的验证,本事故与短信直接相关。
前两个事故并没有造成经济损失,但海外短信盗刷造成了比较大的经济损失。
攻击持续了 3 天,很巧的是,正好碰到双休日,大家都不在工位的时候。
第一天盗刷后,运维受到了费用受限的通知,告知了服务端,服务端再告知了我们组。
然后当天就让运维把短信总量降一半,为盗刷的国家增加每日的短信上限,我们组修改短信接口,接入风控保护。
隔了两天是周六,发现又在被刷,原来是手机号码和 IP 一直在变化,绕过了风控策略,并且运维并没有对所有的国家配置短信上限。
服务端在风控保护的代码中直接关闭了海外短信,原先设想是临时关闭两天,因为我们组的业务只会影响极小部分的用户。
结果服务端忘记发布代码,导致第三次被刷。
后续动作
首先将每日的海外短信上限调整到更小的数量,再缩小一半。
其次是设置海外国家白名单,如果为所有国家配置上限数量,不仅工作量大,而且还会有遗漏的隐患。
再有,查看日志发现,攻击者的手机号码都是随机生成的,因此,我们可以做一次身份校验。
因为我们使用到短信的业务都会有身份信息,所以可以对手机号进行校验,只有是数据库中的手机才能发送短信。
这部分的短信业务已经存在许久,但是一直没有引起我们的安全意识,非常脆弱,服务端之前也被攻击过,后面做了防御。
还有一种短信防御,就是加验证码,在发送接口中核对验证码,只有是合法的,才会提供发送服务。
8月Node服务的3场事故的更多相关文章
- node服务的监控预警系统架构
需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...
- Node服务一键离线部署
背景说明 项目测试通过,到了上线部署阶段.部署的机器安全限制比较严格,不允许访问外网.此外,没有对外网开放ssh服务,无法通过ssh远程操作. 针对上面提到的两条限制条件,通过下面方式解决: 无法访问 ...
- 能取悦生理期的女性吗?Le Parcel提供女性卫生用品按月订购服务,不是按包出售而是可以按片自由搭配 | 36氪
能取悦生理期的女性吗?Le Parcel提供女性卫生用品按月订购服务,不是按包出售而是可以按片自由搭配 | 36氪 能取悦生理期的女性吗?Le Parcel提供女性卫生用品按月订购服务,不是按包出售而 ...
- 前端跨域方案-跨域请求代理(node服务)
前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...
- 添加swagger api文档到node服务
swagger,一款api测试工具,详细介绍参考官网:http://swagger.io/ ,这里主要记录下怎么将swagger api应用到我们的node服务中: 1.任意新建node api项目, ...
- node服务的安装以及vue的安装
相信很多朋友都在装node服务和安装vue的时候会遇到一些问题,下面为大家详细介绍node服务的安装以及vue的安装: 1.nodeJs官网下载版本(根据自己电脑的配置进行相应下载即可):默认安装路径 ...
- node服务端搭建学习笔记
咳咳,终于迈出这一步了...这篇文章将是边学边写的真正笔记...用于mark下学习过程中的点滴~ 开篇先把我学习参考的文章来源给出,以表示对前人的尊敬: https://github.com/nswb ...
- Node服务端极速搭建 - nvmhome
本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...
- Node服务端极速搭建 -- nvmhome
> 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...
- 起一个node服务
使用node开发一个应用,非常简单,甚至都不用去配置一堆文件来启动一个webu服务器,直接去官网把这一段示例代码拷过来 https://nodejs.org/en/about/ 中文网没有这个abou ...
随机推荐
- 【LGR-142-Div.4】洛谷入门赛 #13 赛后总结
A.魔方 目测入门 -,就是需要开long long //1 #include<bits/stdc++.h> typedef long long valueType; int main() ...
- 深入剖析创建Java虚拟机的实现方法
经过前文<深入剖析java.c文件中JavaMain方法中InitializeJVM的实现>的分析,找到了创建Java虚拟机具体实现的方法Threads::create_vm((JavaV ...
- Intellij IDEA 插件开发
写在前面 很多idea插件文档更多的是介绍如何创建一个简单的idea插件,本篇文章从开发环境.demo.生态组件.添加依赖包.源码解读.网络请求.渲染数据.页面交互等方面介绍,是一篇能够满足基本的插件 ...
- SpringBoot基础学习(番外9.1)Spring MVC或Spring Boot配置默认访问页面不生效?
1.tomcat配置默认访问页面 进入 tomcat 的 conf 目录,编辑 web.xml 文件.在 <web-app></web-app> 添加默认访问页面. <w ...
- .NET周刊【7月第2期 2023-07-09】
由于这周比较忙,只给出了标题和链接,没有具体的简介. 另外根据粉丝朋友的反馈,".NET周报" 更名为 ".NET周刊",希望大家喜欢 : ) 国内文章 Ava ...
- CF546E Soldier and Traveling 题解
CF546E Soldier and Traveling 英文原题: 当然Luogu有中文翻译 对于这种类型的题目,又是增加,又是减少的,我们可以使用网络流进行转化. 说句废话: 网络流这个东西,趣味 ...
- 抽象语法树AST必知必会
1 介绍 AST 打开前端项目中的 package.json,会发现众多工具已经占据了我们开发日常的各个角落,例如 JavaScript 转译.CSS 预处理.代码压缩.ESLint.Prettier ...
- 但因热爱,愿迎万难,OpenTiny 社区增加一枚前端程序媛贡献者🎉
我们非常高兴地宣布,OpenTiny Vue Playground 正式上线! 链接:https://opentiny.github.io/tiny-vue-playground/ 在此非常感谢 xi ...
- 微服务集成seata完成分布式事务,解决数据不一致问题
细心的盆友可能已经发现了,我们的跨行转账并没有保证数据一致性,比如小明扣除了100,但是因为各种问题小红在添加100金额的时候遇到了异常,这个时候数据就出现不一致性 我们可以选择seata来进行分布式 ...
- TCP 粘包
TCP(Transmission Control Protocol,传输控制协议)是一种传输层协议. TCP提供了以下主要功能: 可靠性:TCP使用确认.重传和校验等机制来确保数据的可靠传输.它能够检 ...