一个简单的代码拼写错误导致17个生产数据库被删!微软Azure DevOps宕机10小时始末

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 一个简单的代码拼写错误导致17个生产数据库被删!微软Azure DevOps宕机10小时始末

一个拼写错误致微软Azure DevOps 宕机 10 小时

微软 Azure DevOps 是一套应用程序生命周期服务。5 月 24 日,Azure DevOps 在巴西南部(SBR)区域内一处 scale-unit(微软 Azure 部署架构中最小的容量单元)设施发生宕机,宕机持续了 10 个小时。

近日,微软首席软件工程经理 Eric Mattingly 对宕机事件表达歉意并透露了宕机原因:一个简单的拼写错误,致使 17 个生产数据库遭到删除。

Mattingly 解释道,Azure DevOps 工程师偶尔会保存生产数据库的快照,据此调查上报的问题或测试性能改进方向。为了清理这些快照数据库,会有专门的后台作业每天运行,并在快照超过一定期限后将其删除。

在最近的一波冲刺(敏捷上下文中的小组项目,编号为Sprint 222)中,Azure DevOps工程师执行了代码升级,想要用受支持的Azure.ResourceManager.* NuGet包替换掉已被弃用的Microsoft.Azure.Managment.*包。

这对应着一条巨大的 pull request 变更请求,会将旧包中的 API 调用替换为新包中的 API 调用。引发此次事件的拼写错误就出现在 pull request 内,导致后台快照删除作业删掉了整个服务器。

Mattingly 表示,“这条 pull request 中的快照删除作业里隐藏着一条拼写错误,它会删除 Azure SQL 数据库调用,并替换成删除托管数据库的 Azure SQL Server 调用。”

Azure DevOps 工程师使用安全部署实践(SDP)将 Sprint 222 部署到了 Ring 0(微软内部 Azure DevOps 组织),这里不存在快照数据库,所以删除作业不会执行。在 Ring 0 测试几天之后,Azure DevOps 工程师又将其部署至 Ring 1,也就是在此期间巴西南部的 scale-unit 设施受到了影响。快照数据库的存在时间触发了这项 bug,该作业在删除 Azure SQL Server 的同时,还删掉了 scale-unit 设施中所有 17 个生产数据库。从这时起,Azure DevOps 的 scale-unit 无法处理任何客户流量。

据 Mattingly 介绍,此次宕机事件并未引发数据丢失。为了防止问题再次发生,Mattingly 称微软已经采取了各种修复和重新配置措施,并向所有受此中断影响的客户道歉。

为什么耗时 10 小时才完成恢复?

据了解,Azure DevOps 是有检测此类问题的测试的。但根据 Mattingly 的介绍,“之所以以往没有发现,是因为这部分代码的运行条件非常罕见,我们的测试并没有切实覆盖这些极端情况。”有推测认为,这种极端条件要求删除脚本捕捉到特别陈旧的数据库快照。

虽然目前数据已经全部恢复,但整个宕机前后耗时 10 多个小时,为什么这么久才完成修复?Mattingly 对此做出了解释说明:“我们在数据库被删除后的 20 分钟内检测到宕机,值班工程师立即参与修复。在快速理解问题来源之后,我们开始恢复 SQL Server 及所有数据库,并禁用了快照删除作业以防止该 bug 影响到其他客户。但由于问题数量较多,因此恢复时间也相对较长。”

首先,客户无法自行恢复 Azure SQL Server,因此必须由 Azure SQL 团队参与恢复工作。确定需要 Azure SQL 值班工程师介入,接洽实际情况和问题,再加上服务器的实际恢复大约耗费了 1 个小时。

其次,所有数据库均配置有备份冗余,但部分数据库的创建时间早于区域冗余备份的上线时间。在恢复数据库时,Azure DevOps 为所有数据库选择了 Geo-zone-redundant,导致一部分还原数据按照此前配置的 Zone-redundant 备份被复制到了配对区域。这种匹配冲突又让恢复过程延长了好几个小时。对于这个问题,Azure DevOps 将确保所有数据库备份均按 Azure 区域支持被配置为 Geo-zone-redundant,使其覆盖 Azure DevOps 中的所有 scale-unit。

最后,在数据库开始恢复上线之后,由于 Azure DevOps 的 Web 服务器出现了一系列复杂问题,尽管数据库内容已经完成还原,客户也仍然无法访问整个 scale-unit 设施。

这个问题源自服务器的预热任务,该任务会通过测试调用遍历可用的数据库列表。但恢复过程中数据库招聘了一项错误,导致预热测试“执行指数级退避重试,令预热耗时由正常情况下的不到一秒延长到了平均 90 分钟。”

更复杂的是,整个恢复过程是交错进行的,一旦其中一、两台服务器重新开始接收客户流量,就会因过载而再次宕机。最终,工程师在只能阻断所有流向巴西南部 scale-unit 的流量,确保一切准备就绪再重新加入负载均衡器并处理流量。

如何避免此类问题再次发生?

目前,Azure DevOps 已经修复了快照删除作业中的 bug,并为快照删除作业创建了新的测试,面向真实 Azure 资源充分反映快照数据库的删除场景。

Mattingly 表示,Azure DevOps 正着手为关键资源添加 Azure 资源管理器锁,借此防止意外删除。同时,确保所有 Azure SQL 数据库备份均被配置为 Geo-zone-redundant 形式,并受到 Azure 区域的支持;确保未来的所有快照数据库,只会被创建在不同于生产数据库的 Azure SQL Server 实例之上。

此外,还会修复 Web 服务器预热任务的逻辑,确保即使数据库处于脱机状态时也能成功启动。并创建新的 cmdlet 来恢复已被删除的数据库,确保恢复结果使用与被删除前相同的设置(包括备份冗余)。

参考链接:

https://status.dev.azure.com/_event/392143683/post-mortem

https://www.theregister.com/2023/06/03/microsoft_azure_outage_brazil/

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
138 6
|
19天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
2月前
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
86 3
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
189 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3月前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
73 6
|
3月前
|
前端开发 数据库
数据库表设计生成代码
BizWorks ToolKit插件集成Mybatis-Plus代码生成工具,支持从数据库表生成代码,便于研发过程中数据模型变更后的代码同步。本文介绍批量生成代码的方法、配置说明及项目示例。配置文件`*.mp.yaml`用于描述生成行为,可放置于`src/main/resource/bizworks/mybatis-plus/`路径下。配置包括数据库信息、输出目录及包名等。通过IDEA右键菜单即可启动代码生成。具体配置和示例详见文档。
41 2
|
3月前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
55 0
|
3月前
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
75 0
|
3月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
155 0
|
4月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
95 0