1. 从凌晨三点值班电话说起
"王工!数据库服务器CPU飙到200%了!"接到值班电话的瞬间,你像消防员听到警报般从床上弹起。这样的深夜惊魂,正是今天我们要解决的痛点——如何构建智能的监控告警系统,让告警信息既不会"狼来了",又能在真正危险时准时送达?
2. Zabbix:企业级监控的瑞士军刀
2.1 典型配置示例
(技术栈:Zabbix 6.0 + SMTP邮件通知)
# /etc/zabbix/zabbix_server.conf 关键配置
AlertScriptsPath=/usr/lib/zabbix/alertscripts # 告警脚本存放目录
StartAlerters=5 # 并发告警处理进程数
# 创建邮件告警脚本
cat > /usr/lib/zabbix/alertscripts/send_email.sh <<'EOF'
#!/bin/bash
to=$1
subject=$2
body=$3
echo -e "To: ${to}\nSubject: [ZABBIX] ${subject}\n\n${body}" | sendmail -t
EOF
chmod +x /usr/lib/zabbix/alertscripts/send_email.sh
# Web界面配置步骤:
1. 进入"管理"-"报警媒介类型"
2. 创建名为"Email-Alert"的媒介类型
3. 脚本名称填写send_email.sh
4. 参数配置:{ALERT.SENDTO}、{ALERT.SUBJECT}、{ALERT.MESSAGE}
2.2 告警升级策略配置
# 在触发器配置中设置多级通知:
触发器表达式: system.cpu.load[all,avg5] > 5
→ 默认严重级别: 一般
→ 关联动作:
1级告警(持续5分钟)→ 邮件通知运维组
2级告警(持续15分钟)→ 短信通知值班工程师
3级告警(持续30分钟)→ 电话通知技术主管
3. Nagios:经典永不褪色
3.1 基础告警配置
(技术栈:Nagios Core 4.4 + NRPE)
# /usr/local/nagios/etc/objects/commands.cfg
define command{
command_name check_nrpe_disk
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c check_disk -a '-w 20% -c 10% -p /'
}
# /usr/local/nagios/etc/objects/hosts.cfg
define service{
use generic-service
host_name web-server-01
service_description Disk Usage
check_command check_nrpe_disk
contacts ops-team
notification_interval 30 # 重发告警间隔(分钟)
max_check_attempts 3 # 连续异常次数超过阈值才告警
}
3.2 防止"告警轰炸"的秘籍
# 时间段定义(避免深夜发送非紧急告警)
define timeperiod{
timeperiod_name work-hours
alias Normal Work Hours
monday 09:00-18:00
tuesday 09:00-18:00
wednesday 09:00-18:00
thursday 09:00-18:00
friday 09:00-18:00
}
# 在服务定义中增加:
notification_period work-hours
notification_options w,u,c,r # 仅警告、未知、严重、恢复时通知
4. Prometheus:云原生时代的监控新贵
4.1 完整的告警规则配置
(技术栈:Prometheus 2.40 + Alertmanager)
# prometheus/rules/node_alerts.yml
groups:
- name: host-alerts
rules:
- alert: HighCpuLoad
expr: 100 * (1 - avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m]))) > 85
for: 10m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} CPU负载过高"
description: "实例 {{ $labels.instance }} 的5分钟平均CPU使用率已达{{ $value }}%"
# alertmanager/config.yml
route:
receiver: default-receiver
group_by: [alertname, cluster]
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: default-receiver
webhook_configs:
- url: http://alert-gateway:9095/webhook
send_resolved: true
4.2 告警路由的"智能过滤"
# 分级路由配置示例
route:
receiver: 'slack-general'
routes:
- match_re:
severity: ^(critical|disaster)$
receiver: 'sms-pager'
- match:
team: db
receiver: 'webhook-dba-team'
continue: true
5. 三大工具全方位PK
5.1 应用场景选择指南
- Zabbix:需要传统IT设施的全面监控
- Nagios:轻量化基础设施监控需求
- Prometheus:K8s等云原生环境监控
5.2 功能对比表
维度 | Zabbix | Nagios | Prometheus |
---|---|---|---|
安装复杂度 | 中等 | 简单 | 中等 |
扩展性 | 高 | 低 | 极高 |
数据存储 | 专用数据库 | 文本文件 | 时序数据库 |
自动发现 | 支持 | 需插件 | 原生支持 |
学习曲线 | 陡峭 | 平缓 | 中等 |
6. 血泪经验总结
6.1 防坑指南
- Zabbix触发器表达式务必测试边界值
- Nagios的check_interval必须大于检测超时时间
- Prometheus的for持续时间要大于采集间隔
- 所有告警必须设置抑制规则(Mute)
6.2 最佳实践路线图
graph TD
A[确定监控范围] --> B[选择监控指标]
B --> C{基础设施类型}
C -->|传统服务器|D[Zabbix]
C -->|混合云环境|E[Prometheus]
C -->|轻量级设备|F[Nagios]
D --> G[配置自动发现]
E --> H[使用ServiceMonitor]
F --> I[自定义插件]
G --> J[分级告警策略]
H --> J
I --> J