No.178# 混沌工程相关内容梳理

2022-12-03 09:27:58 浏览数 (1)

引言

随着公司规模业务的快速增长,数以千计甚至万计的微服务,依赖的各类组件越来越多。

分布式体系架构体系越来越复杂,没有任何一个人能够掌控所有复杂的耦合性。

也就是说复杂性无法避免,不可能再回到单体应用,也无法彻底消除这种复杂性。

需要考虑的是如何应对这种复杂性问题。

一、混沌工程要点梳理

在《混沌工程--复杂系统韧性实现之道》给出了对了混沌工程的定义:

混沌工程在分布式系统上进行实验的学科,目的是建立对该系统能够能够承受生产环境的动荡条件的信心。

混沌工程原则5条黄金标准:

  • 建立关于稳态行为的假说
  • 多样化的引入现实世界的事件
  • 在生产环境中进行实验
  • 持续运行自动化实验
  • 最小化爆炸半径

稳态行为需要关键指标衡量,所以监控的关键指标就特别重要。

多样化的引入现实世界的事件,注意演练case的质量,多个视角观测,不拘役简单实现,也不忽略用户体验。

在生产环境中进行实验,其实刚起步阶段基本都是在非生产环境执行的,随着成熟度的提升,逐步在生产环境演练。

持续运行自动化实验,从最开始拉着运维手动干,逐步沉淀到混动系统中。

最小化爆炸半径,提升精准打击能力,某个集群、某个节点、某个应用、某个接口、某次调用。

通过混沌工程建立一种文化,在不确定的结果出现时保持系统的韧性。

通过混沌工程不断探索未知、将未知变为所知、提升应对不确定风险的韧性。

二、混动工程平台建设

构建蓝绿对抗平台:案例编排、演练自动化、沉淀案例、统计可视化、成熟度度量。

故障点注入
  • 注入的故障类型
  • 注入的目标服务
  • 注入的故障内容
  • 注入的故障监控

备注:例如故障监控关联日志、链路、操作记录等。

可视化统计
  • 故障演练执行CASE数量
  • 攻防成功失败CASE数量
  • 演练发现问题数量
  • 演练故障类型分布
  • 演练问题类型分布
成熟度模型
  • 成熟程度的等级
  • 引发的故障等级
  • 演练的时间范围
  • 故障的持续时间
  • 故障的恢复能力

三、精准打击实现方法

「最小化爆炸半径」 是混沌工程的5条黄金法则之一,下面梳理两种精准打击方法。

1、通过流量染色实现精准打击

下面对服务C做故障演练,例如:注入对某个方法注入超时5秒故障,此时对A服务和B服务均会造成故障。

可以通过对故障流量染色,只对属于故障演练的请求注入故障。

另外可以对iptables出口流量干扰,制造请求级故障。

2、通过输入参数控制爆炸半径

例如:通过拦截器分析入参,对输入用户ID在特定范围的请求,篡改返回参数制造故障。

四、强弱依赖自动判定

强弱依赖治理 平台能力在强弱依赖治理演进上可以考虑下:梳理强弱依赖主要是保障核心服务的稳定性 ,避免由于弱依赖服务故障对核心服务造成拖累。

服务之间的依赖:微服务之间的上下游调用形成服务之间的依赖。

强依赖:服务A调用服务B,B服务出现故障时A服务也不可用

弱依赖:服务A调用服务B,B服务出现故障时A服务仍然可用

方式一:强弱依赖人工梳理

通过走查服务代码核心逻辑,识别哪些链路接口是核心服务,哪些是非核心链路。

针对这些非核心链路逻辑能够拆分到非核心服务中去,针对非核心链路可以配置降级措施。

方式二、通过对依赖接口注入故障

步骤1:为选定服务或接口拉取依赖关系

步骤2:为接口依赖设置预判预期

步骤3:为依赖接口注入故障并引入流量

步骤4:监控指标并观测影响

步骤5:强弱依赖结果判定

五、常见通用故障Case梳理

故障类型

事项说明

节点故障

杀掉ecs节点、进程、Pod、容器、节点重启等

网络故障

网络分区、网络中断、网络丢包、网络延迟、网络阻塞、带宽限制

IO类故障

磁盘损坏、写入IO延迟、写入返回错误等、IO瞬时飙高

CPU/缓存/域名

CPU瞬时飙高、内核内存分配异常、内存/CPU使用率过高、DNS域名解析错误

集群类故障

扩缩容、频繁变更节点角色

应用类故障

请求超时、网络异常、重复请求、入参修改、返回值修改、限流熔断异常、线程池填满、频繁GC、内存溢出等

0 人点赞