正在加载,请稍候…

混沌工程:使用混沌猴测试系统韧性

通过混沌工程构建更具韧性的系统。学习故障注入、混沌猴、Kubernetes 的 Litmus Chaos、游戏日以及衡量系统韧性。

混沌工程:使用混沌猴测试系统韧性

混沌工程:测试系统韧性

核心原则

1. 定义稳态(正常行为指标)
2. 假设:“当 X 故障时,系统将维持稳态”
3. 在生产环境(或类似生产的预发布环境)中运行实验
4. 学习并修复弱点
5. 自动化并持续运行

从小处着手:仅在预发布验证后才进行生产混沌实验

混沌工程:使用混沌猴测试系统韧性插图

混沌实验类型

基础设施:
  - 杀死随机 Pod(混沌猴)
  - 服务间的网络分区
  - 节点上的高 CPU/内存
  - 磁盘 I/O 延迟/错误

应用:
  - 在服务调用中注入延迟
  - 在依赖中抛出异常
  - 损坏负载
  - 导致依赖超时

状态:
  - 填满磁盘空间
  - 用垃圾数据填满数据库
  - 清除缓存(Redis/CDN)
  - 回滚数据库连接

Litmus Chaos(Kubernetes)

# chaos-experiment.yaml - 杀死随机 Pod
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
  name: pod-kill-experiment
spec:
  appinfo:
    appns: production
    applabel: app=api-server
  chaosServiceAccount: litmus-admin
  experiments:
  - name: pod-delete
    spec:
      components:
        env:
        - name: TOTAL_CHAOS_DURATION
          value: '60'      # 60 秒
        - name: CHAOS_INTERVAL
          value: '10'      # 每 10 秒杀死一个 Pod
        - name: FORCE
          value: 'false'   # 优雅终止
# 网络混沌:向支付服务调用添加 200ms 延迟
- name: pod-network-latency
  spec:
    components:
      env:
      - name: NETWORK_LATENCY
        value: '200'
      - name: DESTINATION_IPS
        value: "10.0.0.1"  # 支付服务 IP
      - name: TOTAL_CHAOS_DURATION
        value: '300'

混沌工程:使用混沌猴测试系统韧性插图

应用级故障注入

class FaultInjectionMiddleware {
  constructor(private faultRate: number = 0) {}

  async execute<T>(fn: () => Promise<T>): Promise<T> {
    if (process.env.NODE_ENV !== 'production' || !this.isEnabled()) {
      return fn();
    }

    if (Math.random() < this.faultRate) {
      const fault = this.pickFault();
      console.log(`[CHAOS] Injecting fault: ${fault.type}`);

      switch (fault.type) {
        case 'latency':
          await new Promise(r => setTimeout(r, fault.delayMs));
          break;
        case 'error':
          throw new Error('Injected fault');
        case 'timeout':
          await new Promise(r => setTimeout(r, 30000)); // Cause timeout
          break;
      }
    }

    return fn();
  }

  private isEnabled(): boolean {
    return process.env.CHAOS_ENABLED === 'true';
  }
}

游戏日规划


![混沌工程:使用混沌猴测试系统韧性插图](https://images.pexels.com/photos/10177887/pexels-photo-10177887.jpeg?auto=compress&cs=tinysrgb&h=650&w=940)

## 游戏日模板

**日期**:2024-03-15
**假设**:“当支付服务不可用时,结账流程优雅降级,显示错误消息,而购物车和浏览功能保持正常。”

**实验**:
1. 杀死所有 payment-service Pod
2. 验证购物车/浏览功能仍然正常
3. 验证结账显示错误(而非 500)
4. 验证告警在 5 分钟内触发
5. 验证支付服务在重启后恢复

**稳态**:
- 结账成功率 > 99%
- 错误率 < 0.1%

**回滚计划**:
- 如果...立即重启 payment-service Pod

**结果**:
- 发生了什么:
- 发现的弱点:
- 需要的修复:

衡量韧性

// 平均检测时间(MTTD)
// 平均恢复时间(MTTR)
// 错误预算消耗

async function measureResilience(experiment: ChaosExperiment): Promise<ResilienceReport> {
  const startTime = Date.now();
  await experiment.inject();

  const detectionTime = await waitForAlert();
  const recoveryTime = await waitForSteadyState();

  return {
    mttd: detectionTime - startTime,
    mttr: recoveryTime - startTime,
    impactDuration: recoveryTime - detectionTime,
    errorsGenerated: await countErrors(startTime, recoveryTime),
  };
}

混沌工程将理论韧性转化为经过验证的韧性。