前言
微服务架构场景中,应用系统复杂切分散。长期运行时,局部出现故障时不可避免的。如果发生故障时不能进行有效反应,系统的可用性将极大地降低。
什么是故障演练
故障演练是指模拟生产环境中可能出现的故障,测试系统或应用在面对故障时的反应和响应能力。
故障演练可以模拟各种故障情况(网络故障、数据库故障、服务过载,CPU或内存异常等)。
为什么需要故障演练
故障演练是微服务架构下非常重要的实践,用以测试系统或应用在面对故障或缺陷时的反应表现及其恢复能力。
通过故障演练,至少可以在以下几方面获得收益:
- 提前发现、预测生成环境可能出现的部分故障,快速响应,防止故障扩散。
- 在演练中识别系统和应用程序的风险和漏洞,取必要的纠正措施。
- 改进团队响应流程 。 故障演练可以促进团队沟通、理解和协作,完善生产环境的排障流程。
故障演练的目标
故障演练的目标是尽可能模拟真实世界中的故障情况,战略性推动全面和深入的风险管理与测试。
故障演练的基本流程
故障演练大致可以分为:计划、演练、评价、改进四个阶段,其基本流程如下图所示。
云原生、微服务架构场景下故障模拟的挑战
- 微服务的架构复杂性:微服务由许多小型、相互依赖的服务组成,部署架构复杂。在演练过程中需要考虑服务间的交互和依赖。
- 演练环境难以复制:故障演练需要尽可能确保演练环境和生产环境的一致性。在微服务应用程序中,数据在多个服务之间相互流动,生成环境的数据和设施不一定能完全复制到演练环境。
- 监控和记录难度大 – 在微服务场景下,服务分散,通常需要更强大的监控和日志记录方案来跟踪故障的发生并找到它们的原因。
- 成本和资源问题:微服务架构通常会占用更多的计算、存储、网络资源,而且部署演练环境所需要的人力投入也更大。
- 团队协调:微服务架构下,系统通常是有不同的团队协作搭建的,因而故障演练也常常涉及到多个团队的协作沟通。
云原生、微服务场景下的故障演练工具
以下是云原生、微服务场景下常用的故障演练工具:
- Chaos Mesh:Chaos Mesh 是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,具有强大的故障场景编排能力,方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常,帮助用户发现系统潜在的问题。
- Gremlin:这是一款用于可靠性测试和混沌工程的工具。可以模拟真实流量、人工输入等方式来模拟各种稳定性问题,如网络延迟、磁盘故障等,而不是仅仅使用硬编码的方法 simulations 的混沌工程平台。Gremlin 完全云托管,可在云和本地基础架构上使用。
- chaosmonkey:Chaos Monkey 负责随机终止生产中的实例,以确保工程师实施其服务以适应实例故障。
- Kube-monkey:kube-monkey 是 Netflix 的 Chaos Monkey for Kubernetes 集群的实现。这是一款开源的 Kubernetes 故障模拟工具。它随机删除集群中的 Kubernetes (k8s) Pod,鼓励和验证容错服务的开发。
- LitmusChaos:Litmus 是一个开源混沌工程平台,使团队能够通过以受控方式引入混沌测试来识别基础设施中的弱点和潜在中断。
如何进行故障演练
故障演练通常可以按照面的流程和步骤来进行:
演练前 | 确认演练对象与目标
- 确定演练对象,例如可以是整个系统,某个部分,或者某个服务等等;
- 确定演练目标,包括期望模拟出哪些故障场景,如网络故障,服务器故障,系统缓慢等等;
- 确定所需的数据和监控指标,以便评估演练质量和结果。
演练前 | 准备演练环境
- 确定演练环境(包括硬件、网络、安全等等),尽可能接近生产环境;
- 决定是否要使用模拟器或其他形式的虚拟基础设施,并准备相应的实验数据;
- 解除故障演练的相关限制。
演练前 | 制定故障应对策略
- 按照目标和需求开发故障响应计划,包括如何快速定位问题、处理方法和流程、在哪些问题下开展演练等等;
- 为处理问题的步骤定制标准操作程序,以便在演练期间可以更好的实施。
演练前 | 协调演练人员
- 确定相应的演练人员;
- 分配合适的职责和任务,以确保演练进度和目标的完成;
- 指定一个负责人,协调和管理演练过程。
演练前 | 演练周知
- 在演练开始前,向参与演练的用户、管理员、支持或其他流程中的责任人员发送通知,以确保他们知道这个演练是为了什么,何时开始,以及他们可能会受到哪些潜在影响;
- 向所有相关部门进行演练周知,确保相关人员充分了解和理解演练内容并能够按计划进行。
演练中 | 故障注入
- 使用已准备好的故障注入测试工具注入故障或模拟所需故障场景;
- 根据演练计划,按照预先制定的步骤逐步模拟不同的故障。
演练中 | 观察与记录
- 在故障注入后,观察并记录故障的发生,并确认监控数据的变化;
- 确认是否已经按照预期的流程进行了处理,并将事件的应对措施记录并报告。
演练中 | 故障响应
- 当出现故障时,按照预先制定的响应流程进行处理,确保演练不影响日常生产;
- 在故障修复后,进行必要的后续操作,例如清理环境并恢复生产流程。
演练后 | 清理现场,恢复环境
- 在演练完后,清理测试环境和测试数据,确保不会影响到生产环境;
- 恢复环境到正常状态,并检查环境是否已完全恢复正常状态,包括检查应用程序、网络、系统状态,确保各项指标均处于正常运行状态。
演练后 | 报告与总结
- 汇总并报告故障演练的结果,包括每个故障场景的模拟效果、记录的数据和监控指标等;
- 分享演练中发现的问题,并制定改进方案,推进后续工作。
演练后 | 后续规划:系统改进与流程改进
- 根据演练结果和总结,制定后续系统改进措施,进一步提高系统的可用性、容错性等;
- 优化故障响应流程,提升故障修复效率。
- 故障演练常规化,不断调整和优化演练流程和方法,不断提高演练的质量和效率,并能够更好地支持未来的需求和挑战。、