语雀服务器P0事故的一些启发

news2024/11/14 3:48:49

文章目录

      • 背景
      • 错误显示
      • 故障原因及处理过程
      • 改进措施
      • 补偿
      • 启发
        • 监控和告警
        • 容灾备份
        • 自动化部署和回滚
        • 灰度发布
        • 定期演练和测试
        • 日志和审计
        • 容错性
        • 弹性扩展
        • 性能优化
        • 安全性
        • 持续改进
        • 稳定业务不动
        • 多方验证
        • 不要抱着侥幸心理
        • 白名单内测
        • 留后手
        • 总结
      • 写在最后

579a429daf314744b995f37351b46548

背景

语雀是蚂蚁金服旗下的一款在线文档编辑与协同工具,自2018年上线以来,凭借其强大的功能和优秀的用户体验,吸引了众多个人和企业用户,成为了国内最受欢迎的在线文档平台之一。然而,就在2023年10月23日,语雀遭遇了一场前所未有的P0级事故,导致平台无法正常访问和使用,持续了近8个小时(14时10分至21时45分左右)

640


错误显示

2


故障原因及处理过程

640 (1)


改进措施

  • 1、升级硬件版本和机型,实现离线后的快速上线。该措施在本次故障修复中已完成;

  • 2、运维团队加强运维工具的质量保障与测试,杜绝此类运维 bug 再次发生;

  • 3、缩小运维动作灰度范围,增加灰度时间,提前发现 bug;

  • 4、从架构和高可用层面改进服务,为语雀增加存储系统的异地灾备。


补偿

语雀团队表示,为了表达歉意,团队将向所有受到故障影响的用户提供如下赔偿方案:

  • 针对语雀个人用户,我们赠送 6 个月的会员服务。操作流程:进入工作台「账户设置」,点击左侧「会员信息」,在会员信息页面点击「立即领取」,即可获得赠送服务。

image-20231026084737986


启发

那么在这次服务器PO事故上我们能得到什么启发,采取什么样的措施来尽可能避免线上突发的问题,或者尽快恢复线上业务,谈谈个人的见解:

  1. 高可用架构

    采用集群、负载均衡、冗余备份等技术手段,确保服务器的高可用性。当一个服务器出现故障时,其他服务器可以接管其工作,保证服务的连续性。

  2. 监控和告警

    建立完善的监控系统,实时监测服务器的运行状态、性能指标和异常情况。及时发现问题,并设置告警机制,及时通知相关人员进行处理。

  3. 容灾备份

    定期进行数据备份,并将备份数据存储在不同的地理位置或云服务商上,以防止数据丢失。同时,建立容灾方案,当主服务器出现故障时,能够快速切换到备用服务器。

  4. 自动化部署和回滚

    采用自动化部署工具,确保服务器的配置和应用程序的部署过程可重复、可靠。同时,建立回滚机制,当部署出现问题时,能够快速回滚到上一个稳定版本。

  5. 灰度发布

    在发布新版本或更新时,采用灰度发布策略,逐步将流量引导到新版本,以降低发布带来的风险。如果出现问题,可以快速回滚到旧版本。

  6. 定期演练和测试

    定期进行系统演练和压力测试,模拟各种故障和异常情况,验证系统的稳定性和可靠性。同时,进行回滚测试,确保回滚操作的可行性和正确性。

  7. 日志和审计

    记录服务器的运行日志和操作日志,便于故障排查和问题定位。同时,进行审计,监控服务器的访问和操作,防止未授权的访问和恶意操作。

  8. 容错性

    系统应该能够容忍部分故障或异常情况,不会导致整个系统崩溃或无法使用。通过合理的设计和架构,将系统的各个组件解耦,降低单点故障的风险。

  9. 弹性扩展

    系统应该能够根据业务需求和负载情况进行弹性扩展,以满足用户的需求。通过自动化的扩容和缩容机制,根据实际情况调整系统的资源配置。

  10. 性能优化

    对系统进行性能优化,提高系统的响应速度和吞吐量。通过合理的缓存策略、数据库优化、代码优化等手段,提升系统的性能。

  11. 安全性

    确保系统的安全性,防止未授权的访问和恶意攻击。采用安全认证、加密传输、漏洞扫描等措施,保护系统的数据和用户的隐私。

  12. 持续改进

    不断进行系统优化和改进,根据用户反馈和业务需求,及时修复问题和提升系统的功能和性能。通过持续集成和持续交付,快速发布新版本和修复补丁。

  13. 稳定业务不动

    对于线上稳定的业务,一般都不要去动它。

  14. 多方验证

    对于需要上线的业务,需要执行的重要的sql,一定要经过多方的验证。

  15. 不要抱着侥幸心理

    对于生产环境会出现,测试环境不会出现的一些问题,千万不要抱着侥幸心理。

  16. 白名单内测

    重大的变更要做白名单内测,保证正式环境也能有真实的用户去测试。

  17. 留后手

    万事要留后手,并且做响应的应急文档操作手册。


