3. 故障现场信息采集与证据链构建

Redis 故障诊断最怕的不是问题复杂,而是现场被破坏。很多团队在收到告警后第一反应是重启实例,结果内存快照、连接堆积、阻塞命令、慢查询记录全部消失,后续只能靠猜。因此,故障现场信息采集的核心原则是:先留存,再分析;先只读,再变更。本节围绕日志、慢查询、INFO、CLIENT LIST、MONITOR、LATENCY、MEMORY 这几类信息源,说明它们各自回答什么问题、如何组合成证据链,以及如何把数据落到可回溯的文件中。

一、先明确每类信息源回答的问题

这些命令不是并列的“都跑一遍”,而是分别覆盖不同维度。理解它们的分工,才能在有限时间内按优先级采集。

信息源回答的核心问题典型采集方式
Redis 日志实例何时重启、是否发生 RDB/AOF 异常、主从切换、OOM、持久化失败读取 logfile 或 journal,按时间窗口截取
SLOWLOG哪些命令执行超过阈值、耗时多少、发生在什么时间SLOWLOG GET / LEN / RESET
INFO内存、连接、复制、持久化、键空间、命令统计的整体状态INFO all,分段留存
CLIENT LIST当前连接来源、空闲时间、正在执行的命令、输出缓冲区大小CLIENT LIST,必要时加 TYPE 过滤
MONITOR实时命令流,用于短时抓取可疑命令序列限时执行,输出重定向到文件
LATENCY哪些事件造成延迟尖峰,历史延迟记录LATENCY LATEST / HISTORY / RESET
MEMORY内存总量、碎片率、各键或各数据库占用、内存诊断MEMORY STATS / DOCTOR / USAGE

可以看到,日志偏向“历史事件”,INFO 偏向“当前全局状态”,CLIENT LIST 偏向“当前连接与阻塞”,MONITOR 偏向“实时命令流”,LATENCY 偏向“延迟事件”,MEMORY 偏向“内存结构”,SLOWLOG 偏向“已发生的慢操作”。它们组合起来,才能从“现象”追到“原因”。

二、采集顺序与只读原则

故障现场时间宝贵,建议按“低开销、高信息密度”优先采集。INFO、CLIENT LIST、SLOWLOG、LATENCY、MEMORY 基本是只读且开销可控;MONITOR 会放大命令流并增加开销,必须限时、限量使用,绝不能在高压生产实例上长时间挂着。

一个可执行的采集顺序示例:

# 1. 记录时间基准与实例身份
date -Is
redis-cli -h 10.0.0.12 -p 6379 INFO server | tee /tmp/redis_$(date +%s)_server.txt

# 2. 全局状态
redis-cli -h 10.0.0.12 -p 6379 INFO all > /tmp/redis_info_all.txt

# 3. 连接与阻塞
redis-cli -h 10.0.0.12 -p 6379 CLIENT LIST > /tmp/redis_client_list.txt

# 4. 慢查询
redis-cli -h 10.0.0.12 -p 6379 SLOWLOG LEN
redis-cli -h 10.0.0.12 -p 6379 SLOWLOG GET 128 > /tmp/redis_slowlog.txt

# 5. 延迟事件
redis-cli -h 10.0.0.12 -p 6379 LATENCY LATEST > /tmp/redis_latency_latest.txt
redis-cli -h 10.0.0.12 -p 6379 LATENCY HISTORY command > /tmp/redis_latency_command.txt

# 6. 内存结构
redis-cli -h 10.0.0.12 -p 6379 MEMORY STATS > /tmp/redis_memory_stats.txt
redis-cli -h 10.0.0.12 -p 6379 MEMORY DOCTOR > /tmp/redis_memory_doctor.txt

注意:INFO all 已经包含大部分分段信息,但为了后续按维度比对,建议同时保留分段输出。所有输出都带时间戳文件名,避免覆盖。

三、MONITOR 的正确用法与风险

MONITOR 会实时打印实例收到的每一条命令,是定位“谁在打什么命令”的利器,但它有两个明显代价:一是输出量巨大,二是会占用额外 CPU 和网络。因此必须限时执行,例如只抓 10 秒:

