容错要回答三个问题
巡检必然有目标采集失败:设备离线、凭证过期、链路抖动、命令不兼容。容错与重试要回答的是哪些失败值得重试、重试几次、重试仍失败后结果如何呈现。核心原则是把暂时性失败与确定性失败分开:前者退避重试,后者直接记为异常,避免用重试掩盖凭证或配置错误。
基本信息
| 值得重试 | 连接超时、被拒、瞬时超时等暂时性失败 |
|---|---|
| 不应重试 | 认证失败、命令不存在、目标不存在等确定性失败 |
| 退避策略 | 指数退避加随机抖动,避免集中重试 |
| 上限控制 | 最大尝试次数与单目标总时长双上限 |
| 终态处理 | 写入失败清单,按严重级别进入告警或工单 |
典型使用场景
- 跨广域网采集:链路抖动频繁,有限重试可显著降低无意义失败噪音
- 大批量巡检中的个别目标:单台失败不应中断整批任务,失败需按目标隔离
- 被检端连接数打满:短暂退避后重试成功率明显提升,比立即重试更有效
- 计划内停机:应识别为预期不可达,跳过重试并单独统计,不混入故障数
- 结果对齐:重试成功后需覆盖首次失败记录,避免同一目标出现矛盾结果
失败分类与处置
| 失败表现 | 性质 | 处置 |
|---|---|---|
| 连接超时或被拒 | 暂时性 | 退避后重试 |
| 认证失败 | 确定性 | 立即标记异常并通知负责人 |
| 命令不存在或权限不足 | 确定性 | 跳过并记录脚本版本与目标信息 |
| 回显解析失败 | 多为配置问题 | 保留原始回显供人工核对一次 |
退避重试与失败分类
退避重试与失败分类
# 指数退避加抖动:避免失败目标在同一时刻集中重试
for i in 1 2 3; do
if ./collect.sh www01 >> out.txt 2> err.txt; then break; fi
sleep $(( (2 ** i) + RANDOM % 3 )) # 2、4、8 秒级退避并打散节拍
done
# 认证类错误重试无意义,直接归入待修清单
if grep -q -e Permission.denied -e Authentication.failed err.txt; then
echo www01-auth-failed >> need_fix.txt # 交凭证或权限修复流程
fi
# 首次失败信息另存,避免被后续成功覆盖而丢失偶发线索
[ -s err.txt ] && cp err.txt first_fail_www01_$(date +%F).log重试会把失败流量放大到被检端。没有退避与次数上限的重试,在目标过载时会持续加码,把一次可恢复的超时拖成持续不可用,巡检脚本因此成为压垮服务的一环。
巡检结果至少要区分不可达、采集失败、检查不通过三种状态。三者合并成一个失败计数时,网络问题会掩盖真实的配置偏差,后续排查与环境治理都失去依据。