一、概述
1.1 背景介绍
运维团队每天面对的核心挑战之一就是“如何快速发现问题”。当你管理的服务器从几十台扩展到几百台,传统的逐台检查方式早已不可行。我们需要一套能够实时展示全局状态、快速定位异常的监控系统。
Zabbix作为开源监控领域的老牌选手,经过20多年的迭代,已经从单纯的监控工具演变为企业级监控平台。7.0 LTS版本在可视化方面做了大量改进,原生Dashboard功能已经能够满足大多数运维大屏需求,不再强依赖Grafana。
我们团队在2024年完成了从Zabbix 5.0到7.0的升级迁移,监控规模覆盖800+服务器、2000+网络设备。这篇文章会分享整个搭建过程中的技术细节和踩坑经验。
1.2 技术特点
Zabbix 7.0 LTS相比之前版本,有几个值得关注的变化:
架构层面
- 原生支持高可用(HA)集群,不再需要借助Keepalived
- TimescaleDB支持更成熟,历史数据压缩率提升40%
- 新增Proxy负载均衡,单个Server可管理更多Proxy
可视化层面
- Dashboard重构,支持更灵活的布局
- 新增地理地图(Geomap)组件
- SVG图形支持,可自定义拓扑图
- 实时数据刷新间隔可配置到1秒
数据采集层面
- Zabbix Agent 2成为默认推荐
- 原生支持Prometheus数据格式导入
- 新增Browser监控项类型
1.3 适用场景
| 场景 |
推荐方案 |
说明 |
| 中小企业(<200台服务器) |
单机部署 |
Server+MySQL+Nginx一体化 |
| 中型企业(200-1000台) |
分布式部署 |
Server+Proxy+TimescaleDB |
| 大型企业(>1000台) |
高可用集群 |
HA Server+多Proxy+TimescaleDB集群 |
| 混合云环境 |
多Proxy架构 |
每个网络区域部署独立Proxy |
| 需要长期数据保留 |
TimescaleDB |
数据压缩+自动分区 |
1.4 环境要求
| 组件 |
版本要求 |
硬件配置(500台监控规模) |
| 操作系统 |
Rocky Linux 9.3+ / Ubuntu 24.04 |
- |
| Zabbix Server |
7.0 LTS |
CPU: 4核, 内存: 8GB, 磁盘: 100GB SSD |
| Zabbix Proxy |
7.0 LTS |
CPU: 2核, 内存: 4GB, 磁盘: 50GB SSD |
| 数据库 |
TimescaleDB 2.14+ (PostgreSQL 16) |
CPU: 4核, 内存: 16GB, 磁盘: 500GB SSD |
| Web Server |
Nginx 1.24+ |
与Server同机部署 |
| PHP |
8.1+ |
php-fpm方式运行 |
| Zabbix Agent |
7.0 (Agent 2) |
CPU: 1核, 内存: 512MB |
二、详细步骤
2.1 准备工作
2.1.1 系统初始化
以Rocky Linux 9为例,执行基础配置:
# 设置主机名
hostnamectl set-hostname zabbix-server
# 关闭SELinux(生产环境建议配置策略而非关闭)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
# 配置防火墙
firewall-cmd --permanent --add-port=10051/tcp # Zabbix Server
firewall-cmd --permanent --add-port=80/tcp # Web界面
firewall-cmd --permanent --add-port=443/tcp # HTTPS
firewall-cmd --reload
# 时间同步(监控系统对时间敏感)
dnf install -y chrony
systemctl enable --now chronyd
chronyc sources -v
踩坑记录:我们曾因为NTP时间不同步导致告警延迟。Zabbix Server与Agent时间差超过60秒时,部分Trigger会出现误报。建议监控规模超过100台时,内网部署NTP服务器。
2.1.2 安装TimescaleDB
MySQL虽然是Zabbix的默认选择,但在大规模部署时,TimescaleDB的表现明显更好。我们在500台规模的环境中测试,TimescaleDB的历史数据查询速度比MySQL快3-5倍。
# 安装PostgreSQL 16官方源
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 禁用系统自带PostgreSQL模块
dnf -qy module disable postgresql
# 安装PostgreSQL 16
dnf install -y postgresql16-server postgresql16-contrib
# 初始化数据库
/usr/pgsql-16/bin/postgresql-16-setup initdb
# 安装TimescaleDB
dnf install -y https://packagecloud.io/timescale/timescaledb/el/9/x86_64/timescaledb-2-postgresql-16-2.14.2-0.el9.x86_64.rpm
# 配置TimescaleDB
timescaledb-tune --pg-config=/usr/pgsql-16/bin/pg_config --yes
# 启动PostgreSQL
systemctl enable --now postgresql-16
配置PostgreSQL认证(/var/lib/pgsql/16/data/pg_hba.conf):
# Zabbix Server连接
host zabbix zabbix 127.0.0.1/32 scram-sha-256
host zabbix zabbix ::1/128 scram-sha-256
创建数据库和用户:
sudo -u postgres psql << 'EOF'
CREATE USER zabbix WITH PASSWORD 'YourStrongPassword_2025';
CREATE DATABASE zabbix OWNER zabbix;
\c zabbix
CREATE EXTENSION IF NOT EXISTS timescaledb;
EOF
2.1.3 安装Zabbix Server
# 添加Zabbix 7.0官方源
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-7.0-4.el9.noarch.rpm
dnf clean all
# 安装Zabbix组件
dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2
# 导入初始数据库结构
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix
# 启用TimescaleDB扩展(这一步很关键)
cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix
2.2 核心配置
2.2.1 Zabbix Server配置
编辑 /etc/zabbix/zabbix_server.conf:
# 数据库配置
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbix
DBPassword=YourStrongPassword_2025
DBPort=5432
# 性能调优(500台规模)
StartPollers=20
StartPollersUnreachable=5
StartTrappers=10
StartPingers=5
StartDiscoverers=5
StartHTTPPollers=5
# 缓存配置
CacheSize=256M
HistoryCacheSize=128M
HistoryIndexCacheSize=64M
TrendCacheSize=64M
ValueCacheSize=256M
# 超时配置
Timeout=30
TrapperTimeout=300
# 日志配置
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=100
DebugLevel=3
# 告警脚本路径
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
# 启用HA(可选,需要多节点)
# HANodeName=zabbix-server-01
# NodeAddress=192.168.1.10:10051
参数说明:
| 参数 |
建议值 |
说明 |
| StartPollers |
主机数/25 |
主动轮询进程数 |
| CacheSize |
256M-1G |
配置数据缓存,监控项越多越大 |
| HistoryCacheSize |
128M-512M |
历史数据写入缓存 |
| ValueCacheSize |
256M-1G |
Trigger计算缓存 |
2.2.2 Nginx配置
编辑 /etc/nginx/conf.d/zabbix.conf:
server {
listen 80;
server_name zabbix.example.com;
# 强制HTTPS跳转(生产环境)
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name zabbix.example.com;
ssl_certificate /etc/nginx/ssl/zabbix.crt;
ssl_certificate_key /etc/nginx/ssl/zabbix.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /usr/share/zabbix;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/zabbix.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 大屏展示优化:增加缓冲区
location /api_jsonrpc.php {
fastcgi_pass unix:/run/php-fpm/zabbix.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
}
2.2.3 PHP-FPM优化
编辑 /etc/php-fpm.d/zabbix.conf:
[zabbix]
user = nginx
group = nginx
listen = /run/php-fpm/zabbix.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
; Zabbix PHP配置要求
php_value[max_execution_time] = 300
php_value[memory_limit] = 256M
php_value[post_max_size] = 32M
php_value[upload_max_filesize] = 16M
php_value[max_input_time] = 300
php_value[date.timezone] = Asia/Shanghai
2.3 启动和验证
# 启动服务
systemctl enable --now zabbix-server zabbix-agent2 nginx php-fpm
# 检查Server状态
systemctl status zabbix-server
tail -f /var/log/zabbix/zabbix_server.log
# 验证端口监听
ss -tlnp | grep -E '10051|80|443'
访问 https://zabbix.example.com 完成Web安装向导。默认管理员账号:Admin,密码:zabbix。
重要:首次登录后立即修改Admin密码,并创建日常使用的运维账号。
三、示例代码和配置
3.1 完整配置示例
3.1.1 运维大屏Dashboard配置
Zabbix 7.0的Dashboard支持导入导出,以下是一个典型的运维大屏JSON配置:
{
"zabbix_export": {
"version": "7.0",
"template_dashboards": [
{
"name": "NOC运维大屏",
"display_period": "60",
"auto_start": "1",
"pages": [
{
"name": "整体概览",
"widgets": [
{
"type": "problems",
"name": "当前告警",
"x": "0",
"y": "0",
"width": "12",
"height": "5",
"fields": [
{"type": "INTEGER", "name": "severities", "value": "4"},
{"type": "INTEGER", "name": "severities", "value": "5"},
{"type": "INTEGER", "name": "show_lines", "value": "15"}
]
},
{
"type": "systeminfo",
"name": "系统状态",
"x": "12",
"y": "0",
"width": "6",
"height": "3"
},
{
"type": "problemhosts",
"name": "问题主机TOP10",
"x": "18",
"y": "0",
"width": "6",
"height": "5",
"fields": [
{"type": "INTEGER", "name": "show_lines", "value": "10"}
]
},
{
"type": "graph",
"name": "网络流量趋势",
"x": "0",
"y": "5",
"width": "12",
"height": "4"
},
{
"type": "clock",
"name": "当前时间",
"x": "12",
"y": "3",
"width": "3",
"height": "2"
},
{
"type": "triggeroview",
"name": "触发器概览",
"x": "15",
"y": "3",
"width": "9",
"height": "6"
}
]
},
{
"name": "服务器状态",
"widgets": [
{
"type": "dataover",
"name": "CPU使用率TOP",
"x": "0",
"y": "0",
"width": "8",
"height": "5"
},
{
"type": "dataover",
"name": "内存使用率TOP",
"x": "8",
"y": "0",
"width": "8",
"height": "5"
},
{
"type": "dataover",
"name": "磁盘使用率TOP",
"x": "16",
"y": "0",
"width": "8",
"height": "5"
}
]
}
]
}
]
}
}
3.1.2 自定义监控模板
创建Linux服务器深度监控模板,包含业务常用指标:
# 通过Zabbix API创建模板的Python脚本
# 文件: create_linux_template.py
import requests
import json
ZABBIX_URL = "https://zabbix.example.com/api_jsonrpc.php"
ZABBIX_USER = "Admin"
ZABBIX_PASS = "your_password"
class ZabbixAPI:
def __init__(self, url):
self.url = url
self.auth = None
self.headers = {"Content-Type": "application/json-rpc"}
def login(self, user, password):
payload = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {"username": user, "password": password},
"id": 1
}
response = requests.post(self.url, json=payload, headers=self.headers, verify=False)
self.auth = response.json()["result"]
return self.auth
def call(self, method, params):
payload = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"auth": self.auth,
"id": 1
}
response = requests.post(self.url, json=payload, headers=self.headers, verify=False)
return response.json()
def main():
api = ZabbixAPI(ZABBIX_URL)
api.login(ZABBIX_USER, ZABBIX_PASS)
# 创建模板
template_result = api.call("template.create", {
"host": "Template Linux Server Advanced",
"groups": [{"groupid": "1"}], # Templates组
"description": "深度Linux服务器监控模板"
})
template_id = template_result["result"]["templateids"][0]
print(f"Template created with ID: {template_id}")
# 创建监控项
items = [
{
"name": "TCP连接数 - ESTABLISHED",
"key_": "net.tcp.count[established]",
"type": 0, # Zabbix agent
"value_type": 3, # Numeric unsigned
"delay": "60s",
"history": "7d",
"trends": "365d"
},
{
"name": "TCP连接数 - TIME_WAIT",
"key_": "net.tcp.count[time_wait]",
"type": 0,
"value_type": 3,
"delay": "60s",
"history": "7d",
"trends": "365d"
},
{
"name": "系统负载 - 5分钟",
"key_": "system.cpu.load[all,avg5]",
"type": 0,
"value_type": 0, # Numeric float
"delay": "60s",
"history": "7d",
"trends": "365d"
},
{
"name": "进程数",
"key_": "proc.num[]",
"type": 0,
"value_type": 3,
"delay": "60s",
"history": "7d",
"trends": "365d"
}
]
for item in items:
item["hostid"] = template_id
api.call("item.create", item)
print(f"Item created: {item['name']}")
# 创建触发器
triggers = [
{
"description": "TCP TIME_WAIT连接数过高 (>{$TCP_TIMEWAIT_THRESHOLD})",
"expression": f"last(/Template Linux Server Advanced/net.tcp.count[time_wait])>10000",
"priority": 2 # Warning
},
{
"description": "系统负载过高 (5分钟平均 > CPU核心数*2)",
"expression": f"last(/Template Linux Server Advanced/system.cpu.load[all,avg5])>8",
"priority": 3 # Average
},
{
"description": "进程数异常 (>500)",
"expression": f"last(/Template Linux Server Advanced/proc.num[])>500",
"priority": 2
}
]
for trigger in triggers:
api.call("trigger.create", trigger)
print(f"Trigger created: {trigger['description']}")
if __name__ == "__main__":
main()
3.1.3 Agent 2配置示例
/etc/zabbix/zabbix_agent2.conf:
# 基础配置
Server=192.168.1.10
ServerActive=192.168.1.10
Hostname=web-server-01
HostMetadata=Linux web nginx mysql
# 日志配置
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=50
DebugLevel=3
# 性能配置
BufferSize=1000
Timeout=30
# 插件配置(Agent 2特有)
Plugins.SystemRun.LogRemoteCommands=1
# 自定义监控项
UserParameter=nginx.status,/usr/local/bin/nginx_status.sh $1
UserParameter=mysql.status,/usr/local/bin/mysql_status.sh $1
UserParameter=app.healthcheck,curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health
# TLS加密(生产环境必须)
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=web-server-01
TLSPSKFile=/etc/zabbix/zabbix_agent2.psk
生成PSK密钥:
openssl rand -hex 32 > /etc/zabbix/zabbix_agent2.psk
chmod 640 /etc/zabbix/zabbix_agent2.psk
chown root:zabbix /etc/zabbix/zabbix_agent2.psk
cat /etc/zabbix/zabbix_agent2.psk
# 输出类似:a]f5b8c7d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7
3.2 实际应用案例
案例一:多机房统一监控大屏
我们公司有3个机房(北京、上海、广州),需要在NOC中心展示统一监控视图。
架构设计:
┌─────────────────┐
│ NOC监控大屏 │
│ (浏览器全屏) │
└────────┬────────┘
│
┌────────▼────────┐
│ Zabbix Server │
│ (北京机房) │
└────────┬────────┘
┌─────────────────┼─────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Proxy-BJ │ │ Proxy-SH │ │ Proxy-GZ │
│ (北京机房) │ │ (上海机房) │ │ (广州机房) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
[200台服务器] [150台服务器] [100台服务器]
Proxy配置(以上海Proxy为例):
# /etc/zabbix/zabbix_proxy.conf
ProxyMode=0 # 主动模式
Server=192.168.1.10 # 北京Server地址
Hostname=Proxy-SH
ProxyLocalBuffer=24 # 本地缓存24小时
ProxyOfflineBuffer=72 # 离线缓存72小时
DBHost=127.0.0.1
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=ProxyPassword_2025
StartPollers=15
StartDiscoverers=3
CacheSize=128M
大屏配置要点:
- 使用Host Groups按机房分组
- 创建聚合图形显示各机房核心指标
- 配置Dashboard页面自动轮播(60秒/页)
- 使用地理地图组件显示机房位置和状态
案例二:业务系统健康度看板
电商平台需要展示各业务模块的健康状态:
-- 创建业务健康度计算项(在PostgreSQL中)
-- 这是一个辅助视图,用于Dashboard展示
CREATE VIEW v_business_health AS
SELECT
hg.name as business_name,
COUNT(CASE WHEN p.severity >= 4 THEN 1 END) as critical_count,
COUNT(CASE WHEN p.severity = 3 THEN 1 END) as warning_count,
CASE
WHEN COUNT(CASE WHEN p.severity >= 4 THEN 1 END) > 0 THEN 'CRITICAL'
WHEN COUNT(CASE WHEN p.severity = 3 THEN 1 END) > 5 THEN 'WARNING'
ELSE 'OK'
END as health_status
FROM host_groups hg
LEFT JOIN hosts_groups hgh ON hg.groupid = hgh.groupid
LEFT JOIN hosts h ON hgh.hostid = h.hostid
LEFT JOIN problems p ON p.objectid IN (
SELECT triggerid FROM triggers WHERE templateid IN (
SELECT triggerid FROM functions WHERE itemid IN (
SELECT itemid FROM items WHERE hostid = h.hostid
)
)
)
WHERE hg.name LIKE 'Business-%'
GROUP BY hg.name;
Dashboard配置:
- 使用"Data overview"组件显示关键业务指标
- 配置颜色阈值:CPU>80%红色,60-80%黄色
- 使用"Graph"组件显示业务QPS趋势
- 添加"URL"组件嵌入内部系统链接
四、最佳实践和注意事项
4.1 最佳实践
4.1.1 性能优化
数据库层面:
-- TimescaleDB性能优化配置
-- 在postgresql.conf中添加
shared_buffers = 4GB # 总内存的25%
effective_cache_size = 12GB # 总内存的75%
maintenance_work_mem = 1GB
checkpoint_completion_target = 0.9
wal_buffers = 64MB
default_statistics_target = 100
random_page_cost = 1.1 # SSD存储
effective_io_concurrency = 200 # SSD存储
# TimescaleDB特定配置
timescaledb.max_background_workers = 8
历史数据清理策略:
-- 配置数据保留策略(在Zabbix Web界面的Housekeeping设置)
-- 或通过SQL直接配置
-- 历史数据保留7天
UPDATE config SET hk_history_global = 1, hk_history = '7d';
-- 趋势数据保留365天
UPDATE config SET hk_trends_global = 1, hk_trends = '365d';
-- 启用TimescaleDB压缩(数据超过7天自动压缩)
SELECT add_compression_policy('history', INTERVAL '7 days');
SELECT add_compression_policy('history_uint', INTERVAL '7 days');
SELECT add_compression_policy('trends', INTERVAL '7 days');
SELECT add_compression_policy('trends_uint', INTERVAL '7 days');
监控项优化:
| 优化点 |
建议 |
| 采集间隔 |
非关键指标设置为5分钟,关键指标1分钟 |
| 历史保留 |
详细数据7天,趋势数据1年 |
| 预处理 |
使用正则提取减少存储量 |
| 主动/被动 |
大规模场景使用主动模式减少Server压力 |
4.1.2 安全加固
# 1. 禁用默认账户
# 在Web界面将Admin账户禁用,使用独立管理员账户
# 2. 配置API访问控制
# /etc/zabbix/zabbix_server.conf
# 限制可调用API的IP范围(需要通过Nginx实现)
# 3. Agent通信加密
# 所有Agent必须配置PSK或证书加密
# 4. 数据库访问限制
# pg_hba.conf只允许localhost和Zabbix Server访问
用户权限矩阵:
| 角色 |
权限 |
适用人员 |
| Super Admin |
全部权限 |
系统管理员(限2-3人) |
| Admin |
配置管理,无用户管理 |
运维工程师 |
| User |
只读,可确认告警 |
值班人员 |
| Guest |
仅查看Dashboard |
大屏展示 |
4.1.3 高可用配置
Zabbix 7.0原生HA配置:
# 节点1 /etc/zabbix/zabbix_server.conf
HANodeName=zabbix-node-01
NodeAddress=192.168.1.10:10051
# 节点2 /etc/zabbix/zabbix_server.conf
HANodeName=zabbix-node-02
NodeAddress=192.168.1.11:10051
数据库需要独立高可用(PostgreSQL流复制或Patroni集群)。
4.2 注意事项
| 常见错误 |
原因 |
解决方案 |
| Web界面显示"Zabbix server is not running" |
Server未启动或数据库连接失败 |
检查zabbix_server.log,确认数据库配置 |
| Agent连接超时 |
防火墙阻断或Agent未启动 |
检查10050端口,telnet测试连通性 |
| 图形显示"No data" |
时间不同步或监控项配置错误 |
检查NTP,验证item key正确性 |
| Dashboard加载缓慢 |
数据量过大或数据库性能不足 |
优化查询,增加缓存,清理历史数据 |
| Trigger不触发 |
表达式错误或数据未采集 |
使用表达式测试功能,检查item状态 |
| 内存不足OOM |
CacheSize配置过大或监控项过多 |
调整缓存参数,优化监控项数量 |
| Proxy数据积压 |
网络延迟或Server处理能力不足 |
检查Proxy日志,增加Server轮询进程 |
五、故障排查和监控
5.1 故障排查
5.1.1 Server启动失败
# 检查日志
tail -100 /var/log/zabbix/zabbix_server.log
# 常见错误处理
# 错误:cannot connect to database
# 解决:检查数据库服务状态和连接参数
systemctl status postgresql-16
psql -h 127.0.0.1 -U zabbix -d zabbix -c "SELECT 1"
# 错误:cannot allocate shared memory
# 解决:调整内核参数
echo "kernel.shmmax = 68719476736" >> /etc/sysctl.conf
sysctl -p
# 错误:listener failed
# 解决:检查端口占用
ss -tlnp | grep 10051
5.1.2 数据采集异常排查流程
1. 检查Agent状态
→ systemctl status zabbix-agent2
→ tail -f /var/log/zabbix/zabbix_agent2.log
2. 测试Agent连通性(在Server上执行)
→ zabbix_get -s <agent_ip> -k agent.ping
→ zabbix_get -s <agent_ip> -k system.uptime
3. 检查防火墙
→ telnet <agent_ip> 10050
→ firewall-cmd --list-all
4. 验证配置
→ grep -E "^Server|^Hostname" /etc/zabbix/zabbix_agent2.conf
5. 检查Web界面
→ Configuration → Hosts → 查看主机状态图标
→ Monitoring → Latest data → 查看item状态
5.1.3 性能问题诊断
# Server内部统计
zabbix_server -R diaginfo
# 数据库慢查询分析
tail -f /var/lib/pgsql/16/data/log/postgresql-*.log | grep -E "duration: [0-9]{4,}"
# 缓存命中率检查(在Zabbix Web界面)
# Reports → System information → 查看cache hit ratio
# 监控进程状态
ps aux | grep zabbix_server | grep -v grep | wc -l
5.2 性能监控
Zabbix自带的Internal监控模板已经覆盖大部分自监控需求,重点关注以下指标:
关键指标:
- zabbix[wcache,history,used]: 历史数据写缓存使用量
- zabbix[rcache,buffer,pused]: 配置缓存使用百分比
- zabbix[process,poller,avg,busy]: 轮询进程繁忙程度
- zabbix[queue]: 监控队列长度
- zabbix[vmware,buffer,pused]: VMware缓存(如使用)
告警阈值建议:
- 缓存使用率 > 80 %: Warning
- 进程繁忙度 > 75 %: Warning(需增加进程数)
- 队列长度 > 500: 立即处理
5.3 备份与恢复
5.3.1 自动备份脚本
#!/bin/bash
# /opt/scripts/zabbix_backup.sh
BACKUP_DIR="/backup/zabbix"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# 创建备份目录
mkdir -p ${BACKUP_DIR}/{database,config}
# 备份数据库(仅结构和配置数据,不含历史)
pg_dump -h 127.0.0.1 -U zabbix -d zabbix \
--exclude-table-data='history*' \
--exclude-table-data='trends*' \
--exclude-table-data='events*' \
-F c -f ${BACKUP_DIR}/database/zabbix_config_${DATE}.dump
# 备份配置文件
tar -czf ${BACKUP_DIR}/config/zabbix_config_${DATE}.tar.gz \
/etc/zabbix/ \
/usr/lib/zabbix/alertscripts/ \
/usr/lib/zabbix/externalscripts/
# 清理过期备份
find ${BACKUP_DIR} -type f -mtime +${RETENTION_DAYS} -delete
# 记录备份日志
echo "[$(date)] Backup completed: zabbix_config_${DATE}" >> /var/log/zabbix_backup.log
配置定时任务:
# crontab -e
0 2 * * * /opt/scripts/zabbix_backup.sh >> /var/log/zabbix_backup.log 2>&1
5.3.2 恢复流程
# 停止Zabbix Server
systemctl stop zabbix-server
# 恢复数据库
pg_restore -h 127.0.0.1 -U zabbix -d zabbix -c /backup/zabbix/database/zabbix_config_20250108.dump
# 恢复配置文件
tar -xzf /backup/zabbix/config/zabbix_config_20250108.tar.gz -C /
# 启动服务
systemctl start zabbix-server
六、总结
6.1 技术要点回顾
| 阶段 |
关键点 |
| 环境准备 |
TimescaleDB替代MySQL提升大规模部署性能 |
| Server部署 |
根据监控规模调整进程数和缓存参数 |
| 安全配置 |
PSK加密通信,最小权限原则 |
| 大屏构建 |
原生Dashboard已足够,合理利用组件 |
| 性能优化 |
关注缓存命中率和进程繁忙度 |
| 高可用 |
7.0原生HA + 数据库集群 |
6.2 进阶学习方向
- Zabbix API深度开发:自动化主机管理、批量模板导入、告警自愈
- 与CMDB集成:实现资产信息自动同步
- 日志监控集成:结合ELK实现日志告警
- 容器监控:Kubernetes集群监控方案
- AIOps探索:基于历史数据的异常检测
6.3 参考资料
- Zabbix 7.0 官方文档
- TimescaleDB官方文档
- Zabbix中国社区
- PostgreSQL 16官方手册
通过本文的详细步骤,你应该已经掌握了基于Zabbix 7.0 LTS构建企业级监控平台和运维大屏的核心技能。从环境准备、性能调优到可视化大屏配置,每个环节都需要根据实际监控规模进行调整。希望这些来自一线实践的经验能帮助你少走弯路。如果想与更多同行交流运维与 DevOps 经验,欢迎访问云栈社区。
附录
A. 命令速查表
| 操作 |
命令 |
| 启动Server |
systemctl start zabbix-server |
| 查看Server状态 |
systemctl status zabbix-server |
| 查看Server日志 |
tail -f /var/log/zabbix/zabbix_server.log |
| 测试Agent连通性 |
zabbix_get -s <ip> -k agent.ping |
| 获取监控项值 |
zabbix_get -s <ip> -k <key> |
| 清除运行时诊断 |
zabbix_server -R diaginfo |
| 重载配置缓存 |
zabbix_server -R config_cache_reload |
| 检查进程 |
zabbix_server -R ha_status |
| 数据库连接测试 |
psql -h 127.0.0.1 -U zabbix -d zabbix |
B. 配置参数详解
| 参数 |
默认值 |
建议值(500台) |
说明 |
| StartPollers |
5 |
20 |
主动轮询进程数 |
| StartPollersUnreachable |
1 |
5 |
不可达主机轮询进程 |
| StartTrappers |
5 |
10 |
接收主动数据进程 |
| CacheSize |
32M |
256M |
配置缓存大小 |
| HistoryCacheSize |
16M |
128M |
历史写缓存 |
| ValueCacheSize |
8M |
256M |
值缓存大小 |
| Timeout |
3 |
30 |
超时时间(秒) |
C. 术语表
| 术语 |
说明 |
| Host |
被监控的设备或系统 |
| Item |
监控项,数据采集的基本单位 |
| Trigger |
触发器,定义告警条件 |
| Action |
动作,触发后执行的操作 |
| Template |
模板,监控配置的集合 |
| Proxy |
代理,用于分布式监控架构 |
| LLD |
低级别自动发现,动态创建监控项 |
| PSK |
预共享密钥,用于加密通信 |
| NVPS |
每秒新值数,衡量系统吞吐量 |