超大规模分布式软件系统的持续发展正快速转变软件工程层面的游戏规则。在这一行业当中,我们正广泛采取灵活度更高且速度更快的部署方案。然而,这一变革又带来了新的紧迫问题:在我们投身于复杂的生产系统之前,对其实际表现拥有怎样的信心?
即使分布式系统当中的每一项独立服务皆拥有正常的运作效果,但这些服务的彼此交互仍可能导致无法预测的结果。而这类结果一旦遭遇较为罕见但极具破坏性的现实事件,则将令分布式系统自身的混乱程度更上一层楼。
我们需要在系统范围之内实际出现异常活动之前,抢先发现其中的薄弱环节。系统性弱点可能表现为以下形式:服务不可用时后备设置不当 ; 因超时设置不当导致反复重试 ; 下游依赖关系在接收到大量流量时出现中断 ; 发生单点故障时连锁引发后续问题等等。我们有必要主动解决此类薄弱环节,确保其不致真正对生产环境下的用户造成影响。要实现这项目标,我们显然有必要管理此类系统内的混乱性因素,充分发挥灵活性与速度优势,最终在高复杂性基础之上建立起值得信任的生产部署体系。
我们将利用一套基于经验的系统性方案解决规模化分布式系统中的混乱难题,同时凭借系统承受各类现实状况的能力建立信心。我们将立足一项受控实验观察分布式系统的运作方式——这种作法被我们称为“混沌工程”。
实践中的混沌因素
为了切实解决规模化分布式系统中的不确定性因素,您可将混沌工程视为一种经由实验发现系统性薄弱环节的方案。此类实验遵循以下四个步骤:
- 将“稳态”定义为用于指示系统正常运作状态的一系列可测量输出。
- 假定这种稳态将在对照组与实验组当中皆继续存在。
- 引入可映射真实世界情况的变量,包括服务器崩溃、硬盘驱动器故障以及网络连接中断等等。
- 尝试通过发现对照组与实验组之间的稳态差异反驳第 2 点中作出的假设。
破坏这种稳定状态的难度越大,我们对于系统运作效果的信心就越强。如果发现其中存在薄弱环节,我们则可将其设为改进目标,并抢在其对整体系统造成影响前加以解决。
进阶原则
以下原则阐述了一款理想化混沌工程应用程序,且适用于上述实验过程。对于以下原则的遵循程度则直接决定我们在规模化分布式系统当中能够建立的实际信心水平。
围绕稳态行为构建假设
专注于系统的可测量输出结果,而非系统的内部属性。在短时间内测量输出结果并将此作为系统稳态的代表。整体系统的数据吞吐量、错误率、延迟百分比等皆可作为稳态行为的关键性表示指标。通过关注实验中各系统行为模式,混沌工程能够验证系统是否正常工作——而无需尝试解析其工作原理。
各类现实世界事件
混沌变量应直接反映各类现实世界事件。利用潜在影响或者预估频率确定各事件的具体优先级。另外,您应考虑到各类与硬件故障相关之事件,包括服务器死机、错误响应等软件故障以及流量峰值或规模伸缩事件等非故障性状况。任何可能导致稳态中断的事件皆应被视为混沌实验当中的潜在变量。
在生产环境中运行实验
根据环境与流量模式的不同,系统运行效果亦将受到影响。由于运行效果可能随时改变,因此我们应将对实际流量进行采样作为获取可靠请求路径的惟一方法。为了保证系统运行方式的真实性以及同现有部署系统间的关联性,混沌工程原则强烈建议您直接面向生产流量进行实验。
利用自动化实验机制实现持续运行
实验的手动运行工作属于劳动力密集型任务,因此难以长久持续。我们建议您采取自动化实验及持续运行方式。混沌工程能够将自动化系统引入系统之内,从而促进协调与分析工作的顺利进行。
尽可能缩小影响范围
在生产环境中进行实验可能给客户造成不必要的影响。尽管部分短期负面影响不可避免,但混沌工程师有责任亦有必要尽可能控制并减小实验引发的不良后果。
混沌工程是一类强大的实践,且正在改变着全球范围内一系列超大规模运营体系的设计与工程技术实现思路。尽管其它实践同样能够实现理想的速度与灵活性优势,但混沌工程专长于解决分布式系统内的系统性不确定因素。混沌理论能够为您建立起大规模快速创新的必要信心,并最终为客户提供高品质的使用体验。
感兴趣的朋友不妨点击此处加入混沌社区参与混沌原理探讨并了解其在谷歌公司中的实际应用。
查看英文原文: http://principlesofchaos.org/
评论