云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云解析_阿里云怎么购买服务器_学生机

小七 141 0

Stripe的游戏日练习:从“kill-9”中学习`

我们已经开始在条纹球场进行比赛日训练。在最近的一个游戏中,我们在Redis集群的主节点[0]上运行kill-9测试故障转移,结果丢失了集群中的所有数据。我们对此感到非常惊讶,但很高兴在测试中发现了问题。这个结果和其他来自这个练习的结果让我们相信,像这样的比赛日是非常有价值的,我们强烈推荐给其他人。如果你不熟悉游戏时代,最好的介绍文章是这篇来自johnallspaw[1]的文章。下面,我们将列出一个如何运行一个游戏日的剧本,并描述我们最新练习的结果,以说明为什么我们认为它们是有价值的。如何进行比赛日训练我们最近测试的系统,scoring srv,是我们欺诈检测系统的一部分。评分srv流程运行在一个盒子集群上,并连接到一个三节点Redis集群来存储欺诈评分数据。我们的内部电荷处理代码连接到在Stripe网络上进行的每次充电的srv评分,因此它需要非常低的延迟;同样,准确的评分需要历史数据,因此它需要持久的存储。得分的srv开发人员和我们系统团队的一个成员,他们可以帮助运行测试,聚集在一块白板上。我们绘制了机器和进程、数据存储和组件之间的网络连接的基本框图。有了这个图表,我们就可以列出可能的故障列表。我们列出了六个可以轻松运行的测试:摧毁并恢复一个划线srv箱,逐步摧毁更多的得分srv箱,直到呼叫超时,在收费处理代码和计分srv之间划分网络,增加Redis主节点的负载,正在杀死主Redis节点,并且正在杀死一个Redis副本。由于球队是新来的比赛日,我们没有试图全面或聪明。相反,我们选择了我们能想到的最简单、最容易模拟的故障。我们将使用一个钝的工具,比如kill-9或awsec2 terminate实例,给系统一个很好的重击,看看它的反应如何[2]。对于每一个测试,我们提出了一个或多个假设,假设我们运行它时会发生什么。例如,我们猜测,在计费处理和评分srv之间划分网络会导致这些调用超时并失败打开(也就是说,允许费用立即通过)。然后,我们决定了执行测试的顺序,保存了一个最近的Redis快照的备份作为预防措施,然后就开始了。下面是一个运行游戏日的快速入门清单:让开发团队和可以修改网络、销毁或调配服务器的人聚在一起,并安排一个下午的时间来运行这个练习。对您正在测试的系统中的机器、进程和网络连接做一个简单的框图。想出5-7个最简单的故障,你可以很容易地在系统中诱发。写下一个或多个关于每次失败后会发生什么的假设。备份任何不能丢失的数据。归纳每一次失败并观察结果,为你遇到的每一次意外都归档错误。观察结果我们能够终止一个评分srv机器,并在估计的时间内用一个命令恢复它。这给了我们信心,更换或添加集群计算机将是快速和容易的。我们还看到,逐渐杀死更多的得分srv机器从来没有造成超时,这表明我们目前有更多的能力比必要的。在电荷处理代码和计分srv之间划分网络导致了延迟峰值,我们期望对scoring srv的调用会很快超时并失败打开。这个测试也应该立即提醒负责这个系统的团队,但是没有。第一次Redis测试进行得很顺利。当我们用kill-9停止其中一个副本时,它在重新启动时会拍打几下,观察起来令人惊讶和困惑。不过,正如预期的那样,复制副本成功地从其快照中恢复了数据,并赶上了主服务器上的复制。然后我们转到Redis primary node测试,得到了更大的惊喜。在开发系统时,我们已经开始关注主节点快照期间的延迟峰值。因为评分srv对延迟敏感,所以我们已经将主节点配置为不将其数据快照到磁盘。相反,这两个副本都会频繁地创建快照。在主服务器出现故障的情况下,我们希望将两个副本中的一个升级为主副本;当失败的进程恢复时,我们希望它通过复制从新的主副本恢复其数据。那没有发生。相反,当我们在主节点上运行kill-9(它被daemontools重新启动)时,它又恢复了——在短暂的一段时间内——没有数据,但仍然充当主节点。从那里,它重新启动复制并将其空数据集发送到两个副本节点,这两个节点因此丢失了它们的数据集。几秒钟后,我们就从一个三节点复制的数据存储区变成了一个空的数据集。幸运的是,我们保存了一个备份,并且能够快速地重新填充集群。全套测试耗时约3.5小时。对于每个失败或意外,我们都会提交一个bug,描述预期和实际结果。在我们执行的5个测试中,我们总共遇到了15个问题(我们最终跳过了Redis主负载测试),这对于下午的工作来说是一个不错的回报。关闭这些,并重新运行游戏日来验证我们现在知道在这些情况下会发生什么,这将大大提高我们对系统及其行为的信心。从游戏日学习Redis假设的失效让我们对srv评分的数据存储方法产生了质疑。我们最初的Redis设置让所有三个节点都执行快照(即定期将数据保存到磁盘)。由于完全关闭,我们测试了主节点的故障转移,并且成功了。但是,在分析集群中的实时数据时,我们发现,在快照过程中,我们希望从中获得的低延迟会达到显著峰值,超过1秒:显然,这些峰值与潜伏期敏感的应用有关。我们决定在主节点上禁用快照,在副本节点上保持启用状态,您可以看到以下满意的结果:先启用快照,然后禁用快照,然后再次启用快照:因为我们认为在这种配置中,故障转移不会受到损害,所以这似乎是一个很好的折衷方案:依赖主节点实现性能和复制,依赖副本节点进行快照、故障切换和恢复。事实证明,这个改变是在比赛日的前一天,作为生产准备的最后准备工作的一部分。(人们可以想象在发射前做类似的改变!)游戏日是第一次完整的配置测试,包括开发过程中的所有优化和更改。我们在测试系统时关闭了主节点,然后在主节点上关闭了快照,但这是我们第一次看到这些情况一起运行。在生产系统上进行测试的价值应该从这个结果中看得很清楚,在这种情况下,您可以观察到您打算交付的条件下的故障。在与一些朋友讨论了我们观察到的结果后,在Twitter上进行了一场关于失败的长时间的激烈讨论,Redis的作者说他没有料到我们使用的配置。由于无法保证您所使用的软件支持或期望您使用它的方式,所以唯一能确定它对失败的反应的方法就是尝试一下。虽然Redis可以在打开快照的情况下对srv进行评分,但是其他解决方案可能会更好地满足我们应用程序的需求。在启用主节点快照的高延迟峰值与禁用快照的总体群集数据丢失之间的权衡让我们觉得这两种选择都不可行。对于条带上的其他配置(尤其是数据丢失成本较低的单节点拓扑,如速率限制计数器),Redis仍然非常适合我们的需要。结论在游戏日之后,我们用postgresqlrds做了一个简单的实验,作为scoringsrv中Redis集群的替代品。结果表明,我们可以预期在不遭受突发性尖峰的情况下具有可比的潜伏期。我们的测试使用类似的数据集,99%的读取延迟为3.2毫秒,99%的写入延迟为11.3毫秒。我们对这些结果感到鼓舞,并将继续为这个应用程序使用PostgreSQL进行实验(显然,我们将对我们考虑的所有系统运行类似的游戏日测试)。任何软件都会以意想不到的方式失败,除非你先亲眼目睹它的失败。我们完全同意Kelly Sommers在Twitter上的观点:如果从这个Redis问题中有什么值得学习的地方,即使是简单的kill-9测试也需要在我们的行业中更频繁地发生我们强烈建议部署复杂web应用程序的团队进行游戏日练习。无论你的假设是否被证实或是无效,无论哪种方式,你都会对自己应对失败的能力有更大的信心,而不需要即时诊断。在你休息、准备和观看的时候第一次发生这种事是你能期待的最好的失败。笔记[0]在讨论Redis时,我们选择使用术语"primary"和"replica",而不是Redis文档中使用的术语"master"和"slave",以支持包容性。对于这个替换的一些有趣和热烈的讨论,我们推荐这个Django拉请求和这个Drupal更改。[1] 其他一些好的背景文章可以进一步阅读:"抵御意外";"弹性工程:Learnin"