有句话叫每一起严重事故的背后,必然有 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场事故的更多相关文章

  1. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  2. Node服务一键离线部署

    背景说明 项目测试通过,到了上线部署阶段.部署的机器安全限制比较严格,不允许访问外网.此外,没有对外网开放ssh服务,无法通过ssh远程操作. 针对上面提到的两条限制条件,通过下面方式解决: 无法访问 ...

  3. 能取悦生理期的女性吗?Le Parcel提供女性卫生用品按月订购服务,不是按包出售而是可以按片自由搭配 | 36氪

    能取悦生理期的女性吗?Le Parcel提供女性卫生用品按月订购服务,不是按包出售而是可以按片自由搭配 | 36氪 能取悦生理期的女性吗?Le Parcel提供女性卫生用品按月订购服务,不是按包出售而 ...

  4. 前端跨域方案-跨域请求代理(node服务)

    前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...

  5. 添加swagger api文档到node服务

    swagger,一款api测试工具,详细介绍参考官网:http://swagger.io/ ,这里主要记录下怎么将swagger api应用到我们的node服务中: 1.任意新建node api项目, ...

  6. node服务的安装以及vue的安装

    相信很多朋友都在装node服务和安装vue的时候会遇到一些问题,下面为大家详细介绍node服务的安装以及vue的安装: 1.nodeJs官网下载版本(根据自己电脑的配置进行相应下载即可):默认安装路径 ...

  7. node服务端搭建学习笔记

    咳咳,终于迈出这一步了...这篇文章将是边学边写的真正笔记...用于mark下学习过程中的点滴~ 开篇先把我学习参考的文章来源给出,以表示对前人的尊敬: https://github.com/nswb ...

  8. Node服务端极速搭建 - nvmhome

    本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...

  9. Node服务端极速搭建 -- nvmhome

    > 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...

  10. 起一个node服务

    使用node开发一个应用,非常简单,甚至都不用去配置一堆文件来启动一个webu服务器,直接去官网把这一段示例代码拷过来 https://nodejs.org/en/about/ 中文网没有这个abou ...

随机推荐

  1. C/S架构和B/S架构两种数字孪生技术路线的区别是什么?

    山海鲸创造了一种CS和BS热切换的编辑模式,即CSaaS架构,可以在安装软件之后一键从软件的CS状态切换为一个BS服务器,让私有化部署变得十分轻松.具体效果可以参照下面的视频: (https://ww ...

  2. JavaCV的摄像头实战之八:人脸检测

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...

  3. Windows RPC应用详解

    1.介绍 RPC,全称"Remote Procedure Call",即远程过程调用,它并不是Windows独有的概念,RPC的第一个实现是在unix上:RPC在Windows上的 ...

  4. 图书商城项目练习②后端服务Node/Express/Sqlite

    本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程.面向初学者,本人也是初学者,搬砖技术还不成熟.项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite).到 ...

  5. Linux 图形栈从入门到放弃 --- Linux 图形相关概念简介

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言   在日常生活中,像我们常用的ubunt ...

  6. C++内存模型&空指针、野指针、函数指针和回调函数

    C++内存模型&空指针.野指针.函数指针和回调函数 C++内存模型 栈与堆的区别: 1.管理方式不同 栈是系统自动管理的,在超出作用域后,将自动被释放 堆是手动释放,若程序中不释放,程序结束后 ...

  7. C++与Java的API对比(集合操作等方面)

    转载请注明出处(- ̄▽ ̄)- 个人第一篇博客,觉得不错就点个"推荐"吧 φ(゜▽゜*)♪ 虽然自己是先学的C++,再学的Java,但是相对而言,自己写Java比写C++要相对多一些 ...

  8. 动态SQL与静态SQL使用场景

    静态SQL 和动态SQL 的区别 静态SQL(或嵌入式SQL) 是应用程序中的 SQL 语句,它们在运行时不会更改,因此可以硬编码到应用程序中. 动态 SQL是在运行时构造的 SQL 语句:例如,应用 ...

  9. Web网页音视频通话之Webrtc相关操作(二)

    效果图 HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  10. sshpiper 在 Kubernetes 上的应用

    sshpiper 在 Kubernetes 上的应用 介绍 GitHub Repo 一个反向代理目标服务器的 proxy,客户端想请求某个 ssh 服务器,直接请求的是 sshpiper 服务,再经由 ...