1. 简介与核心作用

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

表格

组件作用端口
Zabbix Server监控核心,处理数据采集、告警触发10051
Zabbix Agent主机代理,采集本地指标10050
Zabbix Proxy分布式代理,减轻Server压力10051
Database数据存储(MySQL/PostgreSQL)3306
WebUIWeb管理界面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 refusedAgent未运行启动服务
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 容量规划

表格

规模HostsnvpsServerMySQL
小型<100<1004C8G2C4G,100GB
中型100-500100-5008C16G4C8G,200GB
大型500-2000500-200016C32G8C16G,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 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