Zabbix与Prometheus监控
运维界的两大"天眼"系统——一个像24小时保安巡逻,一个像超市自助扫码
一、为什么需要监控?
1.1 问题:服务器"生病"了,你怎么知道?
想象你是一家医院的院长,管理着100台服务器(就像100位病人)。如果没有护士定时量体温、测血压,你怎么知道谁发烧了?
没有监控的世界:
- 网站挂了 → 用户打电话投诉你才知道
- 磁盘满了 → 数据库写不进去你才发现
- CPU 100% → 用户说"卡成PPT"你才去查
有监控的世界:
- 磁盘使用率>80% → 自动发微信通知你
- 网站响应>3秒 → 自动报警+尝试重启
- 每天自动生成"体检报告",一目了然
互动提问: 你觉得家里的路由器有没有"监控"功能?打开管理页面看看连接设备数和流量统计——那就是一种轻量级监控!
1.2 推模型 vs 拉模型
这是监控领域最经典的两种架构,就像两种不同的"外卖模式":
| 对比项 | 推模型(Push) | 拉模型(Pull) |
|---|---|---|
| 类比 | 外卖员主动送上门 | 你自己去取餐柜拿 |
| 工作方式 | Agent主动把数据发给Server | Server主动去Agent那里取数据 |
| 代表产品 | Zabbix(Agent模式) | Prometheus |
| 优点 | Server掌控全局,实时性好 | 架构简单,Agent不怕Server宕机 |
| 缺点 | Agent需要知道Server地址 | Server压力较大(要主动抓取) |
推模型: Agent ──数据──→ Server (Zabbix Agent模式)
拉模型: Server ──请求──→ Exporter (Prometheus)
思考题: 如果你有1万台服务器需要监控,你觉得推模型和拉模型哪个更合适?(提示:想想谁的压力更大)
二、Zabbix架构详解
2.1 问题:如何构建一个完整的监控系统?
Zabbix就像一个智能安防系统,由多个组件协同工作:
┌─────────────────────────────────────────────────────┐
│ Zabbix 架构全景图 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Zabbix │ │ Zabbix │ │ Zabbix │ │
│ │ Server │←──→│ Proxy │←──→│ Agent │ │
│ │ (大脑) │ │ (分区经理)│ │ (传感器) │ │
│ └────┬─────┘ └──────────┘ └──────────┘ │
│ │ │
│ ┌────┴─────┐ ┌──────────┐ │
│ │ Database │ │ Web │ │
│ │(记忆体) │ │ Interface│ │
│ │MySQL/PG │ │ (操作台) │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘
各组件类比:
| 组件 | 生活类比 | 职责 |
|---|---|---|
| Zabbix Server | 安保中心的大脑 | 收集数据、判断告警、触发通知 |
| Zabbix Agent | 安装在每台机器上的传感器 | 采集CPU/内存/磁盘等数据 |
| Zabbix Proxy | 区域经理/中转站 | 代理Server收集某个区域的数据 |
| Database | 档案柜/记忆体 | 存储所有历史数据 |
| Web Interface | 监控大屏/操作台 | 图形化管理界面 |
2.2 数据流向
Agent采集数据 → Server接收并存储到DB → Server评估触发器 → 满足条件则执行动作(报警)
三、Zabbix安装部署
3.1 问题:如何在不同系统上安装Zabbix?
CentOS/RHEL 系安装(以Zabbix 6.0 + MySQL为例)
# 第1步:安装Zabbix官方仓库(就像先办好会员卡)
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpm
dnf clean all
# 第2步:安装Server、前端、Agent(三件套一次装齐)
dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-selinux-policy zabbix-agent
# 第3步:准备数据库
dnf install mysql-server
systemctl enable --now mysqld
mysql -uroot -p
-- 在MySQL中创建Zabbix专用数据库
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;
# 第4步:导入初始数据(这一步比较慢,就像给新手机导入通讯录)
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
# 第5步:配置Zabbix Server
vim /etc/zabbix/zabbix_server.conf
# 修改: DBPassword=your_password
# 第6步:启动所有服务
systemctl restart zabbix-server zabbix-agent httpd php-fpm
systemctl enable zabbix-server zabbix-agent httpd php-fpm
Ubuntu/Debian 系安装
# 第1步:安装Zabbix仓库
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb
apt update
# 第2步:安装组件
apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent
# 第3步:数据库配置(与CentOS相同)
apt install mysql-server
# ... 后续数据库操作与CentOS一致
# 第4步:导入数据并启动
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
systemctl restart zabbix-server zabbix-agent apache2
systemctl enable zabbix-server zabbix-agent apache2
关键差异提示:
- CentOS用
dnf/yum,Ubuntu用apt- Web服务器:CentOS默认
httpd(Apache),Ubuntu用apache2- 防火墙:CentOS用
firewalld,Ubuntu用ufw- SELinux:CentOS默认启用需配置策略,Ubuntu默认不启用
# CentOS开放防火墙端口
firewall-cmd --permanent --add-port=10051/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# Ubuntu开放端口
ufw allow 10051/tcp
ufw allow 80/tcp
四、Zabbix核心配置
4.1 问题:如何让Zabbix知道要监控什么?
Zabbix的配置逻辑就像搭积木,一层套一层:
主机组(Host Group) → 主机(Host) → 监控项(Item) → 触发器(Trigger) → 动作(Action)
↑ ↓
分类管理 报警通知
生活类比: 这就像公司管理体系——
- 主机组 = 部门(研发部、运维部、财务部)
- 主机 = 每个员工
- 监控项 = 员工的KPI指标(考勤、业绩、代码提交量)
- 触发器 = 考核规则(迟到>3次 → 触发警告)
- 动作 = 处理方式(发邮件给HR、自动扣工资)
4.2 主机与主机组
# Web界面操作路径:
配置 → 主机 → 创建主机
关键配置项:
├── 主机名称:web-server-01(起个好记的名字)
├── 可见名称:Web服务器01号(显示用)
├── 群组:Linux servers / Web servers
├── Agent接口:IP地址 + 端口10050
└── 关联模板:Template OS Linux by Zabbix agent
4.3 监控项(Item)
监控项是Zabbix最基本的单元——每一个监控项就是一道"体检项目":
常见监控项示例:
├── system.cpu.load → CPU负载(像人的血压)
├── system.cpu.util → CPU使用率
├── vm.memory.size[available]→ 可用内存
├── vfs.fs.size[/,pused] → 根分区使用率
├── net.if.in[eth0] → 网卡入流量
├── net.if.out[eth0] → 网卡出流量
└── vfs.file.exists[/etc/passwd] → 文件是否存在
4.4 触发器(Trigger)
触发器是判断规则——"什么情况下算出问题":
触发器表达式示例:
├── CPU负载 > 5 持续3分钟 → 警告
├── 可用内存 < 500MB → 严重
├── 磁盘使用率 > 90% → 灾难
├── 网站不可达 → 灾难
└── 进程数 > 500 → 警告
语法示例:
{web-server-01:system.cpu.load[all,avg1].last()}>5
{web-server-01:vm.memory.size[available].last()}<500M
4.5 动作(Action)
动作定义了"触发器报警后怎么办":
动作配置:
├── 条件:触发器严重级别 >= 警告
├── 操作:
│ ├── 发送邮件给运维组
│ ├── 发送微信通知
│ └── 执行远程命令(如重启服务)
└── 恢复操作:
└── 问题恢复后发送"已恢复"通知
五、模板使用
5.1 问题:100台服务器每台都手动配置?
模板(Template)就是"预制菜"——把一组监控项、触发器、图表打包好,直接关联到主机即可。
# 操作路径:
配置 → 模板 → 选择模板 → 关联到主机
常用内置模板:
├── Template OS Linux by Zabbix agent
├── Template OS Windows by Zabbix agent
├── Template App MySQL by Zabbix agent
├── Template App Nginx by Zabbix agent
└── Template App Apache by Zabbix agent
# 一个主机可以关联多个模板(就像一个人可以同时加入多个社团)
主机 web-server-01:
├── Template OS Linux(基础监控)
├── Template App Nginx(Nginx专项)
└── Template App MySQL(如果有MySQL的话)
互动提问: 如果修改了一个模板里的监控项,已经关联了这个模板的主机会受影响吗?(答案:会!模板是引用关系,修改模板会同步到所有关联主机。)
六、自定义监控
6.1 问题:内置监控项不够用怎么办?
Zabbix Agent支持通过UserParameter自定义监控项——就像给传感器加装自定义探头。
方法一:UserParameter
# 编辑Agent配置文件
vim /etc/zabbix/zabbix_agentd.d/custom.conf
# 语法:UserParameter=<key>,<command>
# 监控在线用户数
UserParameter=online.users,who | wc -l
# 监控某个进程是否存活
UserParameter=process.check[*],ps aux | grep -c $1 | grep -v grep
# 监控网站响应时间
UserParameter=website.response,curl -o /dev/null -s -w '%{time_total}' http://localhost
# 重启Agent使配置生效
systemctl restart zabbix-agent
方法二:自定义脚本
#!/bin/bash
# /etc/zabbix/scripts/check_disk_io.sh
# 监控磁盘IO的自定义脚本
DISK=$1
# 获取磁盘读取速度(KB/s)
iostat -d $DISK 1 2 | tail -1 | awk '{print $6}'
# 配置UserParameter调用脚本
UserParameter=disk.io.read[*],/etc/zabbix/scripts/check_disk_io.sh $1
# 赋予执行权限
chmod +x /etc/zabbix/scripts/check_disk_io.sh
# 在Server端测试(zabbix_get是调试利器!)
zabbix_get -s 192.168.1.100 -k "disk.io.read[sda]"
小贴士:
zabbix_get是排错利器!当你不确定Agent是否正常返回数据时,用它直接从Server端主动获取一次数据试试。
七、报警通知配置
7.1 问题:发现问题后怎么第一时间通知我?
邮件报警(最基础的方式)
# 配置邮件发送(以QQ邮箱为例)
# Web界面:管理 → 报警媒介类型 → Email
SMTP服务器: smtp.qq.com
SMTP端口: 465
SMTP加密: SSL/TLS
认证方式: 密码
用户名: your_qq@qq.com
密码: xxxxxxxxxxxx(QQ邮箱的授权码,不是登录密码!)
微信企业号Webhook
# 在企业微信后台创建应用,获取 CorpID、AgentID、Secret
# 编写报警脚本
#!/bin/bash
# /usr/lib/zabbix/alertscripts/wechat.sh
CORP_ID="your_corp_id"
AGENT_ID="your_agent_id"
SECRET="your_secret"
TO_USER=$1
SUBJECT=$2
MESSAGE=$3
# 获取access_token
TOKEN=$(curl -s "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${CORP_ID}&corpsecret=${SECRET}" | jq -r '.access_token')
# 发送消息
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${TOKEN}" \
-d '{
"touser": "'${TO_USER}'",
"msgtype": "text",
"agentid": '${AGENT_ID}',
"text": {"content": "'${SUBJECT}'\n'${MESSAGE}'"}
}'
钉钉机器人Webhook
#!/bin/bash
# /usr/lib/zabbix/alertscripts/dingtalk.sh
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
SECRET="YOUR_SECRET"
# 计算签名(钉钉安全设置要求)
TIMESTAMP=$(date +%s%3N)
SIGN=$(echo -ne "${TIMESTAMP}\n${SECRET}" | openssl dgst -sha256 -hmac "${SECRET}" -binary | base64)
URL="${WEBHOOK}×tamp=${TIMESTAMP}&sign=$(python3 -c "import urllib.parse; print(urllib.parse.quote('${SIGN}'))")"
# 发送Markdown格式消息
curl -s -X POST "${URL}" \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "markdown",
"markdown": {
"title": "Zabbix报警",
"text": "## Zabbix 报警通知\n> **主机:** '"$1"'\n> **问题:** '"$2"'\n> **时间:** '"$(date '+%Y-%m-%d %H:%M:%S')"'"
}
}'
八、自动发现 vs 自动注册
8.1 问题:新服务器上线,如何自动纳入监控?
| 特性 | 自动发现(Auto Discovery) | 自动注册(Auto Registration) |
|---|---|---|
| 类比 | HR主动去找新员工 | 新员工自己来报到 |
| 发起方 | Server主动扫描网段 | Agent主动向Server注册 |
| 适用场景 | 小型网络,IP可预测 | 大型/云环境,IP不固定 |
| 配置位置 | Server端配置发现规则 | Agent端配置ServerAddress |
| 网络要求 | Server能访问Agent | Agent能访问Server |
# 自动注册:Agent端配置
vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.1 # Zabbix Server地址
ServerActive=192.168.1.1 # 主动模式的Server地址
HostMetadataItem=system.uname # 元数据(用于自动注册规则匹配)
# Server端配置自动注册动作:
配置 → 动作 → 自动注册动作
条件:HostMetadata contains "Linux"
操作:添加到主机组"Linux servers" + 关联模板"Template OS Linux"
九、分布式监控(Proxy)
9.1 问题:监控跨机房/跨地域的服务器
当你的服务器分布在北京、上海、广州三个机房时,让Zabbix Server直接监控所有机器会导致网络延迟大、数据丢失。这时候就需要Zabbix Proxy——就像在每个城市设一个"区域经理"。
北京机房 ──→ Proxy-BJ ──┐
上海机房 ──→ Proxy-SH ──┼──→ Zabbix Server(总控)
广州机房 ──→ Proxy-GZ ──┘
# 在Proxy服务器上安装
# CentOS:
dnf install zabbix-proxy-mysql zabbix-agent
# Ubuntu:
apt install zabbix-proxy-mysql zabbix-agent
# 配置Proxy
vim /etc/zabbix/zabbix_proxy.conf
Server=10.0.0.1 # Zabbix Server地址
Hostname=proxy-beijing # Proxy名称(要与Web界面一致)
DBName=zabbix_proxy # Proxy专用数据库
DBPassword=proxy_db_password
# 初始化Proxy数据库
zcat /usr/share/zabbix-sql-scripts/mysql/proxy.sql.gz | mysql -uzabbix_proxy -p zabbix_proxy
# 启动Proxy
systemctl restart zabbix-proxy zabbix-agent
systemctl enable zabbix-proxy zabbix-agent
注意: Proxy本身不发送报警通知!它只负责收集数据转发给Server,报警判断由Server完成。
十、Prometheus架构
10.1 问题:云原生时代需要什么样的监控?
Prometheus是专门为容器和微服务设计的监控系统——如果说Zabbix像传统安防系统,Prometheus就像互联网的自助扫码系统。
┌──────────────────────────────────────────────────────────┐
│ Prometheus 架构全景 │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Prometheus │───→│ Grafana │ │Alertmanager│ │
│ │ Server │ │(可视化大屏) │ │ (报警管家) │ │
│ │ (核心引擎) │ └────────────┘ └─────┬──────┘ │
│ └──────┬─────┘ │ │
│ │ 拉取 ↓ │
│ ┌──────┴──────────────────────────┐ ┌─────────┐ │
│ │ Exporters(数据源) │ │ 邮件 │ │
│ │ ┌─────────┐ ┌─────────┐ │ │ 钉钉 │ │
│ │ │node │ │mysql │ │ │ Webhook │ │
│ │ │exporter │ │exporter │ ... │ └─────────┘ │
│ │ └─────────┘ └─────────┘ │ │
│ └────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
核心组件类比:
| 组件 | 类比 | 职责 |
|---|---|---|
| Prometheus Server | 数据采集中心 | 定时拉取(scrape)各Exporter的数据 |
| Exporter | 各种传感器 | 暴露metrics端点供Prometheus抓取 |
| Alertmanager | 报警调度员 | 接收报警→分组→抑制→发送通知 |
| Grafana | 数据可视化大屏 | 漂亮地展示监控数据 |
| Pushgateway | 临时数据投递箱 | 用于短生命周期任务的指标上报 |
十一、Prometheus安装与配置
CentOS/RHEL
# 下载Prometheus二进制包(Prometheus不在yum仓库中)
cd /opt
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xzf prometheus-2.48.0.linux-amd64.tar.gz
ln -s /opt/prometheus-2.48.0.linux-amd64 /opt/prometheus
# 创建系统服务
cat > /etc/systemd/system/prometheus.service << 'EOF'
[Unit]
Description=Prometheus
After=network.target
[Service]
User=prometheus
ExecStart=/opt/prometheus/prometheus \
--config.file=/opt/prometheus/prometheus.yml \
--storage.tsdb.path=/opt/prometheus/data \
--storage.tsdb.retention.time=30d
Restart=always
[Install]
WantedBy=multi-user.target
EOF
useradd -r -s /sbin/nologin prometheus
mkdir -p /opt/prometheus/data
chown -R prometheus:prometheus /opt/prometheus
systemctl daemon-reload
systemctl enable --now prometheus
Ubuntu/Debian
# Ubuntu可以通过apt安装(版本可能稍旧)
apt install prometheus
# 或者同样下载二进制包(与CentOS相同)
# ...(同上)
# Ubuntu用ufw开放端口
ufw allow 9090/tcp # Prometheus Web界面
ufw allow 9100/tcp # node_exporter
核心配置文件 prometheus.yml
global:
scrape_interval: 15s # 每15秒拉取一次数据
evaluation_interval: 15s # 每15秒评估一次规则
# 告警管理器地址
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
# 告警规则文件
rule_files:
- "alert_rules.yml"
# 抓取目标配置(最重要!)
scrape_configs:
# 监控Prometheus自己
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控Linux服务器(通过node_exporter)
- job_name: 'node_servers'
static_configs:
- targets:
- '192.168.1.10:9100'
- '192.168.1.11:9100'
- '192.168.1.12:9100'
labels:
env: 'production'
# 监控MySQL(通过mysqld_exporter)
- job_name: 'mysql_servers'
static_configs:
- targets: ['192.168.1.20:9104']
node_exporter安装
# 在所有被监控机器上安装node_exporter
cd /opt
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
ln -s /opt/node_exporter-1.7.0.linux-amd64 /opt/node_exporter
# 创建服务
cat > /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/opt/node_exporter/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
useradd -r -s /sbin/nologin node_exporter
chown -R node_exporter:node_exporter /opt/node_exporter
systemctl daemon-reload
systemctl enable --now node_exporter
十二、PromQL基础
12.1 问题:如何查询和分析监控数据?
PromQL(Prometheus Query Language)就像Excel的公式——用特定语法对监控数据进行计算。
四种基本数据类型
Counter(计数器):只增不减的累加值
→ 如:HTTP请求总数、错误总数、网络流量总计
→ 类比:汽车里程表(只会增加不会减少)
Gauge(仪表盘):可增可减的瞬时值
→ 如:CPU使用率、内存使用量、温度
→ 类比:汽车速度表(可快可慢)
Histogram(直方图):分布统计
→ 如:请求延迟分布、响应大小分布
Summary(摘要):类似Histogram但客户端计算
常用查询示例
# CPU使用率(所有实例)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# 磁盘使用率
(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
# 网络入流量速率(5分钟平均)
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8
# 5分钟内HTTP 5xx错误率
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) * 100
# 查看哪些实例CPU使用率超过80%
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
rate() vs irate()
rate():一段时间内的平均变化速率 → 看趋势(像平均速度)
irate():最近两个数据点的瞬时变化速率 → 看瞬间(像瞬时速度)
# 一般告警用rate()(稳定),排查突发问题用irate()(灵敏)
互动提问: 如果要监控一个网站的QPS(每秒查询数),应该用rate()还是irate()?为什么?(提示:QPS关注的是实时负载还是平均趋势?)
十三、Alertmanager配置
13.1 问题:告警太多被"轰炸"怎么办?
Alertmanager的三大法宝:分组、抑制、静默。
# alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: 'alert@example.com'
smtp_auth_username: 'alert@example.com'
smtp_auth_password: 'your_password'
route:
receiver: 'default-receiver'
group_by: ['alertname', 'instance'] # 分组依据
group_wait: 30s # 等30秒收集同组告警
group_interval: 5m # 同组告警至少间隔5分钟发送
repeat_interval: 4h # 未恢复告警每4小时重复
routes:
- match:
severity: critical
receiver: 'critical-alerts'
- match:
severity: warning
receiver: 'warning-alerts'
receivers:
- name: 'default-receiver'
email_configs:
- to: 'ops-team@example.com'
- name: 'critical-alerts'
email_configs:
- to: 'oncall@example.com'
webhook_configs:
- url: 'http://dingtalk-robot:8080/alert'
- name: 'warning-alerts'
email_configs:
- to: 'dev-team@example.com'
# 抑制规则:如果critical告警触发了,抑制同名的warning告警
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
三大机制详解:
| 机制 | 类比 | 说明 |
|---|---|---|
| 分组(Group) | 合并同类快递 | 相同类型的告警合并成一封通知 |
| 抑制(Inhibit) | 老板骂了就别再让组长也骂 | 严重告警触发后抑制低级告警 |
| 静默(Silence) | 维护期间的"免打扰" | 临时屏蔽特定告警 |
告警规则示例
# alert_rules.yml
groups:
- name: server_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 3m
labels:
severity: warning
annotations:
summary: "CPU使用率过高: {{ $labels.instance }}"
description: "{{ $labels.instance }} CPU使用率超过80%,当前值: {{ $value }}%"
- alert: DiskSpaceLow
expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足: {{ $labels.instance }}"
description: "根分区使用率超过85%,请尽快清理!"
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "实例宕机: {{ $labels.instance }}"
description: "{{ $labels.instance }} 已失联超过1分钟"
十四、Grafana可视化
14.1 问题:数据有了,怎么让它"好看"?
Grafana是监控数据的"美颜相机"——把枯燥的数字变成漂亮的图表。
安装Grafana
# CentOS/RHEL
cat > /etc/yum.repos.d/grafana.repo << 'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
EOF
dnf install grafana
systemctl enable --now grafana-server
# Ubuntu/Debian
apt install -y apt-transport-https software-properties-common
wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list
apt update
apt install grafana
systemctl enable --now grafana-server
# 访问Grafana
浏览器打开: http://your-server:3000
默认账号: admin / admin(首次登录强制修改密码)
配置数据源
1. 添加数据源 → 选择 Prometheus
2. URL: http://localhost:9090
3. 点击 "Save & Test"
仪表盘(Dashboard)与面板(Panel)
Dashboard = 一整面监控墙
├── Panel 1: CPU使用率(时序图)
├── Panel 2: 内存使用(仪表盘)
├── Panel 3: 网络流量(面积图)
├── Panel 4: 磁盘IO(柱状图)
└── Panel 5: 在线服务数(状态面板)
推荐: Grafana官网有大量社区共享的Dashboard模板(https://grafana.com/grafana/dashboards/),搜索"Node Exporter Full"即可获得一套完整的服务器监控面板,直接导入使用!
十五、Zabbix vs Prometheus 选型对比
| 维度 | Zabbix | Prometheus |
|---|---|---|
| 定位 | 传统IT基础设施监控 | 云原生/容器监控 |
| 数据模型 | 关系型数据库 | 时序数据库(TSDB) |
| 采集方式 | 推(Agent→Server) | 拉(Server→Exporter) |
| 查询语言 | 内置函数 | PromQL(更强大灵活) |
| 可视化 | 自带(功能基础) | 通常搭配Grafana |
| 学习曲线 | 低(Web界面配置) | 中(需学习PromQL和YAML) |
| 适合场景 | 物理机/虚拟机/网络设备 | 容器/K8s/微服务 |
| 分布式 | Proxy(官方方案) | Federation/Thanos |
运维常用命令精选
# ===== Zabbix 常用命令 =====
# 检查Zabbix Server状态
systemctl status zabbix-server
# 查看Zabbix Server日志
tail -f /var/log/zabbix/zabbix_server.log
# 测试Agent连通性
zabbix_get -s 192.168.1.100 -k system.cpu.load[all,avg1]
# 查看Agent日志(排查问题)
tail -f /var/log/zabbix/zabbix_agentd.log
# 重启Agent(修改配置后)
systemctl restart zabbix-agent
# ===== Prometheus 常用命令 =====
# 检查Prometheus状态
systemctl status prometheus
# 查看Prometheus配置是否正确
/opt/prometheus/promtool check config /opt/prometheus/prometheus.yml
# 查看Exporter暴露的指标
curl -s http://localhost:9100/metrics | head -20
# 热重载配置(无需重启)
curl -X POST http://localhost:9090/-/reload
# ===== Grafana 常用命令 =====
# 检查Grafana状态
systemctl status grafana-server
# 查看Grafana日志
tail -f /var/log/grafana/grafana.log
# 重置admin密码
grafana-cli admin reset-admin-password new_password
趣味命令
# 实时监控服务器资源(像看心电图一样)
watch -n 1 "echo '=== CPU ===' && top -bn1 | head -5 && echo '=== Memory ===' && free -h && echo '=== Disk ===' && df -h /"
# 用curl测试Prometheus API
curl 'http://localhost:9090/api/v1/query?query=up' | python3 -m json.tool
# 查看Zabbix Server采集了多少监控项
mysql -uzabbix -p zabbix -e "SELECT COUNT(*) AS total_items FROM items WHERE status=0;"
# 用slurm替代iftop看实时网络流量(如果有安装)
slurm -i eth0
# 把系统负载画成ASCII图(终端里的监控面板)
# 安装glances(比top更美观的监控工具)
pip3 install glances
glances
小结: 监控是运维的"眼睛",没有监控的运维就像盲人摸象。Zabbix适合传统IT环境的全面监控,Prometheus+Grafana组合则是云原生时代的最佳拍档。掌握两者的架构原理和部署配置,是成为合格运维工程师的必修课。