← 返回文章列表

故障注入实验报告(一):Redis 缓存层连接故障

一、实验概述

本文是 《CloudQ架构评估实战》 计划的第一轮故障注入实验报告,完整记录了 Redis 缓存层故障注入的全过程,包含每一步的详细操作和 CloudQ 的原始输入输出。

实验目标验证 CloudQ 能否通过架构评估和 CLS 日志分析检测到 Redis 连接故障
故障类型Redis 连接地址错误(模拟配置变更导致的缓存不可达)
影响层次缓存层(Redis)
实验时间2026-04-03 18:35 ~ 18:48(CST)
实验结果CloudQ 成功检测到故障,精准定位到 Redis 连接超时

二、Step 1 — 备份目标文件

在注入故障前,首先备份所有可能修改的文件:

$ cp /opt/tech-blog/config/index.js /opt/tech-blog/config/index.js.bak
$ cp /opt/tech-blog/models/article.js /opt/tech-blog/models/article.js.bak
$ cp /opt/tech-blog/routes/index.js /opt/tech-blog/routes/index.js.bak

Backups created:
-rw-r--r-- 1 root root  397 Apr  3 18:34 config/index.js.bak
-rw-r--r-- 1 root root 1950 Apr  3 18:34 models/article.js.bak
-rw-r--r-- 1 root root 2113 Apr  3 18:34 routes/index.js.bak

三、Step 2 — 采集基线数据

3.1 服务基线

=== Health Check ===
$ curl -s -w '\nResponse Time: %{time_total}s' http://localhost/health
{"status":"ok","timestamp":"2026-04-03T10:35:14.136Z"}
Response Time: 0.001087s

=== Homepage ===
$ curl -s -o /dev/null -w 'Time: %{time_total}s, Size: %{size_download}B, Status: %{http_code}' http://localhost/
Response Time: 0.003157s, Size: 8287 bytes, Status: 200

基线结论:服务运行正常,健康检查 ~1ms,首页响应 ~3ms。

3.2 CloudQ 架构评估基线

输入

CloudQ 问题: "评估架构图SH-WEB"

输出(评估任务创建):

✅ 卓越架构评估任务已创建!
- 架构图:SH-WEB(arch-kklvi9b4)
- 任务ID:f4fb9b62-07db-4832-a95e-3d5cc1f5d3e0
- 预计耗时:1-3 分钟

等待约 90 秒后查询评估结果。

输入

CloudQ 问题: "查看评估结果 arch-kklvi9b4"
SessionID: d77pgs3j177cgtjoj0ag(沿用)

输出(基线评估结果):

📊 卓越架构评估结果 — arch-kklvi9b4
评估时间:2026-04-03 18:38:08

总分:82 / 100

| 维度     | 得分 | 状态       |
|----------|------|------------|
| 性能     | 100  | 🟢 优秀    |
| 可持续   | 100  | 🟢 优秀    |
| 可靠     |  89  | 🟡 良好    |
| 成本     |  73  | 🟡 需关注  |
| 安全     |  66  | 🔴 需改进  |
| 卓越运营 |  66  | 🔴 需改进  |

主要风险项:
- Redis 未禁用高危命令(安全)
- CVM/CLB/Redis 低使用率(成本)
- 单可用区部署风险(可靠)
- 超过30天未进行混沌演练(可靠)

3.3 CloudQ 日志基线

输入

CloudQ 问题: "上海地域,搜索shweb日志主题最近1小时的ERROR日志"
SessionID: d77pgs3j177cgtjoj0ag(沿用)

输出(日志基线):

📋 日志检索结果
- 来源:腾讯云CLS · shweb | 地域:ap-shanghai
- 时间:最近 1 小时(17:38 ~ 18:38)
- 日志文件:/var/log/nginx/error.log
- 主机:VM-0-8-tencentos(172.17.0.8)

