自动化错误注入测试 - 让你的猴子更加智能

为什么需要更加智能的猴子

Chaos Tools and Techniques for Testing the TiDB Distributed NewSQL Database 这篇文章里面,我提到了我们现在正在参考 Netflix Automating Failure Testing Research at Internet Scale 这篇 Paper,做一些探索性的工作,主要就是想让我们的测试发现更多的 bug。

这里,首先来说说为啥需要更加智能的猴子。在 TiDB 的测试里面,我们会随机的注入很多错误,来看系统是否符合预期,但现在这些其实是很初级的,很多注入其实是我们自己手工设计,然后按照一定的规则去跑的,这样其实并不能够保证所有的分支能够覆盖到。所以,如果这时候,有一只更加智能的猴子,它可以把你所有的代码和部署架构都爬一遍,自动的做一些坏事,这将是多么美好的一件事情。

为了达成这样的目标,一个简单的做法就是采用最常见的 brute force,也就是暴力遍历所有的分支,然后生成相应的规则去注入测试。但这个通常只对比较简单的系统有效果。假设一个超级大的系统有 100 个组件,我们的搜索空间就是 2 的 100 次方,这个是一个非常恐怖的数量了,所以我们需要一种更好的方式来限制我们的搜索空间。

Lineage-driven Fault Injection

Netflix 就面临着这样的问题,然后他们就发现了 Lineage-driven Fault Injection,然后找到这篇 Paper 的作者 Peter Alvaro 跟他们一起合作,看能不能将 Netflix 的猴子弄得更加智能。

Lineage-driven Fault injection 的目标是发现容错系统的 bug,一个不能容错的系统,其实我们也没必要去折腾,因为谁都知道,它挂掉整个系统就不能服务了。在论文里面,作者将其叫做 Molly。

对于 Molly 来说,核心思想就是根据系统正确的输出,来回溯,是否有 failures 能够让系统没法正确的输出。

Molly 流程如下:

  1. 从一次成功的结果开始,反向推倒。
  2. 问为什么能产生这次正确的结果,形成一个 Lineage。
  3. 将这个 Lineage 编码成一个布尔表达式
  4. 对这个布尔表达式求解,生成一个错误假设
  5. 进行注入测试
  6. 不停的重复直到发现一个容错的 bug

Lineage Example

这么说实在是有点太抽象,所以我还是决定直接用 Netflix 自己举得例子来做一次重复的说明。假设有一个服务,需要进行如下的处理:

这里,A 代表 API,R 代表 Ratings,P 代表 Playlist,B 代表 Bookmark。(A or R or P or B) 表示我们可以随机选择 A,R,P, 或者 B 一个点来进行错误注入,那么可能会有如下几种结果:

  1. 请求失败了,也就是我们发现了一个 failure,那么我们就可以裁剪包括这个 failure 的搜索空间了,因为只要包括这个 failure 的,就一定会失败。
  2. 请求成功了,也就是这个 failure point 并不是关键的点。
  3. 请求成功了,但这时候是一个后备系统来处理了这次 failure。也就是我们俗称的 failover 或者 fallback。

这里我们选择 R 进行注入,发现请求成功了,那么就能得到下面的图:

在这个图的公式 (A or P or B) and (A or P or B or R) 里面,右边的 (A or P or B or R) 就是最开始的公式,然后对 R 进行取反去掉了,就得到 (A or P or B),然后用 and 组合起来。

然后我们队 P 进行注入,得到下面图:

这里虽然对 P 进行了注入,但请求仍然能够成功,因为我们有一个备份系统 PlaylistFallback,也就是上面说的情况 3 的情况,也就是说,这里我们有了一个新的点需要去注入,也就是 PF。整个公式变成了 (A or PF or B) and (A or P or B) and (A or P or B or R)

然后我们不停的重复上面的过程,直到找不到注入点了。对于上面的例子,我们假设已经没有新的注入点了,那么我们最终的注入集合就是 [{A}, {PF}, {B}, {P, PF}, {R, A}, {R, B}...],然后我们就开始实际的参考这些集合进行注入。因为 Molly 针对的是 fault-tolerant 系统,也就是意味着,当我们对这些点进行错误注入的时候,如果整个请求失败,那就证明我们这个点并没有做到 fault-tolerant,我们需要改进了。

