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) )); then
        send_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) )); then
        send_alert "内存告警" "内存使用率过高: ${memory_usage}%,阈值: ${MEMORY_THRESHOLD}%"
    fi
}

# 获取磁盘使用率
get_disk_usage() {
   
   
            
    df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read output;
    do
        usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1)
        partition=$(echo $output | awk '{print $2}')
        
        echo "磁盘使用率 $partition: ${usage}%"
        
        if [ $usage -ge $DISK_THRESHOLD ]; then
            send_alert "磁盘告警" "磁盘使用率过高 $partition: ${usage}%,阈值: ${DISK_THRESHOLD}%"
        fi
    done
}

# 检查系统负载
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) )); then
        send_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"; then
        echo "[$timestamp] 告警被抑制: $title" >> $LOG_FILE
        return
    fi
    
    # 记录告警
    echo "[$timestamp] $title: $message" >> $LOG_FILE
    
    # 发送邮件告警
    send_email_alert "$title" "$message"
    
    # 发送短信告警(如果配置了)
    if [ "$SMS_ENABLED" = "true" ]; then
        send_sms_alert "$title" "$message"
    fi
    
    # 发送钉钉告警(如果配置了)
    if [ "$DINGTALK_ENABLED" = "true" ]; then
        send_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_usage
    get_memory_usage
    get_disk_usage
    get_load_average
    
    echo "=== 系统监控结束 $(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 
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容