命中大量 ERROR 日志,均为 Nginx 静态资源 404(文件不存在):
- architecture-diagram.jpg/png → No such file or directory
- dual-detection.jpg/png → No such file or directory
- fault-comparison.jpg/png → No such file or directory

初步分析:
错误类型: Nginx 静态文件 404
触发页面: /article/15(文章引用了图片)
⚠️ 注意:这些是图片缓存相关的 404 错误,非 Redis 相关

基线结论:当前 ERROR 日志均为图片 404(已知问题),无 Redis 连接错误

四、Step 3 — 注入 Redis 故障

4.1 代码变更

将 Redis 连接地址从正确的 172.17.0.14 修改为不存在的 172.17.0.199

文件:/opt/tech-blog/config/index.js

// 修改前
redis: {
  host: '172.17.0.14',
  port: 6379
}

// 修改后(注入故障)
redis: {
  host: '172.17.0.199',  // 不存在的地址
  port: 6379
}

4.2 重启服务

$ systemctl restart tech-blog
# 等待 3 秒后验证

4.3 故障验证

=== Health Check (故障注入后) ===
$ curl -s -w '\nResponse Time: %{time_total}s' http://localhost/health
{"status":"ok","timestamp":"2026-04-03T10:42:38.455Z"}
Response Time: 0.003828s
✅ 健康检查正常(不依赖 Redis)

=== Homepage (故障注入后) ===
$ curl -s -o /dev/null -w 'Time: %{time_total}s, Status: %{http_code}' --max-time 30 http://localhost/
Response Time: 30.002662s, Status: 000
❌ 首页请求 30 秒超时无响应!

=== 应用日志 ===
$ tail -10 /opt/tech-blog/logs/app.log
2026-04-03T10:42:26.769Z [INFO]  Server running on port 3000
2026-04-03T10:42:36.772Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:42:46.974Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:42:57.376Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:43:07.978Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:43:18.779Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:43:29.782Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:43:40.983Z [ERROR] Redis connection error: connect ETIMEDOUT
2026-04-03T10:43:52.386Z [ERROR] Redis connection error: connect ETIMEDOUT

故障验证结论

指标 基线值 故障值 变化
健康检查响应时间0.001s0.004s正常(不依赖Redis)
首页响应时间0.003s>30s(超时)完全不可用
Redis 错误日志0 条每 ~11 秒 1 条持续报错
错误信息connect ETIMEDOUTTCP 层无法建连

五、Step 4 — CloudQ 故障检测

等待约 2 分钟(让错误日志进入 CLS)后,使用 CloudQ 进行日志分析。

5.1 CLS 日志分析

输入

CloudQ 问题: "上海地域,搜索shweb日志主题最近10分钟包含ETIMEDOUT或Redis的ERROR日志"
SessionID: d77picd992eqlg44p8ng(沿用评估会话)

输出(CloudQ 完整响应):

🔍 CloudQ 日志检索结果

地域上海(ap-shanghai)
日志主题shweb
时间范围18:36:37 ~ 18:46:37(最近 10 分钟)
检索条件ERROR AND (ETIMEDOUT OR Redis)
命中数量20 条(已达单页上限,可能还有更多)

⚠️ CloudQ 错误模式分析

所有 20 条日志均为同一类错误,呈现高频持续报错:

级别ERROR
错误信息Redis connection error: connect ETIMEDOUT
来源主机VM-0-6-tencentos(172.17.0.6)
日志文件/opt/tech-blog/logs/app.log
报错频率约每 11~13 秒一次
首条时间18:42:36
末条时间18:46:24

🚨 CloudQ 问题判断

这是一个 Redis 连接超时的持续性故障,应用 tech-blog 在最近约 4 分钟内持续无法连接 Redis,报错频率稳定,说明:

  1. Redis 实例可能宕机或不可达 — 网络不通、实例异常、安全组拦截等
  2. 连接超时而非拒绝 — ETIMEDOUT 说明 TCP 层就无法建立连接,而非认证失败

