Linux服务器运维告警系统搭建完整指南
在Linux服务器运维中,及时发现和处理系统异常是保障业务稳定运行的关键。本文将详细介绍如何搭建一套完整的服务器监控告警系统,实现7×24小时自动化监控和多渠道告警通知。
🎯 告警系统架构设计
系统组件概览
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 数据采集层 │───▶│ 告警判断层 │───▶│ 通知发送层 │
│ │ │ │ │ │
│ • 系统指标 │ │ • 阈值判断 │ │ • 邮件通知 │
│ • 服务状态 │ │ • 规则引擎 │ │ • 短信告警 │
│ • 日志监控 │ │ • 告警抑制 │ │ • 钉钉/企微 │
│ • 自定义指标 │ │ • 升级策略 │ │ • 电话告警 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心功能特性
- 多维度监控:CPU、内存、磁盘、网络、服务状态
- 智能告警:阈值告警、趋势告警、异常检测
- 多渠道通知:邮件、短信、即时通讯工具
- 告警抑制:防止告警风暴,支持静默期设置
- 可视化展示:监控大屏、历史趋势图表
📊 系统监控指标设计
基础系统指标
#!/bin/bash
# system_monitor.sh - 系统基础指标监控脚本# 配置文件
CONFIG_FILE="/etc/monitor/config.conf"
LOG_FILE="/var/log/monitor/system.log"
ALERT_FILE="/tmp/alert_status"# 加载配置
source $CONFIG_FILE# 获取CPU使用率
get_cpu_usage() {cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')echo "CPU使用率: ${cpu_usage}%"if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc -l) )); thensend_alert "CPU告警" "CPU使用率过高: ${cpu_usage}%,阈值: ${CPU_THRESHOLD}%"fi
}# 获取内存使用率
get_memory_usage() {memory_info=$(free | grep Mem)total=$(echo $memory_info | awk '{print $2}')used=$(echo $memory_info | awk '{print $3}')memory_usage=$(echo "scale=2; $used/$total*100" | bc)echo "内存使用率: ${memory_usage}%"if (( $(echo "$memory_usage > $MEMORY_THRESHOLD" | bc -l) )); thensend_alert "内存告警" "内存使用率过高: ${memory_usage}%,阈值: ${MEMORY_THRESHOLD}%"fi
}# 获取磁盘使用率
get_disk_usage() {df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read output;dousage=$(echo $output | awk '{print $1}' | cut -d'%' -f1)partition=$(echo $output | awk '{print $2}')echo "磁盘使用率 $partition: ${usage}%"if [ $usage -ge $DISK_THRESHOLD ]; thensend_alert "磁盘告警" "磁盘使用率过高 $partition: ${usage}%,阈值: ${DISK_THRESHOLD}%"fidone
}# 检查系统负载
get_load_average() {load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')cpu_cores=$(nproc)load_ratio=$(echo "scale=2; $load_avg/$cpu_cores" | bc)echo "系统负载: $load_avg (${cpu_cores}核心,比率: $load_ratio)"if (( $(echo "$load_ratio > $LOAD_THRESHOLD" | bc -l) )); thensend_alert "负载告警" "系统负载过高: $load_avg,CPU核心数: $cpu_cores,负载比率: $load_ratio"fi
}# 发送告警
send_alert() {local title="$1"local message="$2"local timestamp=$(date '+%Y-%m-%d %H:%M:%S')# 检查告警抑制if check_alert_suppression "$title"; thenecho "[$timestamp] 告警被抑制: $title" >> $LOG_FILEreturnfi# 记录告警echo "[$timestamp] $title: $message" >> $LOG_FILE# 发送邮件告警send_email_alert "$title" "$message"# 发送短信告警(如果配置了)if [ "$SMS_ENABLED" = "true" ]; thensend_sms_alert "$title" "$message"fi# 发送钉钉告警(如果配置了)if [ "$DINGTALK_ENABLED" = "true" ]; thensend_dingtalk_alert "$title" "$message"fi# 更新告警状态echo "$title:$(date +%s)" >> $ALERT_FILE
}# 邮件告警发送
send_email_alert() {local title="$1"local message="$2"local hostname=$(hostname)local timestamp=$(date '+%Y-%m-%d %H:%M:%S')# 构造邮件内容local email_body="
服务器告警通知服务器: $hostname
时间: $timestamp
告警类型: $title
告警详情: $message请及时处理!---
自动监控系统
"# 使用mailx发送邮件echo "$email_body" | mailx -s "【告警】$hostname - $title" "$ALERT_EMAIL"echo "邮件告警已发送: $title"
}# 主监控函数
main_monitor() {echo "=== 系统监控开始 $(date) ==="get_cpu_usageget_memory_usageget_disk_usageget_load_averageecho "=== 系统监控结束 $(date) ==="echo ""
}# 执行监控
main_monitor
配置文件示例
# /etc/monitor/config.conf
# 监控阈值配置# CPU使用率阈值(百分比)
CPU_THRESHOLD=80# 内存使用率阈值(百分比)
MEMORY_THRESHOLD=85# 磁盘使用率阈值(百分比)
DISK_THRESHOLD=90# 系统负载阈值(负载/CPU核心数)
LOAD_THRESHOLD=2.0# 告警邮箱
ALERT_EMAIL="admin@company.com,ops@company.com"# 短信告警开关
SMS_ENABLED=true
SMS_API_URL="https://api.sms.com/send"
SMS_API_KEY="your_sms_api_key"
SMS_PHONES="13800138000,13900139000"# 钉钉告警开关
DINGTALK_ENABLED=true
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"# 告警抑制时间(秒)
ALERT_SUPPRESSION_TIME=3600
📧 邮件告警配置
邮件服务配置
邮件告警是运维告警系统的核心组件,需要正确配置SMTP服务。详细的邮件发送配置请参考:
CentOS通过命令发送邮件完整教程
高级邮件告警功能
#!/bin/bash
# advanced_email_alert.sh - 高级邮件告警功能# 邮件模板配置
EMAIL_TEMPLATE_DIR="/etc/monitor/templates"# 发送HTML格式告警邮件
send_html_alert() {local alert_type="$1"local