一、实验概述
本文是 《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.001s | 0.004s | 正常(不依赖Redis) |
| 首页响应时间 | 0.003s | >30s(超时) | 完全不可用 |
| Redis 错误日志 | 0 条 | 每 ~11 秒 1 条 | 持续报错 |
| 错误信息 | — | connect ETIMEDOUT | TCP 层无法建连 |
五、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,报错频率稳定,说明:
- Redis 实例可能宕机或不可达 — 网络不通、实例异常、安全组拦截等
- 连接超时而非拒绝 — ETIMEDOUT 说明 TCP 层就无法建立连接,而非认证失败
💡 CloudQ 排查建议
- 检查 Redis 实例状态 — 确认 Redis 实例是否正常运行
- 检查网络连通性 — 从 172.17.0.6 到 Redis 实例的网络是否通畅
- 检查 Redis 连接数 — 是否达到最大连接数限制
- 检查带宽/流量 — 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/100 | 82/100(云资源层不变) | 82/100 |
7.2 CloudQ 检测能力评估
| 检测维度 | 是否检测到 | 详情 |
|---|---|---|
| CLS 日志分析 | ✅ 是 | 精准检测到 Redis connection error: connect ETIMEDOUT,识别出报错频率(11~13秒/次)、影响主机、持续时间,并给出 4 条排查建议 |
| 架构评估 | ⚠️ 部分 | 架构评估基于云资源维度,Redis 实例本身仍正常运行,因此评分不变。但基线中已发现 Redis 安全风险(未禁用高危命令) |
7.3 关键发现
- CLS 日志分析是检测应用层故障的利器:CloudQ 在 10 分钟时间窗口内检索到 20 条 Redis 连接错误,精准定位到 ETIMEDOUT 错误模式,并区分出"连接超时"(网络层)与"连接拒绝"(服务层)的差异
- 架构评估与日志分析视角不同:架构评估检测的是"云资源是否配置合理",日志分析检测的是"应用运行是否正常"。Redis 配置错误属于应用配置问题,日志分析更适合此类故障
- 故障影响超出预期:Redis 连接超时导致首页完全不可用(>30s 超时),而非预期的"响应变慢"。原因是 ioredis 的 retryStrategy 在连接失败时会持续重试,阻塞了 cache.get() 调用
- 健康检查的盲区:/health 端点不依赖 Redis,因此在服务完全不可用时仍返回 200。这提示了健康检查设计需要包含关键依赖项的探活
7.4 改进建议
- 健康检查应包含 Redis 连通性探测:在 /health 端点中增加 Redis ping 检查,确保健康检查能反映真实服务状态
- Redis 连接增加超时配置:设置 connectTimeout 参数,避免长时间阻塞请求
- 缓存降级策略:当 Redis 不可用时,应跳过缓存直接查询数据库,而非阻塞等待