前言
混沌工程一直在我心中是一个模糊的概念,摘要百度百科的解释:通过一系列可控的实验和执行实验的原则,混沌工程将揭 示出分布式系统中随时发生的各类事件是如何逐步导致系统整体不可用的。
在滴滴内部对应的便是放火系统,其中便有了如何放火、防火、监控等各类方法,以在执行混沌操作时,对线上业务影响最少。
概要
混沌工程是一个主动发现系统中脆弱点的整套方法论,所谓方法论,就是关于人们认识世界、改造世界的方法的理论。其目标是提高系统对不确定事件的抵御能力。
但这并非易事,首先所有系统都是足够复杂,这就会导致工程未来演练故障时也需要足够复杂,而在本来复杂的系统中进行改动,这本书就是一个风险极高的事情。
背景
时代背景的主要原因是系统架构在逐步演进,从服务集群到分布式系统,开始微服务化、容器化、上云。服务之间开始逐步隔离,而用户需求变更的更加频繁,复杂化、多样性、快速化,促使了版本迭代不断增速:CICD、敏捷开发、devops、ABtest。
所有的变更最终肯定会反映在系统复杂度上的增加,频繁的变更最大的挑战便是稳定性,如何使系统在频繁变更的过程中,继续保持自身的扩展性、稳定性、弹性能力、容错灾备能力,便是当今各公司需要解决的问题。
混沌工程中,最好的手段,便是演练,通过故障注入的方式模拟线上异常,提前预警,避免大规模事故的发现。
实施
因素
既然是复杂系统的稳定性工具,那还是需要考虑用户在使用稳定性工具时的感受,保证工具拥有可靠性、安全性、可扩展性、可定制化、可伸缩性、可维护性、用户体验等。
维度
用故障注入作为手段来实施工程,那我们就需要从系统稳定性开始考虑如何保证影响可控的情况下如何正常开展演练。
1)建立稳定状态的假设(清晰可衡量的指标)
2)用多样的生产事件做验证(多样性降低误差)
3)在生产环境做验证(真实场景)
4)自动化开展实验(持续运行)
5)控制最小化爆炸半径(影响范围)
而,做到这么几点才能保证混沌工程能够正常的推广下去。
经验
混沌工程的考虑维度我们已经列出来了。但是如何推广工程又是另外一套方法论,因为如何把事做好本身就是很难的事情。
所以,在做事之前,考虑好影响,提前建立预期,对于混沌工程而言,总会不断的和故障打交道,于是就需要建立面向失败设计和拥抱失败的技术文化,让大家能够接受失败。同时先从简单的场景开始尝试,逐渐增加组织对系统的信心
其实,工程需要一个实施目标,评估整体工程推进的情况,
在前期:需要对历史故障的复现率以及解决率,确保故障改进的有效性;中期:提高监控发现率,验证故障发现能力的全面性和监控的完备程度;后期:故障的“发现-定位-恢复”市场这种综合性指标;
最终希望是能达到在控制风险的前提下不断提升混沌工程效率