总结

​ 当服务出现问题时,我们应该及时发现并解决问题,并且在设计系统时考虑到容错和恢复能力,以保证系统的稳定性和可靠性。


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1248698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++算法 —— 贪心(4)

文章目录 1、分发饼干2、最优除法3、跳跃游戏Ⅱ4、跳跃游戏Ⅰ5、加油站6、单调递增的数字7、坏了的计算器 1、分发饼干 455. 分发饼干 其实看完这个题会发现,如果给定的两个数组不排序的话会非常难受,所以无论怎样,先排序。接下来需要比较两…

蓝桥杯每日一题2023.11.24

题目描述 #include <stdio.h> #define N 100int connected(int* m, int p, int q) {return m[p]m[q]? 1 : 0; }void link(int* m, int p, int q) {int i;if(connected(m,p,q)) return;int pID m[p];int qID m[q];for(i0; i<N; i) ________________________________…

软文写作如何布局?媒介盒子分享三大类型

好的软文需要有清晰的结构和流畅的语言&#xff0c;让读者能够很快理解和接受文案的内容&#xff0c;因此在写文案之前&#xff0c;需要先列出思路和框架&#xff0c;明确文案的主题和重点&#xff0c;选择合适的语言和表达方式。让文案更加生动易懂&#xff0c;下面就让媒介盒…

yo!这里是c++11重点新增特性介绍

目录 前言 列表初始化 { }初始化 initializer_list类 类型推导 auto decltype 范围for 右值引用与移动语义 左值引用和右值引用 移动语义 1.移动构造 2.移动赋值 3.stl容器相关更新 右值引用和万能引用 完美转发 关键字 default delete final和override …

数组基础知识

数组基础&#xff08;不定时更新&#xff09; 数组基础 数组基础 &#xff08;1&#xff09;数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。数组下标都是从0开始的。数组内存空间的地址是连续的。 &#xff08;…

python-选择排序

选择排序是一种简单直观的排序算法&#xff0c;它的基本思想是每一轮选择未排序部分的最小元素&#xff0c;然后将其放到已排序部分的末尾。这个过程持续进行&#xff0c;直到整个数组排序完成。(重点&#xff1a;通过位置找元素) 以下是选择排序的详细步骤和 Python 实现&…

element ui 上传组件实现手动上传

首先需要给上传组件增加http-request属性&#xff0c;这个方法中可以获取到文件&#xff0c;并按照自己的方式进行上传。 <el-uploadreffileUploadaction#:http-requesthttpRequest:on-preview"handlePreview":on-remove"handleRemove":limit"1&q…

SpringBoot3核心原理

SpringBoot3核心原理 事件和监听器 生命周期监听 场景&#xff1a;监听应用的生命周期 可以通过下面步骤自定义SpringApplicationRunListener来监听事件。 ①、编写SpringApplicationRunListener实现类 ②、在META-INF/spring.factories中配置org.springframework.boot.Sprin…