timeout 10 redis-cli -h 10.0.0.12 -p 6379 MONITOR > /tmp/redis_monitor_10s.txt
wc -l /tmp/redis_monitor_10s.txt

抓取后不要直接肉眼翻,先用统计手段缩小范围。例如统计出现频率最高的命令前缀、查找是否有 KEYS、FLUSHALL、HGETALL 大 key 操作:

awk '{print $3}' /tmp/redis_monitor_10s.txt | sort | uniq -c | sort -rn | head -20
grep -E 'KEYS|FLUSHALL|FLUSHDB|HGETALL|SMEMBERS' /tmp/redis_monitor_10s.txt | head -50

如果 MONITOR 输出中出现大量同一命令、或出现明显的大 key 遍历命令,就可以与 SLOWLOG、LATENCY 的时间点对齐,形成“命令—耗时—延迟事件”的对应关系。

四、把零散输出组织成证据链

证据链的关键是“时间对齐”和“因果串联”。建议以故障发生时间 T 为中心,向前后各取一个窗口,把各信息源按时间轴排列。下面这张图展示了一个典型的证据链构建过程:从告警现象出发,分别采集日志、INFO、CLIENT LIST、SLOWLOG、LATENCY、MEMORY,再通过时间戳和命令特征交叉验证,最终定位到根因。

Redis 故障现场证据链构建 以故障时间 T 为中心,多源信息按时间轴对齐,交叉验证定位根因 告警现象 延迟升高 / 超时 T-10min T(故障点) T+10min 故障时间基准 Redis 日志 重启 / OOM / 持久化失败 主从切换事件 INFO all 内存 / 连接 / 复制状态 键空间 / 命令统计 CLIENT LIST 连接来源 / 空闲时间 输出缓冲区 / 阻塞命令 SLOWLOG 慢命令 / 耗时 / 时间点 命令参数摘要 MONITOR(限时) 实时命令流 高频命令 / 大 key 操作 LATENCY 延迟事件 / 历史尖峰 command / fork / expire MEMORY 内存总量 / 碎片率 DOCTOR / USAGE 诊断 数据留存 带时间戳文件 只读采集 / 不重启 交叉验证:时间戳对齐 + 命令特征匹配 + 指标变化趋势 例:SLOWLOG 中 14:23:07 的 HGETALL 大 key → LATENCY command 尖峰 → CLIENT LIST 中该连接输出缓冲区暴涨 定位根因 大 key 遍历 + 输出缓冲区膨胀 → 延迟升高

图中展示的是一条典型路径:SLOWLOG 记录到某条 HGETALL 耗时 800ms,LATENCY 在相近时间点出现 command 事件尖峰,CLIENT LIST 显示对应连接的输出缓冲区异常增大,MONITOR 抓取到该命令被高频调用,MEMORY 显示该 key 占用内存较大。四条线索指向同一结论,证据链才算闭合。

五、数据留存规范与常见误区

采集到的数据必须可回溯。建议统一存放目录,文件名包含实例地址、采集时间和信息源类型,例如 /var/log/redis-diag/10.0.0.12_20250612T142300_info_all.txt。同时记录采集时的 date -Is 输出,避免不同机器时钟偏差导致时间轴错位。

常见误区:一上来就重启实例,导致内存现场、连接状态、慢查询记录全部丢失;在生产实例长时间运行 MONITOR,反而加重故障;只采集 INFO 而不采集 CLIENT LIST 和 SLOWLOG,无法定位到具体连接和命令;采集后不落盘,分析时无据可查。
实用建议:把上述采集命令封装成一个只读脚本,故障时一键执行,输出到带时间戳的目录。脚本中不要包含任何写操作、重启或配置变更命令。MONITOR 必须加 timeout,SLOWLOG 采集后不要立即 RESET,先留存再决定是否清理。

最后强调一点:证据链的价值不在于采集了多少数据,而在于能否把“现象—时间—命令—指标—根因”串成一条可验证的线。采集时保持只读、限时、落盘,分析时以时间戳为轴、以命令特征为线索、以指标变化为佐证,才能在复杂故障中快速收敛到真正原因。