挑战

虽然 Molly 原理比较简单,但 Netflix 在实践的时候,还是遇到了一些问题,

第一个就是如何定义『成功』。上面说到,Molly 是会根据成功正确的输出来进行反向推导,但我们如何去定义这个『成功』?通常,我们可以依赖 HTTP status,譬如 200 就知道是成功了,但有一些系统,它失败也仍然会返回 200,只是把 error message 放到 HTTP body 里面,这个就比较麻烦。另外,有时候,返回 200 并不一定代表没问题,譬如用户等了很长一段时间才收到 200,所以需要更加多维度的指标来评估『成功』,在 Netflix 里面,现在很多都通过 metric 来进行衡量。

另一个问题就是『幂等性』,因为 Molly 需要的是一个可重放的请求,但大家都知道,『人不能两次踏进同一条河流』,一个请求重现的时候也可能不会走到相同的路径,但 Molly 却需要保证。为了解决这个问题,Netflix 采用了一个非常原始但足够简单高效的做法,就是对用 Falcor 框架生成的请求做 mapping。

还有一个问题就是测试的时候不能太激进,注入太频繁有可能影响线上系统了,这里我真的很佩服 Netflix,敢拿用户当小白鼠测试,我们可没这么大的胆量。所以只能自己内部吃自己的狗食。

我们能做什么?

Netflix 跟 Peter Alvaro 的合作成果还是比较不错的,他们发现了几个非常隐藏的 bug。那么这些对我们有什么借鉴意义呢?

对于 TiDB 来说,我们的组件其实比较简单,加上周边的生态工具组合还不到 10 个,这个量级的服务其实用 brute force 就可以了。而我们也定义好了我们自己的 Lineage,进行注入。当然,Molly 这套我们也在研究,只是短期觉得没必要这么复杂。

另一个可以参考的就是 Molly 在出错的时候会生成 failure trace 以及提供非常详细的信息,这个我们已经借鉴用在了自己的内部测试系统上面。

我个人其实还有一个想法,算是比较激进的,就是跟社区合作,看能不能将我们我们的测试服务跟使用 TiDB 的用户进行整合。也就是说,我们不光测试 TiDB,也帮助大家一起测试完善整个系统。

自由和责任

写在最后,在 Applying Failure Testing Research 里面,提到了 Netflix 的文化,就是 “Freedom and Responsibility”,翻译成中文就是『自由和责任』。在 Netflix 这个公司,会给与程序员非常大的自由去干你想干的事情,但同时,你也必须承担起相应的责任,这些事情并不是随便让你玩玩,就当是过家家的,你有责任去将你的事情落地,变成能更好的帮助公司发展的生产力,即使最终证明这件事情不能 work。我个人觉得,就是因为有这样的文化,才促使 Netflix 在技术和商业上面能有这么多突破。

在 PingCAP,自由和责任也是一种文化,我们鼓励大家去自由折腾,但同时也明确要求大家需要对自己的折腾负责。也正是因为这样,才让我们无论是在技术上面,还是市场上面,都在高速迭代和发展。如果你认同我们这样的文化,欢迎联系我:tl@pingcap.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,555评论 18 139
  • 有一天上辅导班,我们讲课老师用的是投影仪,辅导班校长看着安顿好了就离开了。然后我们这个面授老师讲到一半的时候投影仪...
    哈尔0633阅读 129评论 0 0
  • 1998年,鹿儿岛。中学二年级的澄田花苗第一次看到了从东京转学来的新生远野贵树,并喜欢上了他。 “从一开始我就觉得...
    戴二阅读 5,708评论 0 1
  • 那一年的那一天 惊鸿一瞥的的怦然 你便倾了我萌动的心 那时的相遇 你定格成我眼中永恒的风景 那刻的欢喜 眼中的痴迷...
    慕容兰馨阅读 545评论 2 2