前言:在复杂系统中,从不同微服务之间的交互到现实世界的破坏性事件,不可预测的结果随时笼罩着生产环境,混沌工程的初衷就是让工程师建立应对复杂系统中未知问题的信心。作为混沌工程的鼻祖 Netflix,在混沌工程的探索上,有着丰富的经验, 接下来让我们Netflix 的混沌工程实践。
背景
曾经有一段时间,Netflix 通过邮件提供 DVD 租赁服务,但由于增长率有限,因此他们转而创建流媒体服务,并建立一个整体技术栈。
随着业务的爆炸性增长,IT基础设施拓展也迎来了挑战。
继而Netflix 团队建立了微服务,但这也带来了一些新挑战:
1. 可靠的网络
计算机网络受到以下影响:
延迟问题网络故障带宽限制因此服务之间存在通信失败的风险。
2. 弹性
分布式系统的弹性能力取决于其最薄弱的组件,而最薄弱的组件通常等到发生故障影响服务后才会被发现。
混沌工程
为了更好地管理分布式系统,Netflix 团队进行了混沌工程实践。方法如下:
1. 实施
不存在停机时间为0的系统,但可以通过自动化来最大限度地减少停机时间。
因此,Netflix 团队会在办公时间主动发现潜在故障,然后自动修复。
这意味着如果故障再次发生,可以通过自动化快速修复,这种在受控实验中观察分布式系统的行为称为混沌工程,有助于在潜在问题导致生产中断之前发现它。
Chaos Monkey 关闭主数据库的流量
Netflix 团队创建了一个随机关闭服务器的工具,并将其命名为Chaos Monkey:
它通过持续交付平台获取有关可用服务器的信息它通过持续交付平台进行交互以关闭服务器然后他们检查流量是否被路由到另一台服务器而不会影响用户。
混沌工程的系统方法
他们进行混沌工程的方法如下:
对系统在故障期间的表现进行假设运行一个小测试来引入故障 - 关闭服务器或更改网络配置观察系统的行为并衡量故障影响自动修复问题然后重新运行测试以检查自动修复是否按预期工作,并在生产中运行混沌工程以确保准确性,但爆炸半径必须加以控制,以免影响用户。方法如下:
制定备用计划,应对最坏情况如果出现问题,使用功能标记快速回滚更改在生产前运行预生产测试先运行小规模测试然后扩展一次引入一个混沌变量,不要一次性破坏此外,他们适当测量测试影响以防止不必要的损坏。
2. 原则
混沌工程原理
Netflix 团队围绕以下原则创建了混沌工程:
自动化测试以节省成本和时间在生产中运行测试以获得相同的流量模式和可靠的结果根据潜在影响和频率运行事件测试 - 服务器崩溃、错误的 API 响应、流量激增关注可测量的输出来检查系统是否正常工作——吞吐量、延迟控制并最小化爆炸半径3.用例
混沌工程用例
以下是Netflix 团队利用混沌工程所做的事情:
减少故障次数提高系统可用性 - 99.9%查找潜在故障并自动修复检查故障转移机制是否按预期工作查找系统瓶颈和单点故障检查数据备份和恢复是否按预期工作检查系统如何响应服务依赖性故障通过研究系统对各种流量的响应来制定更好的容量规划检查系统是否能快速从故障中恢复——(MTTR )此外,他们还创建了Chaos Monkey变体来处理更多用例。
结语
他们用 Go 编写了 Chaos Monkey,并将其开源。
目前, Netflix 每年的停机时间仅有几分钟,并且仍然是全球最大的流媒体服务平台。
这个案例研究表明,测试对确保复杂系统稳定运行至关重要。
作者丨Neo Kim 编译丨Rio
来源丨https://substack.com/@systemdesignone/p-146865156
*本文为dbaplus社群编译整理,如需转载请取得授权并标明出处!欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
社死!刚入职就把数据库删了,事故原因尴尬又奇葩……2024-09-27 10:07·dbaplus社群
一、offer收割机,就职新公司
5年前的就业环境非常好,当时面试了很多家公司,收到了很多 offer。最终我决定入职一家互联网教育公司,新的公司福利非常好,各种零食随便吃,据说还能正点下班,一切都超出我的期望,“可算让我找着神仙公司了”,我的心里一阵窃喜。
在熟悉环境之后,我趁着上厕所的时候,顺便去旁边的零食摊挑了点零食。接下来的一天里,我专注地配置开发环境、阅读新人文档,当然我也不忘兼顾手边的零食。
入职几天后 ,领导给安排了一个小需求,我和同事沟通完技术方案后,就开始开发了。
二、单元测试有点奇怪
完成开发后,我决定写个单元测试验证下,在研究单元测试代码后,我发现这种单测写法和我之前的写法不太一样。
这家公司的单测好像没有启动整个项目,仅加载了部分类,而且不能访问测试环境数据库~ 于是我决定按照前东家写单测的方式重新写单元测试。
于是我新增了一个单测基类,在单测中启动整个SpringBoot,直接访问测试环境数据库。然而也并不是很顺利,启动阶段总是会遇到各种异常报错,需要一个一个排查…… 所幸项目排期不紧张,还有充足时间。
我做梦也没有想到,此刻,已经铸成大错。
三、故障现场
我身边的工位旁慢慢地聚集了越来越多的人,本来我还在安安静静的调试单元测试,注意力不自觉的被吸引了过去。
“测试环境为什么这么多异常,访问不通啊。到处都是 500 报错”,不知道谁在说话。
“嗯,我们还在排查,稍等一下”,我旁边的同事一边认真排查日志,一边轻声回复道。
“为什么数据库报的异常是, 查不到数据呢?” ,同事在小声嘀咕,然后打开 命令行,立即登上 MySQL。
我亲眼看着他在操作,奇怪的是数据库表里的数据全部被删掉了,其他的几个表数据也都被删除了。
简直太奇怪了,此刻的我还处于吃瓜心态。
有一个瞬间我在考虑,是否和我执行的单元测试有关系?但我很快就否决掉了这个想法,因为我只是在调试单元测试,我没有删数据库啊,单测里也不可能删库啊。我还在笑话自己 胡思乱想……
很快 DBA 就抱着电脑过来,指着电脑说,你们看这些日志,确实有人把这些表删除了。
"有 IP 吗,定位下是谁删除的, 另外线上环境有问题吗?”,旁边的大组长过来和 DBA 说。
“嗯,我找到ip 了,我找运维看下,这个ip是谁的”。DBA 回复道。
四、庭审现场
当 DBA 找到我的时候,我感到无辜和无助,我懵逼了,我寻思我啥也没干啊,我怎么可能删库呢。(他们知道我刚入职,我现在怀疑:那一刻他们可能会怀疑 我是友商派过来的卧底、间谍,执行删库的秘密任务)
经过一系列的掰扯和分析,最终定位 确实是我新增的单元测试把数据库删了。
五、故障原因
需要明确的是,原单元测试执行时不会删除数据库;测试环境启动时也不会删除数据库。
只要在单元测试中连接测试数据库,就会删除掉数据库的所有数据。为什么呢?
1、为什么单元测试删除了所有数据?
原单元测试 使用的是 H2 内存数据库,即Java 开发的嵌入式(内存级别)数据库,它本身只是一个类库,也就是只有一个 jar 文件,可以直接嵌入到项目中。H2数据库又被称为内存数据库,因为它支持在内存中创建数据库和表。所以如果我们使用H2数据库的内存模式,那么我们创建的数据库和表都只是保存在内存中,一旦应用重启,那么内存中的数据库和表就不存在了。 所以非常适合用来做单元测试。
H2 数据库在启动阶段,需要执行用户指定的 SQL 脚本,脚本中一般包含表创建语句,用来构建需要使用的表。
但是我司的 SQL 脚本除了创建表语句,还包含了删除表语句。即在创建表之前先删除表。为什么呢?据他们说,是因为这个 SQL 脚本可能会重复执行,当重复执行时创建表语句 会报错。所以他们在创建表之前,先尝试删除表。这样确保 SQL 脚本可重复执行。( 其实可以用 Create if not exists )
故障的原因就是:测试数据库执行了这个删表再建表的 SQL 脚本,导致所有数据都被清除了。
2、为什么测试数据库会执行这条 SQL 脚本呢?
1) 我新建的单元测试把H2 内存数据库换成了测试数据库。
2) spring.data.initialize=默认值为 true;默认情况下,会自动执行 sql 脚本。
所以测试数据库 执行了 SQL 脚本。
3、为什么在测试环境正常启动时,没有问题,不会删除所有数据呢?
只有单测引入测试数据库才会出问题,在测试环境正常启动项目是没问题的。
当编译项目时,测试目录下的文件、代码和正式代码编译后的结果不会放到一起。因为 SQL脚本被放在了 测试目录下, 所以正式代码在测试环境启动时,不会执行到这个 SQL脚本,自然不会有问题。
六、深刻教训
最终数据被修复了,DBA有测试数据库的备份,然而快照并非实时的,不可避免地还是丢失了一部分数据。
所幸的是出问题的是测试环境,并非线上环境。否则,我会不会被起诉,也未可知。
后续的改进措施包括:
收回了数据库账户的部分权限,只有管理账户才可以修改数据库表结构。代码中执行 DML语句的账户不允许执行 DDL 语句。DBA 盘点测试数据库的快照能力,确保快照间隔足够短,另外新增一个调研课题:删库后如何快速恢复,参照下其他公司的方案。所有的项目 spring.data.initialize 全部声明为 false。不自动执行 SQL 脚本SQL脚本一律不许出现 删除表的语句。SQL不能重复执行的问题,想其他办法解决。另外的一个项目急需人手,把新来的那谁 调到其他项目上这可能是程序员们在技术上越来越保守的原因……不经意的一个调整可能引发无法承受的滔天巨浪
作者丨五阳
来源丨网址:https://juejin.cn/post/7412490391935893541
*本文首发于稀土掘金,dbaplus社群已取得作者授权,进行原创发布。欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
活动推荐
为了和大家一起探索AI相关技术在大数据、数据资产管理、数据库、运维等领域的最佳落地方式,挖掘由此激发的软件发展和技术进步,第九届DAMS中国数据智能管理峰会将于2024年11月29日在上海举办,携手一众产学研界技术领跑单位,带来新思路、重实践、可落地的全日干货盛宴。
活动详情: