今天业务咨询了我一个问题,服务器如果断电了,能自动执行备份吗?我的回答是:UPS只是在断电后,给服务器提供一个短暂的电力供应,自动备份是应用层面做的吧,和UPS没多大关系。
后来细想了下,其实可以通过脚本层面去解决这个问题,以下是解决思路:
1. 背景与目标
在服务器环境中,市电断开可能导致数据丢失或业务中断。通过脚本自动检测UPS供电状态,一旦市电断开,立即执行数据备份、告警通知,并在电池剩余时间不足时安全关机,实现完整的容灾闭环。
2. 功能框架
脚本包含五个核心环节:
- 检测环节:定时查询UPS状态(市电/电池)。
- 延迟确认环节:连续多次检测确认,避免瞬时波动误判。
- 备份环节:触发数据库或文件备份任务。
- 告警环节:发送告警通知(邮件、钉钉、企业微信等)。
- 关机环节:在电池剩余时间不足时执行安全关机。
3. 检测频率建议
- 常规场景:30秒~1分钟一次检测。
- 高敏感场景:10~15秒一次检测。
- 低敏感场景:2~5分钟一次检测。
- 延迟确认次数:建议设置为3次,即1.5~3分钟确认市电确实断开。
4. 脚本框架示例(Linux + SNMP UPS)
#!/bin/bash
# UPS自动化容灾脚本框架
UPS_IP="192.168.1.100"
OID_STATUS=".1.3.6.1.4.1.xxx.yyy" # UPS供电状态OID
OID_RUNTIME=".1.3.6.1.4.1.xxx.zzz" # UPS剩余时间OID
CHECK_INTERVAL=30
CONFIRM_COUNT=3
LOG_FILE="/var/log/ups_failover.log"
BACKUP_SCRIPT="/usr/local/bin/backup.sh"
ALERT_SCRIPT="/usr/local/bin/send_alert.sh"
log_msg() {
echo "$(date '+%F %T') $1" >> $LOG_FILE
}
check_ups_status() {
STATUS=$(snmpget -v2c -c public $UPS_IP $OID_STATUS | awk '{print $NF}')
echo $STATUS
}
get_runtime() {
RUNTIME=$(snmpget -v2c -c public $UPS_IP $OID_RUNTIME | awk '{print $NF}')
echo $RUNTIME
}
do_backup() {
log_msg "开始执行数据备份任务..."
$BACKUP_SCRIPT
log_msg "数据备份任务完成。"
}
send_alert() {
log_msg "发送告警通知..."
$ALERT_SCRIPT "UPS进入电池模式,已执行备份任务"
}
safe_shutdown() {
log_msg "UPS剩余时间不足,执行安全关机..."
shutdown -h +1 "UPS电池供电,系统即将关机"
}
log_msg "UPS容灾脚本启动。"
while true; do
FAIL_COUNT=0
for i in $(seq 1 $CONFIRM_COUNT); do
STATUS=$(check_ups_status)
if [ "$STATUS" == "battery" ]; then
FAIL_COUNT=$((FAIL_COUNT+1))
fi
sleep $CHECK_INTERVAL
done
if [ $FAIL_COUNT -eq $CONFIRM_COUNT ]; then
log_msg "市电断开,UPS进入电池模式。"
do_backup
send_alert
RUNTIME=$(get_runtime)
if [ "$RUNTIME" -lt 30 ]; then
safe_shutdown
else
log_msg "UPS剩余时间约 ${RUNTIME} 分钟,暂不关机。"
fi
fi
done
5. 外部脚本说明
- backup.sh:执行具体的数据备份逻辑(数据库、文件、虚拟机快照)。
- send_alert.sh:发送告警通知(邮件、钉钉、企业微信)。
6. 总结
该脚本框架实现了自动检测 → 延迟确认 → 数据备份 → 告警通知 → 安全关机的完整闭环,适合在UPS保护的服务器环境中部署,确保在市电断开时数据安全与业务连续性。