大数据实用DevOps/故障注入
数据密集型应用程序的操作几乎总是需要处理各种故障。因此,在应用程序开发过程中,必须进行测试以评估系统的可靠性和弹性。这些测试了系统应对故障的能力,并突出了任何薄弱环节。故障注入工具 (FIT) [1] 允许用户在其虚拟机上生成故障,从而为他们提供了一种测试其安装弹性的方法。使用这种方法,设计人员可以使用稳健的测试,突出显示在到达商业环境之前需要检查的薄弱环节。用户或应用程序所有者可以测试和了解其应用程序设计或部署在云故障或中断的情况下,从而在基于云的部署之前提前减轻风险。
大数据市场当前和预计的增长为该工具提供了三个不同的目标。数据中心所有者、云服务提供商和应用程序所有者都是潜在的受益者,因为他们对数据的密集要求。基础设施的弹性对这些领域至关重要。数据中心所有者可以衡量其基础设施不同部分的压力水平,从而为其客户提供建议,解决瓶颈,甚至调整不同保证级别的定价。对于开发人员来说,FIT 提供了评估应用程序弹性和可靠性的缺失且必要的服务,这只能通过在应用程序运行时故意引入故障来证明。通过将 FIT 设计为轻量级且通用的工具,在持续集成或其他工具中运行复杂故障场景时,使用它非常简单。与本报告范围之外的其他工具结合使用,FIT 可以监控和评估各种故障对应用程序的影响,并将反馈提供给开发人员以进行应用程序设计。
- DOCTOR (IntegrateD SOftware Fault InjeCTiOn EnviRonment) [2] 允许注入内存和寄存器故障,以及网络通信故障。它结合使用超时、陷阱和代码修改。超时触发注入瞬态内存故障,陷阱注入瞬态模拟硬件故障,如寄存器损坏。代码修改用于注入永久性故障。
- Orchestra [3] 是一种脚本驱动的故障注入器,基于网络级故障注入。它的主要用途是评估和验证分布式协议的容错和时序特性。Orchestra 最初是为 Mach 操作系统开发的,并使用此平台的某些功能来补偿故障注入器引入的延迟。它也已成功移植到其他操作系统。
- Xception [4] 旨在利用许多现代处理器上可用的高级调试功能。它被编写为不需要修改系统源代码,也不需要插入软件陷阱,因为处理器的异常处理功能会触发故障注入。这些触发器基于对特定内存位置的访问。此类访问可能是为了获取数据或获取指令。因此,可以准确地再现测试运行,因为触发器可以绑定到特定事件,而不是超时。
- Grid-FIT (Grid – Fault Injection Technology) [5] 是一种可靠性评估方法和工具,用于通过故障注入评估网格服务。Grid-FIT 来自较早的故障注入器 WS-FIT,该注入器针对使用 Apache Axis 传输实现的 Java Web 服务。Grid-FIT 利用一种新颖的故障注入机制,该机制允许使用网络级故障注入来提供类似于代码插入故障注入的控制级别,同时侵入性更低。
- LFI (Library-level Fault Injector) [6] 是一种自动测试工具套件,用于在受控测试环境中模拟程序在运行时需要处理但仅通过输入测试难以检查的异常情况。LFI 自动识别共享库暴露的错误,查找程序二进制文件中潜在的错误错误恢复代码,并在共享库和应用程序之间的边界注入所需的故障。
到目前为止,FIT 的设计专门包含最佳实践策略,以确保数据密集型应用程序的可靠性,从而允许在开发期间和部署后对应用程序进行严格的测试。
这将允许云平台所有者/应用程序 VM 所有者通过在云级别生成故障来测试云安装和应用程序的弹性。
DICE FIT 也以模块化的方式设计和开发。这允许替换执行故障的任何功能,以及根据需要扩展工具的潜力。FIT 被设计为在 VM 上尽可能轻量级,因此出于这个原因,仅实现了现有经过良好测试的工具来导致故障。FIT 只下载、安装和配置当时需要的内容,因此不会安装任何不必要的工具或依赖项。FIT 允许 VM 管理员、应用程序所有者和云管理员生成各种故障。它独立于任何目标环境运行。图 1 说明了架构。
FIT 被设计为从命令行或图形用户界面工作。用户可以调用连接到目标 VM 的操作,并自动安装任何所需的工具和依赖项,或调用所需的 API。命令行开关和参数允许用户选择特定故障以及故障的参数,例如要使用的 RAM 量或要停止的服务。以下是一个使用 SSH 连接到节点并使用 2GB 造成内存压力的示例命令行调用
--stressmem 2 2048m [email protected] -no home/ubuntu/SSHKEYS/VMKey.key
此调用在真实的云系统上运行。该工具通过 SSH 连接并通过检查/etc/*-release
(在本例中为 Ubuntu)来确定操作系统版本。然后,它收集适用于 Ubuntu 的内存压力工具,在本例中为 Memtester [7]。最后,FIT 调用 Memtester 来饱和目标节点上的内存。图 2 显示了监控工具检测到的目标节点在 FIT 调用之前(左)和期间(右)的可用内存,其中可以看出几乎所有 2GB 的可用 RAM 都已饱和。
为了访问 VM 级别并发出命令,DICE FIT 使用 JSCH 通过 SSH 连接到虚拟机。通过使用 JSCH,该工具能够连接到任何启用了 SSH 的 VM,然后以预定义的用户身份发出命令。这允许更大的命令灵活性以及工具和依赖项的安装。DICE FIT 在宽松的 Apache 许可证 2.0 [8] 下发布,并支持操作系统配置 Ubuntu(已在 14.04 和 15.10 版本上测试)和 Centos,设置了 Repo 配置并安装了 wget(在 7 版本上测试)。
图形界面提供与工具命令行版本相同的功能。图形界面为用户提供了一种与工具进行视觉交互的方式,这使得工具更容易被各种用户使用。用户可以从主屏幕中选择可用的操作,如图 3 所示。每个按钮都会链接到一个页面,用户可以在该页面上输入相关的输入,然后执行故障。这些输入等同于命令行参数。
在 CPU 过载页面中,用户输入虚拟机的详细信息以及运行过载的时间长度。用户可以从文件上传 SSH 密钥来代替密码。从运行故障中获得的任何反馈和输出都显示在页面底部。
使用图形界面是一个简单的过程,只需选择所需的故障并提供虚拟机详细信息即可。在下面的示例中,选择了高 CPU 使用率故障,并输入了虚拟机的地址、用户名和密码。输入了机器上的 CPU 数量,然后输入了使 CPU 过载的时间长度,在本例中为 30 秒,如图 4 所示。
图形界面成功地补充了命令行工具实现的目标。它使故障注入工具高度易于访问,使任何人都可以发现漏洞并测试其系统的弹性。
源代码可以在 DICE GitHub 仓库中找到。该仓库包含源代码和 WAR 文件,因此可以将其部署在服务器上,例如 Apache Tomcat。一旦镜像部署在服务器上,它将立即可用并可以使用。
未来的工作将涉及对故障进行更详细的分类,并结合对各种故障场景的起因、影响和响应的分析。从设计和操作的角度来看,将进行调查以确定如何最好地与相关服务集成。需要强大的监控、图形和分析功能才能与 FIT 协同工作。这可能意味着从逻辑上打包单个解决方案,使用一组工具或构建新的固有功能。这将首先导致更广泛的技术能够像 MongoDB 一样以类似的方式对工作负载进行压力测试,例如 Storm、Spark 和 Cassandra。将进一步研究对故障的时间和持续时间的控制。
故障注入工具开发的一个重大进步是与其他 DICE 工具的集成。这项工作将 FIT 更深入地集成到 DICE 工具集中,并为 FIT 用户提供更多有用的功能。FIT 已完全集成的工具之一是 DICE 部署服务,由 XLAB 开发,如图 5 所示。这项新功能允许对构成 DICE 虚拟部署容器的部署中的所有虚拟机造成故障。此集成的工作方式是通过 FIT 的图形界面版本。首先,用户必须从部署服务中获取一个令牌,以便能够使用 API 进行身份验证。从那里,图形界面上会提供一个选项来列出 DICE 部署服务上运行的所有容器。然后,用户可以选择他们希望在其中造成故障的容器。还可以上传 JSON 文件以进一步自定义要在部署中的特定虚拟机上造成的故障类型。这是通过将故障与与虚拟机(例如,托管在)关联的组件类型的名称匹配来完成的。在提供这些属性后,所需的故障将自动在容器内的所有选定虚拟机上引起,以模拟在应用程序级别发生的故障。这使得用户只需为虚拟部署容器填写一次表单,然后将相同的信息用于容器中的所有后续(重新)部署。此外,我们在下一章中展示了 FIT 与新 dmon-gen 实用程序的集成,以自动生成异常。
此外,还有 FIT 与新 dmon-gen 实用程序的集成,以自动生成异常。使用它,我们还可以为每个实验指定 FIT 特定的参数。例如,我们可以使用它来对给定平台上的所有主机的 CPU 和内存进行压力测试,或者使用可用资源的 50%。
正在探索集成的另一个领域是将 IeAT 开发的监控软件与 FIT 图形界面集成。如果可行,这将为用户提供有关虚拟机在造成故障之前、期间和之后性能的详细信息和分析。这可以更深入地了解 FIT 应用程序造成的故障的影响,以及虚拟机/应用程序在模拟这些不同故障的压力下的性能。
FIT 可以生成虚拟机故障,供应用程序所有者和虚拟机管理员使用。该工具旨在独立于任何目标环境运行。
为了验证 FIT 使用的影响,使用了在许多类 Unix 操作系统中发现的通用任务管理器程序“top”。在目标虚拟机上使用 Linux 的“top”命令,可以查看其资源的当前状态。关于 CPU 饱和,在运行 CPU 过载故障之前,测量 %Cpu 使用率。在运行 CPU 过载时,%Cpu 会迅速上升到接近 100%。FIT 发出的压力命令通常会占用大约 99.2% 的可用 CPU 容量。关于内存饱和,FIT 的“stressmem”功能将使用指定的参数调用。该工具首先通过 SSH 连接到虚拟机,并通过检查 /etc/*-release 来确定操作系统版本(在本例中为 Ubuntu)。然后,它会寻找适合 Ubuntu 的内存压力测试工具,例如 Memtester。如果该工具未找到,FIT 会先安装该工具及其依赖项。最后,FIT 调用 Memtester 来使目标节点的内存饱和。同样,标准监控工具(例如“top”中的 %MEM 列)将显示虚拟机可用的 2GB(或在 stressmem 的内存大小参数中指定的任何值)RAM 处于饱和状态。使用与操作系统捆绑在一起的标准测量工具意味着用户可以轻松地确保注入的故障具有预期效果。
在以下示例中,在目标虚拟机上使用 Linux 的“top”命令,可以查看其资源的当前状态。在运行 CPU 过载故障之前,%Cpu 使用率为 0.7%,如图 6 所示。在运行 CPU 过载时,%Cpu 会迅速上升到 100%。在下面的进程中,我们可以看到压力命令正在使用 99.2% 的 CPU,如图 7 所示。
与其他解决方案相比,FIT 的主要优势在于它作为开源解决方案的可用性,易于与其他工具集成的命令行版本,易于非专业用户使用的图形界面以及记录良好的说明。一个重要的区别因素是该工具的云无关性,以及它在多个目标环境中一致使用的能力。未来的工作将侧重于外部用户可扩展性的困难和可能性,调查限制,考虑不同的拓扑、操作系统和与供应商无关的云提供商基础设施,以及评估操作的开销。容器化环境也将被视为未来的 FIT 目标,以帮助了解在将故障注入底层主机时对微服务的影响,以及容器化部署的完整性。从长远来看,其他目标云 API 可以添加到 FIT 中,以及调查相关的学术工作。