💡 CloudQ 排查建议

  1. 检查 Redis 实例状态 — 确认 Redis 实例是否正常运行
  2. 检查网络连通性 — 从 172.17.0.6 到 Redis 实例的网络是否通畅
  3. 检查 Redis 连接数 — 是否达到最大连接数限制
  4. 检查带宽/流量 — Redis 实例是否存在带宽瓶颈

5.2 架构评估基线对比

基线评估总分 82 分,其中性能支柱 100 分。由于 Redis 连接故障发生在应用配置层面(配置指向了错误的 IP),云资源本身(Redis 实例)仍然正常运行,因此架构评估的云资源维度评分不会立即变化。这也说明了:

  • 架构评估:检测的是云资源本身的配置和状态(Redis 实例是否健康),适合发现基础设施层面的风险
  • 日志分析:检测的是应用运行时的实际行为(是否有错误日志),适合发现运行时故障
  • 两者互补:架构评估告诉你"基础设施没问题",日志分析告诉你"但应用连不上 Redis",从而定位到配置错误

六、Step 5 — 回滚恢复

$ cp /opt/tech-blog/config/index.js.bak /opt/tech-blog/config/index.js
$ systemctl restart tech-blog

=== Recovery Health Check ===
$ curl -s -w '\nResponse Time: %{time_total}s' http://localhost/health
{"status":"ok","timestamp":"2026-04-03T10:47:53.516Z"}
Response Time: 0.002909s  ✅

=== Recovery Homepage ===
$ curl -s -o /dev/null -w 'Time: %{time_total}s, Size: %{size_download}B, Status: %{http_code}' http://localhost/
Response Time: 0.003234s, Size: 8287 bytes, Status: 200  ✅

恢复确认:服务完全恢复,健康检查 ~3ms,首页 ~3ms,HTTP 200。

七、实验结果总结

7.1 实验数据对比

指标 基线 故障期间 恢复后
健康检查0.001s ✅0.004s ✅0.003s ✅
首页响应0.003s ✅>30s ❌0.003s ✅
HTTP 状态码200超时(000)200
Redis 错误日志0 条20+ 条0 条
CloudQ 日志检测无 Redis 异常检测到 ETIMEDOUT
架构评估总分82/10082/100(云资源层不变)82/100

7.2 CloudQ 检测能力评估

检测维度 是否检测到 详情
CLS 日志分析✅ 是精准检测到 Redis connection error: connect ETIMEDOUT,识别出报错频率(11~13秒/次)、影响主机、持续时间,并给出 4 条排查建议
架构评估⚠️ 部分架构评估基于云资源维度,Redis 实例本身仍正常运行,因此评分不变。但基线中已发现 Redis 安全风险(未禁用高危命令)

7.3 关键发现

  1. CLS 日志分析是检测应用层故障的利器:CloudQ 在 10 分钟时间窗口内检索到 20 条 Redis 连接错误,精准定位到 ETIMEDOUT 错误模式,并区分出"连接超时"(网络层)与"连接拒绝"(服务层)的差异
  2. 架构评估与日志分析视角不同:架构评估检测的是"云资源是否配置合理",日志分析检测的是"应用运行是否正常"。Redis 配置错误属于应用配置问题,日志分析更适合此类故障
  3. 故障影响超出预期:Redis 连接超时导致首页完全不可用(>30s 超时),而非预期的"响应变慢"。原因是 ioredis 的 retryStrategy 在连接失败时会持续重试,阻塞了 cache.get() 调用
  4. 健康检查的盲区:/health 端点不依赖 Redis,因此在服务完全不可用时仍返回 200。这提示了健康检查设计需要包含关键依赖项的探活

7.4 改进建议

  • 健康检查应包含 Redis 连通性探测:在 /health 端点中增加 Redis ping 检查,确保健康检查能反映真实服务状态
  • Redis 连接增加超时配置:设置 connectTimeout 参数,避免长时间阻塞请求
  • 缓存降级策略:当 Redis 不可用时,应跳过缓存直接查询数据库,而非阻塞等待