青青子衿
Published on 2026-07-16 / 0 Visits
0
0

Zabbix与Prometheus监控

Zabbix与Prometheus监控

运维界的两大"天眼"系统——一个像24小时保安巡逻,一个像超市自助扫码


一、为什么需要监控?

1.1 问题:服务器"生病"了,你怎么知道?

想象你是一家医院的院长,管理着100台服务器(就像100位病人)。如果没有护士定时量体温、测血压,你怎么知道谁发烧了?

没有监控的世界:

  • 网站挂了 → 用户打电话投诉你才知道
  • 磁盘满了 → 数据库写不进去你才发现
  • CPU 100% → 用户说"卡成PPT"你才去查

有监控的世界:

  • 磁盘使用率>80% → 自动发微信通知你
  • 网站响应>3秒 → 自动报警+尝试重启
  • 每天自动生成"体检报告",一目了然

互动提问: 你觉得家里的路由器有没有"监控"功能?打开管理页面看看连接设备数和流量统计——那就是一种轻量级监控!

1.2 推模型 vs 拉模型

这是监控领域最经典的两种架构,就像两种不同的"外卖模式":

对比项推模型(Push)拉模型(Pull)
类比外卖员主动送上门你自己去取餐柜拿
工作方式Agent主动把数据发给ServerServer主动去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}&timestamp=${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能访问AgentAgent能访问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 选型对比

维度ZabbixPrometheus
定位传统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组合则是云原生时代的最佳拍档。掌握两者的架构原理和部署配置,是成为合格运维工程师的必修课。


Comment