1. 简介与核心作用

Zabbix是企业级开源分布式监控系统。

表格

组件 作用 端口
Zabbix Server 监控核心,处理数据采集、告警触发 10051
Zabbix Agent 主机代理,采集本地指标 10050
Zabbix Proxy 分布式代理,减轻Server压力 10051
Database 数据存储(MySQL/PostgreSQL) 3306
WebUI Web管理界面 80/443

核心概念:Host(被监控对象)、Item(监控指标)、Trigger(触发器)、Template(模板)、Action(动作)

2. 工作原理

2.1 监控数据采集流程

plaintext

┌─────────┐ 10050 ┌──────────┐ 10051 ┌─────────┐
│  Agent  │◄─────►│  Server  │◄─────►│  Proxy  │
└─────────┘       └────┬─────┘       └─────────┘
                       ▼
                ┌────────────┐
                │  Database  │
                └────────────┘

2.2 主动模式 vs 被动模式

表格

模式 Server角色 Agent角色 适用场景
被动模式 主动发起请求 被动响应 小规模
主动模式 等待连接 主动上报 大规模

被动模式配置Server=192.168.1.100

主动模式配置ServerActive=192.168.1.100; Hostname=web-server-01

触发器表达式{host:key.function(parameter)}<operator>value

表格

函数 说明 示例
avg() 平均值 avg(/host/cpu,5m)
max() 最大值 max(/host/mem,1h)
last() 最新值 last(/host/vfs)
nodata() 无数据 nodata(/host/ping,10m)

示例{Centos8:system.cpu.util.last(0)}>80

2.4 告警升级

plaintext

Trigger触发 → Action → Step1(邮件,0-30min) → Step2(微信,30-60min) → Step3(电话,>60min)

3. 部署与配置

3.1 Zabbix Server + MySQL + Nginx

yaml

# docker-compose.yml
version: '3.8'
services:
  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-6.4
    container_name: zabbix-server
    environment:
      DB_SERVER_HOST: mysql-server
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_p@ssw0rd
      ZBX_CACHESIZE: 512M
      ZBX_HISTORYCACHESIZE: 128M
      ZBX_TRENDCACHESIZE: 128M
      ZBX_VALUECACHESIZE: 256M
    ports:
      - "10051:10051"
    depends_on:
      - mysql-server
    restart: always

  mysql-server:
    image: mysql:8.0
    container_name: mysql-server
    environment:
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_p@ssw0rd
      MYSQL_ROOT_PASSWORD: root_p@ssw0rd
    volumes:
      - mysql-data:/var/lib/mysql
    command:
      - --character-set-server=utf8mb4
      - --max_connections=500
      - --innodb-buffer-pool-size=2G
    restart: always

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-6.4
    container_name: zabbix-web
    environment:
      DB_SERVER_HOST: mysql-server
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_p@ssw0rd
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Asia/Shanghai
    ports:
      - "8080:8080"
    depends_on:
      - mysql-server
      - zabbix-server
    restart: always

volumes:
  mysql-data:

bash

docker-compose up -d
# 访问 http://localhost:8080  账号: Admin / zabbix

3.2 Zabbix Agent2 配置

ini

# /etc/zabbix/zabbix_agent2.conf
Server=192.168.1.100
ServerActive=192.168.1.100
Hostname=web-server-01

# TLS配置(生产环境)
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/etc/zabbix/ca.pem
TLSCertFile=/etc/zabbix/client.crt
TLSKeyFile=/etc/zabbix/client.key

