每周故障演练清单
基础场景(每周执行)
-
单实例故障转移
- 操作: kubectl delete pod
- 检查: 服务可用性是否保持100%
- 恢复时间目标: <30秒
-
缓存穿透测试
- 操作: 发送1000个随机字符串请求
- 检查: 缓存命中率下降幅度<10%
- 防护生效: 空结果缓存是否启用
-
磁盘满容测试
- 操作: dd if=/dev/zero of=/tmp/fill bs=1G count=10
- 检查: 服务是否优雅降级而非崩溃
- 清理: rm /tmp/fill
进阶场景(每月执行)
-
数据库宕机
- 操作: systemctl stop redis
- 检查: 服务是否降级为本地缓存
- 恢复: systemctl start redis
-
网络分区
- 操作: iptables -A INPUT -s -j DROP
- 检查: 服务是否自动隔离故障节点
- 恢复: iptables -D INPUT -s -j DROP
-
模型损坏
- 操作: mv pytorch_model.bin pytorch_model.bin.bak
- 检查: 是否自动加载备用模型
- 恢复: mv pytorch_model.bin.bak pytorch_model.bin
### 自动化恢复脚本
```bash
#!/bin/bash
# emergency-recovery.sh - 情感分析服务应急恢复脚本
# 配置
SERVICE_NAME="sentiment-api"
NAMESPACE="default"
ALERT_EMAIL="ops@example.com"
LOG_FILE="/var/log/sentiment-recovery.log"
# 工具函数
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
send_alert() {
log "发送告警: $1"
echo -e "Subject: [紧急]情感分析服务故障\n\n$1" | sendmail $ALERT_EMAIL
}
# 检查服务状态
check_service() {
log "检查服务状态..."
PODS=$(kubectl get pods -n $NAMESPACE -l app=$SERVICE_NAME --no-headers | wc -l)
READY_PODS=$(kubectl get pods -n $NAMESPACE -l app=$SERVICE_NAME --no-headers | grep "Running" | grep "1/1" | wc -l)
log "当前Pod数量: $PODS, 就绪Pod数量: $READY_PODS"
if [ $READY_PODS -eq 0 ]; then
return 2 # 严重故障
elif [ $READY_PODS -lt $((PODS/2)) ]; then
return 1 # 部分故障
else
return 0 # 正常
fi
}
# 尝试重启服务
restart_service() {
log "尝试重启服务..."
kubectl rollout restart deployment/$SERVICE_NAME -n $NAMESPACE
# 等待重启完成
sleep 60
# 检查重启后状态
check_service
if [ $? -eq 0 ]; then
log "服务重启成功"
return 0
else
log "服务重启失败"
return 1
fi
}
# 扩容服务
scale_up_service() {
log "尝试扩容服务..."
CURRENT_REPLICAS=$(kubectl get deployment $SERVICE_NAME -n $NAMESPACE -o jsonpath='{.spec.replicas}')
NEW_REPLICAS=$((CURRENT_REPLICAS * 2))
log "扩容副本数: $CURRENT_REPLICAS -> $NEW_REPLICAS"
kubectl scale deployment/$SERVICE_NAME -n $NAMESPACE --replicas=$NEW_REPLICAS
# 等待扩容完成
sleep 120
check_service
if [ $? -eq 0 ]; then
log "服务扩容成功"
return 0
else
log "服务扩容失败"
return 1
fi
}
# 切换备用集群
switch_backup_cluster() {
log "切换至备用集群..."
# 更新Ingress路由
kubectl apply -f ingress-backup.yaml
# 检查备用集群状态
sleep 30
curl -s -o /dev/null -w "%{http_code}" http://sentiment-api/health
if [ $? -eq 200 ]; then
log "备用集群切换成功"
send_alert "情感分析服务已切换至备用集群,请尽快排查主集群故障"
return 0
else
log "备用集群切换失败"
return 1
fi
}
# 主流程
log "===== 情感分析服务应急恢复脚本启动 ====="
check_service
STATUS=$?
if [ $STATUS -eq 0 ]; then
log "服务状态正常,无需操作"
exit 0
elif [ $STATUS -eq 1 ]; then
log "发现部分故障,尝试重启服务..."
restart_service
if [ $? -ne 0 ]; then
log "重启失败,尝试扩容服务..."
scale_up_service
fi
else
log "发现严重故障,尝试重启服务..."
restart_service
if [ $? -ne 0 ]; then
log "重启失败,尝试切换备用集群..."
switch_backup_cluster
if [ $? -ne 0 ]; then
log "所有恢复手段失败,触发人工干预"
send_alert "情感分析服务完全不可用,所有自动恢复手段失败,请立即人工干预!"
exit 1
fi
fi
fi
log "===== 情感分析服务应急恢复脚本结束 ====="
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



