一、监控系统的功能概述
监控,从中文的字义来看,有两个内容,一是检测,二是控制。重点在第一个字眼,即检测、预防的意思。
监控,对应的英文单词是 Monitoring。在计算机领域,可以将其分为 5 种监控类型:
- 应用性能监控
- 业务交易监控
- 网络性能监控
- 操作系统监控
上面 5 种类型将监控这个概念划分成了多个领域。我们通常所说的监控,都会模糊地包含以上 5 个细分的领域。在任何一个 IT 业务环境中,都会存在各种各样的硬件设备、软件应用等。
按照逻辑层次划分,我们可以将监控行为划分为 5 个层次:基础设施监控、系统层监控、应用层监控、业务监控、端用户体验监控。
- 最底层基础设施监控:这层一般由运维人员负责,涉及到的方面比较接近硬件体系,例如网络,交换机,路由器等低层设备,这些设备的可靠性稳定性就直接影响到上层服务应用的稳定性,所以需要对网络的流量,丢包情况、错包情况,连接数等等这些基础设施的核心指标进行监控。
- 系统层监控:这层涵盖了物理机、虚拟机、操作系统等,这些都是属于系统级别监控的方面,主要对几个核心指标进行监控,如 cpu 使用率、内存占用率,磁盘 IO 和网络带宽情况。
- 应用层监控:这层涉及到方面和服务紧密相关,例如对 url 访问的性能,访问的调用数,访问的延迟,还有对服务提供性能进行监控,服务的错误率等,同时对 sql 也需要进行监控,查看是否有慢 sql。对于 cache 来说,需要监控缓存的命中率和性能,每个服务的响应时间等等。
- 业务监控:业务监控具体指什么?举个例子,比如说一个典型的交易网站,需要关注它的用户登录情况、注册情况、下单情况、支付情况等等,这些直接影响到实际触发的业务交易情况,这层监控可以提供给运营和公司高管们,提供他们需要关注的数据,直接以数据支撑公司在战略层面的决策和方向。
- 端用户体验监控:一个应用程序可能通过 app、h5、pc 端的方式交付到用户的手上,用户通过浏览器,客户端打开连到我们的服务,那么在用户端,用户的体验是怎么样?用户端的性能是怎么样?以及有没有产生错误等等... 这些信息都需要进行监控并记录下来,如果没有监控,有可能因为某些 BUG 或者性能问题,造成用户体验非常差,而我们并没有感知。其中包括监控用户端的使用性能、返回码,在哪些城市地区,他们的使用情况是怎么样,还有运营商的情况,包括三大运营商不同用户的连接情况。我们需要进一步知道,是否有哪些渠道哪些用户接入的时候存在着问题,我们还需要知道客户端使用的操作系统浏览器的版本。
二、监控系统的实现原理
1. 模块组成
一个监控系统的组成大体可以分为两部分:数据采集部分和数据存储、分析告警、展示部分,这两部分构成了监控系统的基本模型。
2. 采集协议
按照支持的协议方式,监控 IT 数据采集可以分为两种:专用客户端采集和公用协议采集。
- 私有协议:专有客户端
- 公有协议:SNMP、IPMI、SSH、Telnet
3. 监控模式
监控系统数据采集的工作模式可以分为被动模式和主动模式。
- 被动模式指的是服务器端到客户端采集数据;
- 主动模式是客户端主动上报数据到服务器。
一般来说被动模式对监控端服务器的开销较大,适合小规模的监控环境;主动模式对监控端服务器的开销较小,适合大规模的监控环境。
4. 代理架构
对于大规模的监控环境,被监控节点比较多,并且监控类型也很多,监控产生的数据和网络连接开销非常大,数据采集方式除了使用主动模式之外,还需要使用代理的架构,通过代理架构分摊服务器端的性能开销。另外,代理架构还支持跨地域、跨网络的分布式监控。常见的代理架构为 C/S/P 架构,即 Client/Proxy/Server。
三、监控系统的开源产品
-
zabbix:Zabbix 是一款出色的企业级运维监控平台,可用于监控从服务器、网络设备到 Web 应用程序和数据库的性能和可用性的一切;它可以安装在 Linux、AIX、Windows、Solaris、Macos X、FreeBSD、OpenBSD 等系统上使用,具有非常良好的适配能力。
-
Prometheus+Grafana:Prometheus 是一个开源系统监控和警报工具包,主要用于对基础设施的监控,包括服务器(CPU、MEM 等)、数据库(MYSQL、PostgreSQL 等)、Web 服务等,几乎所有东西都可以通过 Prometheus 进行监控。
-
Cacti:Cacti 是一款网络流量监测图形分析工具,它连接到 RRDToo1,生成与网络数据相关的图表,具有非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host 以及任何一张图,还可以与 LDAP 结合进行用户验证,同时也能自己增加模板。
-
Nagios:Nagios 是一个监控系统运行状态和网络信息的监控系统,它可以监控所指定的本地或远程主机以及服务,同时提供异常通知功能等;能够监控几乎所有类型的组件,如网络协议、操作系统、系统指标、应用程序、服务、Web 服务器、网站、中间件等。
-
Checkmk:Checkmk 是一个高可扩展的监控工具可整图服务器、网络、资产、数据库、容器、物联网等,它有两种模式可用,基础版完全开源并提供免费和无限制的监控,企业版附带附加功能。Checkmk 具有部署快、高度自动化、配置灵活的特点。
-
OpenNMS:OpenNMS 是一个企业级基于 Java/XML 的分布式网络和系统监控管理平台。它能够显示网络中各种终端和服务器的状态和配置,为管理网络提供有效的信息。它专为 Linux 设计,但也支持 Windows、Solaris 和 OSX。OpenNMS 可以使用 JMX、WMI、SNMP、NRPE、XML HTTP、JDBC、XML、SON 等收集系统指标。
-
Netdata:Netdata 是一款 Linux 性能实时监测工具,它可以为 Linux 系统、应用程序、SNMP 服务等提供实时的性能监测,目前在物理系统、虚拟机、容器和物联网 / 边缘设备上运行。Netdata 具有监控指标多而广,数据收集速度快等特点,可以同时并发监控数万个指标,交互式可视化和富有洞察力的健康警报,可以即时诊断基础架构中的异常情况。
-
LibreNMS:LibreNMS 是一个开源、功能丰富且强大的网络监控系统,易于安装和配置,可以在多种平台上使用;它提供了广泛的功能,包括对各种协议的支持、性能监控、警报等;支持广泛的供应商、设备和协议,包括 Cisco、Linux、windows、HP、Juniper、Dell、FreeBSD、Brocade、Citrix、F5 Networks 等;还可以根据接口进行接口分组,使用 SNMP、CDP、ARP、FDP、OSPF、LLDP、BGP 自动发现整个网络。
四、Zabbix 系统概述
1. 初识 zabbix
Zabbix 是一种企业级的分布式开源监控系统的解决方案,Zabbix 是一个基于 Web 界面的提供分布式系统监控,以及网络监控功能的企业级开源解决方案。
Zabbix 由 AlexeiVladishev 创建,目前由 ZabbixSIA 主导开发和支持。
Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完整性的软件。Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,以实现对服务器问题做出快速反应。Zabbix 基于存储的数据提供出色的报告和数据可视化功能。这使得 Zabbix 成为容量规划的理想选择。
Zabbix 支持轮询和 trapping。所有 Zabbix 报告和统计数据以及配置参数都可以通过基于 Web 的前端访问。基于 Web 的前端确保可以从任何位置评估您的网络状态和服务器的健康状况。如果配置得当,不管对于拥有少量服务器的小型组织还是拥有大量服务器的大公司来讲,Zabbix 都可以在监控 IT 基础设施方面发挥重要作用。
Zabbix 是免费的。Zabbix 是在 GPL 通用公共许可证第 2 版下编写和分发的。这意味着它的源代码是免费分发的,可供公众使用。
2. Zabbix 的功能特性
- 数据收集
- 可用性及性能检测;
- 支持 SNMP(trapping 及 polling)、IPM、MX 监控;
- 自定义检测;
- 自定义间隔收集收据;
- 三种角色:Server、Proxy、Agent。
- 灵活的阈值定义:允许灵活地自定义问题阀值,在 zabbix 中称为触发器(trigger),存储在后端数据库中。
- 高级告警配置
- 可以自定义告警升级(escalation)、接收者及告警方式;
- 告警信息可以配置,并允许使用宏(macro)变量;
- 通过远程命令实行自动化动作(action)。
- 实时绘图:通过内置的绘图方法实现监控数据实时绘图。
- 扩展的图形化显示
- 允许自定义创建多监控项视图;
- 生成网络拓扑(network maps);
- 自定义的面板(screen)和 slide shows,并允许在 dashboard 页面显示;
- 生成监控报告。
- 历史数据存储
- 数据存储在数据库中;
- 历史数据可配置;
- 内置数据清理机制。
- 配置简单
- 一次配置,终生监控,除非调整或删除;
- 允许使用模板添加监控设备。
- 模板使用
- 模板中可以添加组监控;
- 模板允许继承。
- 网络自动发现
- 自动发现网络设备;
- Agent 自动注册;
- 自动发现文件系统、网卡设备、SNMP OID 等。
- 快速的 Web 接口
- Web 前端采用 PHP 编写;
- 访问无障碍。
- Zabbix API:Zabbix API 提供程序级别的访问接口,第三方程序可以很快接入。
- 权限系统
- 安全的权限认证;
- 用户可以限制允许维护的列表。
- 全特性、Agent 易扩展
- 在监控目标上部署;
- 支持 Linux 及 Windows。
- 二进制守护进程
- C 语言开发,高性能,低内存消耗;
- 易移植。
- 具备应对复杂环境情况:通过 Zabbix Proxy 可以非常容易的创建远程监控。
3. Zabbix 角色及架构
- Zabbix Server:zabbix_server 是 Zabbix 服务端守护进程。Zabbix Agentd、Zabbix Proxy 的数据最终都是提交到 Server。当然,并不是所有数据都主动提交给 Zabbix Server,也有的是 Server 主动获取数据。
- zabbix Agent:zabbix_agentd 是客户端守护进程,此进程主要用于收集客户端数据,例如 CPU 负载、内存、硬盘使用情况等。
- zabbix Proxy:zabbix_proxy 是 Zabbix 代理守护进程,功能类似 Server。不同的是,zabbix_proxy 只是一个中转站,它需要把收集到的数据提交 / 被提交到 Server。
- zabbix_Web:zabbix 的 web 界面,管理员通过 web 界面管理 zabbix 配置以及查看 zabbix 相关监控信息,通常与 zabbix_server 运行在同一台主机上,也可以单独部署在独立的服务器上。
五、部署流程
1. 资源清单
操作系统 | 配置 | 主机名 | IP | 角色 |
---|---|---|---|---|
openEuler 24.03 | 2C4G | zabbix | 192.168.207.137 | Zabbix 服务端 |
openEuler 24.03 | 2C4G | proxy | 192.168.207.138 | Zabbix proxy |
openEuler 24.03 | 2C4G | server01 | 192.168.207.139 | 被监控节点 |
openEuler 24.03 | 2C4G | server02 | 192.168.207.140 | 被监控节点 |
2. 基础环境
-
关闭防火墙
[root@localhost~]#systemctl stop firewalld
[root@localhost ~]#systemctl disable firewalld -
关闭 Selinux
[root@localhost ~]#setenforce0
-
时间同步
[rootelocalhost ~]#timedatectl set-timezone Asia/Shanghai
[root@localhost~]#chronyc sources -v -
修改主机名
[root@localhost ~]#hostnamectl set-hostname zabbix
[root@localhost~]#hostnamectl set-hostname proxy
[root@localhost~]#hostnamectl set-hostname server01
[root@localhost~]#hostnamectl set-hostname server02
3. 部署 zabbix server
-
添加 zabbix 源
[root@zabbix~]#rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-latest-6.4.el9.noarch.rpm
[root@zabbix ~]#dnf clean all -
安装软件包
[root@zabbix ~]#dnf-y install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent
[root@zabbix ~]#dnf-y install mysql-server-8.0.41 mysql
[root@zabbix ~]#dnf-y install https://w.rpmfind.net/linux/centos-stream/9-stream/AppStream/x86_64/os/Packages/net-snmp-libs-5.9.1-17.el9.x86_64.rpm
备注:zabbix6.4.8 需要的各个平台软件的版本如下:mysql 的版本要求 8.0.30-8.1.X,mariadb 的版本要求 10.5.00-11.1.X,nginx 的版本要求 1.20or Later,php 的版本要求 7.4.0-8.2.X。
-
配置数据库
[root@zabbix ~]#systemctl enable mysqld--now
[root@zabbix ~]# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.41 Source distribution
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
#执行以下SQL语句
ALTER USER 'root'@'localhost' IDENTIFED BY '123456';
FLUSH PRIVILEGES;
create database zabbix character set utf8mb4 collate utf8mb4_bin;
create user zabbix@localhost identified by 'zabbix';
grant all privileges on zabbix.*to zabbix@localhost;
create database zabbix_proxy character set utf8mb4 collate utf8mb4_bin;
create user zabbix@localhost identified by 'zabbix';
create user zabbix@'%'identified by 'zabbix';
grant all privileges on zabbix_proxy.*to zabbix@localhost;
grant all privileges on zabbix_proxy.*to zabbix@'%';
set global log_bin_trust_function_creators=1;
quit; -
导入数据
[root@zabbix ~]#zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz|mysql--default-character-set=utf8mb4 -uzabbix -p zabbix
[root@zabbix ~]##mysql -uroot -p
mysql>set global log_bin_trust_function_creators= 0;
mysql>quit; -
配置 zabbix server :修改 /etc/zabbix/zabbix_server.conf 文件,大约在 129 行左右,取消注释修改密码
DBPassword=zabbix
-
配置 zabbix 页面 :修改 /etc/nginx/conf.d/zabbix.conf 文件,注意取消注释
listen 8080;server_name
-
启动服务
systemctl restart zabbix-server zabbix-agent nginx php-fpm
systemctl enable zabbix-server zabbix-agent nginx php- fpm
4: zabbix 页面配置
- 登录 zabbix :http://192.168.207.137:8080/
- 设置语言:进入 Zabbix 页面后进行语言设置
- 检查环境:进行必要条件的检查
- 配置数据库连接:在对应页面完成数据库连接配置
- 主机名设置:保持默认即可
- 安装前汇总:检查配置参数,确认无误后点击下一步7
- 完成安装:提示 Zabbix 前端配置完成
- 登录:默认账号为 Admin,默认密码为 zabbix
5: 部署 proxy
-
添加 zabbix 源
[root@proxy~]#rpm-Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-latest-6.4.el9.noarch.rpm
[root@zabbix ~]#dnf clean all -
安装软件包
[root@proxy ~]#dnf-y install zabbix-proxy-mysql zabbix-sql-scripts zabbix-selinux-policy mysql
[root@proxy~]#dnf-y install https://www.rpmfind.net/linux/centos-stream/9-stream/AppStream/x86_64/os/Packages/net-snmp-libs-5.9.1-17.el9.x86_64.rpm -
导入数据
-
zabbix server 节点执行:
[root@zabbix ~]##mysql -uroot -p
mysql> set global log_bin_trust_function_creators =1;
mysql> quit; -
proxy 节点执行(IP 地址修改为 zabbix server 的 IP):
root@proxy/usr/share/zabbix-sql-scripts/mysql/proxy.sql | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix_proxy -h 192.168.207.137
-
zabbix server 节点执行:
[root@zabbix ~]# mysql -uroot -p
mysql>set global log_bin_trust_function_creators= 0;
mysql> quit;
-
-
配置 zabbix proxy:修改 /etc/zabbix/zabbix_proxy.conf 文件,大约 32 行修改为 zabbix server 节点的 IP(Server=192.168.207.137),大约 157 行取消注释修改为 zabbix server 节点的 IP(DBHost=192.168.207.137),大约 194 行取消注释为数据库的密码(DBPassword=zabbix)161718
-
启动服务
plaintext
systemctl start zabbix-proxy systemctl enable zabbix-proxy
-
web 页面添加 proxy:管理→Proxy→创建 agent 代理,选择主动式(默认)212223
6: 部署 Agent
-
添加 zabbix 源
[root@server01~]#rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-latest-6.4.el9.noarch.rpm [root@server01~]#dnf clean all
-
安装软件包:[root@server01 ~]#dnf-y install zabbix-agent
-
配置 agent:修改 /etc/zabbix/zabbix_agentd.conf 文件,约 11 行配置上报给 server 的 IP(Server=192.168.207.137),约 171 行配置 ServerActive(与 Server 行配置一致,即 192.168.207.137),约 182 行配置 Hostname(如 server01,需与将来在 Server 端 Web 页面上的主机名称一致)28293031
-
启动服务
systemctl start zabbix-agent systemctl enable zabbix-agent
-
添加主机
- 直接添加主机:数据采集→主机→创建主机,主机名称需和 Agent 服务配置文件中的 Hostname 保持一致,选择模板(可使用自带模板或自定义),选择主机群组(可选择已有或创建新群组),添加 Agent 节点接口(填写被监控节点的 IP)37383940
- 通过 proxy 上报:整体与直接添加主机类似,多了由 Proxy 代理程序监测的步骤,选择之前创建的 proxy 即可444546
扩展:解决图像字体显示问题
-
查找 zabbix 定义字体的 php 文件:[root@zabbix ~]#find /-name defines.inc.php,结果为 /usr/share/zabbix/include/defines.inc.php47484950
-
查看 zabbix 字体文件中用的字体 :
[root@zabbix~]#grep"ZBX_-FONTPATH"/usr/share/zabbix/include/defines.inc.php define('ZBX_FONTPATH', realpath('assets/fonts"));//where to search for font(GD>2.0.18) [root@zabbix~]#grep "ZBX_GRAPH_FONTAME"/usr/share/zabbix/include/defines.inc.php define('ZBX_ GRAPH_FONT_NAME','graphfont');//fontfile name
-
查找 zabbix 的字体文件位置:[root@zabbix ~]#find /-name graphfont.ttf,结果为 /usr/share/zabbix/assets/fonts/graphfont.ttf5253
-
替换字体 :上传 msyh1.ttc 文件到 /usr/share/zabbix/assets/fonts 目录,然后执行
[root@zabbix ~]#cd /usr/share/zabbix/assets/fonts [root@zabbix fonts]#1s graphfont.ttf msyh1.ttc [root@zabbix fonts]# In -snf msyh1.ttc graphfont.ttf
并备注:-S 表示创建软连接,-f 表示强行删除任何已存在的目标文件,-n 表示把符号连接的目的目录视为一般文件,最后刷新页面观察效果