# 自定义监控项
UnsafeUserParameters=1
Include=/etc/zabbix/zabbix_agent2.d/*.conf

自定义监控项

ini

# /etc/zabbix/zabbix_agent2.d/userparameter_mysql.conf
UserParameter=mysql.ping[*],mysqladmin -h$1 -P$2 ping
UserParameter=mysql.status[*],mysqladmin -h$1 -P$2 extended-status | grep $3 | awk '{print $$4}'

3.3 Zabbix Proxy 部署

yaml

version: '3.8'
services:
  zabbix-proxy:
    image: zabbix/zabbix-proxy-sqlite3:alpine-6.4
    container_name: zabbix-proxy
    environment:
      ZBX_HOSTNAME: proxy-sh-01
      ZBX_SERVER_HOST: 192.168.1.100
      ZBX_PROXYMODE: 0
    ports:
      - "10051:10051"
    volumes:
      - ./proxy_data:/var/lib/zabbix
    restart: always

4. 常用操作

4.1 zabbix_get / zabbix_sender

bash

# 测试Agent连通性
zabbix_get -s 192.168.1.101 -p 10050 -k agent.ping

# 测试CPU负载
zabbix_get -s 192.168.1.101 -k system.cpu.load[all,avg1]

# 推送数据
zabbix_sender -z 192.168.1.100 -s "web-server-01" -k custom.key -o 12345

# 批量推送
echo "192.168.1.101 custom.metric1 100" > /tmp/data.txt
echo "web-server-01 custom.metric2 200" >> /tmp/data.txt
zabbix_sender -z 192.168.1.100 -i /tmp/data.txt

4.2 API操作

python

import requests

ZBX_URL = "http://192.168.1.100:8080/api_jsonrpc.php"

def zbx_api(method, params, token=None):
    payload = {
        "jsonrpc": "2.0", "method": method,
        "params": params, "auth": token, "id": 1
    }
    return requests.post(ZBX_URL, json=payload).json()["result"]

# 获取Token
token = zbx_api("user.login", {"user": "Admin", "password": "zabbix"})

# 获取所有主机
hosts = zbx_api("host.get", {"output": ["hostid", "name"]}, token)
print(f"Total hosts: {len(hosts)}")

# 获取模板ID并批量链接
templates = zbx_api("template.get", {
    "output": ["templateid"],
    "filter": {"host": ["Template OS Linux"]}
}, token)
template_id = templates[0]["templateid"]

for host in hosts:
    zbx_api("host.update", {
        "hostid": host["hostid"],
        "templates": [{"templateid": template_id}]
    }, token)

# 创建监控项
zbx_api("item.create", {
    "hostid": "10234",
    "name": "Custom Metric",
    "key_": "custom.api.metric",
    "type": 0, "value_type": 3, "delay": "30s"
}, token)

4.3 自动发现(LLD)与自动注册

LLD脚本nginx.discovery 返回 {"data":[{"{#STATUS}":"active"},{"{#STATUS}":"reading"}]}

自动注册Agent配置

ini

ServerActive=192.168.1.100
Hostname=server-{HOST.IP}

Server端Action: Host metadata contains "linux" → Link template

5. 常见问题与排查

5.1 Agent不可达排查

bash

# 1. 网络连通性
telnet 192.168.1.101 10050
nc -zv 192.168.1.101 10050

# 2. Agent进程状态
systemctl status zabbix-agent2

# 3. 日志检查
tail -f /var/log/zabbix/zabbix_agent2.log

# 4. 测试
zabbix_get -s 192.168.1.101 -k agent.ping

表格

问题 原因 解决
Connection refused Agent未运行 启动服务
Timeout 防火墙阻挡 开放端口
Hostname不匹配 配置错误 核对Web界面

5.2 告警风暴处理

触发器去抖动{host:metric.min(5m)}>100 替代 {host:metric.last()}>100

Trigger依赖

python

zbx_api("trigger.update", {"triggerid": "12346", "dependencies": [{"triggerid": "12345"}]}, token)

动作去重Event age less than 5m

5.3 数据库性能优化

MySQL分区表

sql

-- history表按天分区
ALTER TABLE history DROP PRIMARY KEY, ADD PRIMARY KEY (itemid, clock);
ALTER TABLE history PARTITION BY RANGE (clock) (
  PARTITION p2024_01 VALUES LESS THAN (UNIX_TIMESTAMP('2024-02-01')),
  PARTITION p2024_02 VALUES LESS THAN (UNIX_TIMESTAMP('2024-03-01')),
  PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- trends表按月分区
ALTER TABLE trends PARTITION BY RANGE (clock) (
  PARTITION p2024_q1 VALUES LESS THAN (UNIX_TIMESTAMP('2024-04-01')),
  PARTITION p_future VALUES LESS THAN MAXVALUE
);

Housekeeper配置

bash

HousekeepingFrequency=1
MaxHousekeeperDelete=5000
HistoryCacheSize=128M
TrendCacheSize=128M
ValueCacheSize=256M

6. 最佳实践

6.1 模板设计规范

  • 模板: Template [Layer] [Component]Template OS Linux
  • 监控项: {name}.{metric}cpu.util
  • 触发器: {service}_{metric}_{condition}nginx_down

6.2 触发器优化

bash

# 避免last(),改用avg/min/max
# 不好: {host:key.last()} > 100
# 好:   {host:key.avg(5m)} > 100

# 添加时间窗口
{host:cpu.avg(5m)} > 90 and {host:cpu.max(5m)} > 90

# 检测数据丢失
{host:agent.ping.nodata(10m)}=1

6.3 容量规划

表格

规模 Hosts nvps Server MySQL
小型 <100 <100 4C8G 2C4G,100GB
中型 100-500 100-500 8C16G 4C8G,200GB
大型 500-2000 500-2000 16C32G 8C16G,500GB

6.4 高可用方案

plaintext

              ┌─────────────┐
              │   VIP/PACE  │
              └──────┬──────┘
       ┌─────────────┼─────────────┐
       ▼             ▼             ▼
 ┌──────────┐  ┌──────────┐  ┌──────────┐
 │Zabbix-SRV1│  │Zabbix-SRV2│  │Zabbix-SRV3│
 │ (Primary) │  │ (Standby) │  │ (Standby) │
 └───────────┘  └───────────┘  └───────────┘

6.5 关键参数调优

bash

StartPollers=100
StartPollersUnreachable=50
StartTrappers=30
StartPingers=50
StartDiscoverers=10
CacheSize=512M
HistoryCacheSize=128M
TrendCacheSize=128M
ValueCacheSize=256M

常用命令速查

bash

# Agent操作
systemctl enable --now zabbix-agent2
zabbix_get -s IP -k key
zabbix_sender -z SERVER -s HOST -k key -o value

# Server诊断
zabbix_server -R housekeeper_execute
zabbix_server -R config_cache_reload

# 数据库维护
mysql -u zabbix -p -e "OPTIMIZE TABLE history;"

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