接口测试:轻松掌握基础知识,快速提升测试技能!

1.client端和server端 开始接口测试之前&#xff0c;首先搞清楚client端与server端是什么&#xff0c;区别。 web前端&#xff0c;顾名思义&#xff0c;指用户可以直观操作和看到的界面&#xff0c;包括web页面的结构&#xff0c;web的外观视觉表现及web层面的交互实现。 web后…

Python---函数的参数类型

位置参数 理论上&#xff0c;在函数定义时&#xff0c;我们可以为其定义多个参数。但是在函数调用时&#xff0c;我们也应该传递多个参数&#xff0c;正常情况&#xff0c;其要一一对应。 相关链接&#xff1a;Python---函数的作用&#xff0c;定义&#xff0c;使用步骤&…

jQuery 第十一章(表单验证插件推荐)

文章目录 前言jValidateZebra FormjQuery.validValValidityValidForm BuilderForm ValidatorProgressionformvalidationjQuery Validation PluginjQuery Validation EnginejQuery ValidateValidarium后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&…

单链表的反转?太细了哥们!细到离谱!

单链表的反转&#xff08;面试常出&#xff09;&#xff1a; ​ 单链表的反转&#xff0c;可以通过很多种方法实现。包括迭代法&#xff0c;递归法&#xff0c; 迭代法&#xff1a; 定义三个指针&#xff1a;prev、current和next&#xff0c;它们分别表示前一个节点、当前节点…

Excel动态选择某一行/列的最后一个数据

选择列的最后一个数据&#xff1a; 以A列为例&#xff0c;使用&#xff1a; LOOKUP(1,0/(A:A<>""),A:A)选择行的最后一个数据&#xff1a; 以第3行为例&#xff0c;使用&#xff1a; LOOKUP(1,0/(3:3<>""),3:3)示例程序 列最后一个数据&a…

IO口速度影响了什么?

我们在初学单片机的时候都知道单片机GPIO的作用是巨大的&#xff0c;在配置GPIO的时候&#xff0c;结构体初始化里有一个选项是配置输入输出速度的&#xff0c;对于这个速度输出是必须要配置的&#xff0c;输入没有明令说明需不需要配置。 这个速度对于学习过32单片机的都应该知…

python——第十三天

uuid 是通用唯一识别码&#xff08;Universally Unique identifier&#xff09;的缩写 UUID是一个128比特的数值 uuid模块&#xff1a; 获取一个128位&#xff08;比特&#xff09;的永不重复的数字&#xff0c;当然我们使用的时候会转换为32个的字符串 impor uuud uui…

js粒子效果(二)

效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Particle Animation</title><…

C#,《小白学程序》第七课:列表(List)其一,编制《高铁车次信息表》

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary>…

【算法专题】滑动窗口—无重复字符的最长子串

力扣题目链接&#xff1a;无重复字符的最长子串 一、题目解析 二、算法原理 解法一&#xff1a;暴力解法&#xff08;时间复杂度最坏&#xff1a;O(N)&#xff09; 从每一个位置开始往后枚举&#xff0c;在往后寻找无重复最长子串时&#xff0c;可以利用哈希表来统计字符出现…

2023年【汽车驾驶员(中级)】最新解析及汽车驾驶员(中级)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年汽车驾驶员&#xff08;中级&#xff09;最新解析为正在备考汽车驾驶员&#xff08;中级&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的汽车驾驶员&#xff08;中级&#xff09;试题及解…

vue3 for循环创建的多个e-form 添加校验

v-for 创建 ref <el-form :model"item" :rules"state.rules" :ref"el > getRiskSpreadRef(el, index)" ></el-form>// 定义ref list const riskSpreadRefList ref<HTMLElement[]>([]);// ref存到数组 const getRiskSpread…