Zabbix分布式监控实战指南

Zabbix分布式监控实战指南,涵盖特性、架构、工作流程及部署配置,助你快速上手服务器监控。

原文标题:分布式开源监控Zabbix实战

原文作者:牧羊人的方向

冷月清谈:

本文介绍了开源监控软件Zabbix的特性、架构、工作流程以及安装部署实战。Zabbix作为一个成熟的监控方案,支持多种数据采集方式、自定义告警、丰富的数据可视化以及高可用性和扩展性。文章首先概述了Zabbix的功能特性,包括灵活的数据采集、自定义告警、可视化展示以及高可用架构等。然后详细解释了Zabbix的架构原理,包括Server、Proxy、Agent和数据库等组件,以及Zabbix的主要工作进程和数据采集模式(主动轮询和主动捕捉)。 接着,文章对比了Zabbix和Prometheus两种监控工具,指出Prometheus更适用于云原生和容器监控,而Zabbix在传统服务器监控方面更有优势。最后,文章以Server-Client架构为例,详细讲解了Zabbix 5.0版本的安装部署过程,包括服务器端、Web端和Agent端的配置,并演示了如何在Zabbix监控页面添加主机和自定义拓扑图。

怜星夜思:

1、除了文中提到的 Server-Client 和 Server-Proxy-Client 架构,实际应用中还有哪些 Zabbix 部署架构?各自的优缺点是什么?
2、Zabbix 和 Prometheus 各自适用于哪些监控场景?如何选择合适的监控工具?
3、如何利用 Zabbix 实现自动化监控和告警?有哪些最佳实践?

原文内容

Zabbix作为一个分布式开源监控软件,在传统的监控领域有着先天的优势,具备灵活的数据采集、自定义的告警策略、丰富的图表展示以及高可用性和扩展性。本文简要介绍Zabbix的特性、整体架构和工作流程,以及安装部署的过程,并结合实战进行监控配置。

1、Zabbix介绍

Zabbix是一个企业级的分布式开源监控方案,能够监控各种网络参数以及服务器健康性和完整性。它由Alexei Vladishev创建,目前由Zabbix SIA在持续开发和支持。Zabbix基于Web页面,提供分布式系统监控及网络监控功能,提供多种监控方式,支持在复杂系统架构下的全栈监控

1.1 Zabbix特性

1)监控数据采集的灵活性

Zabbix支持多种数据采集方式,包括自动发现、agent、snmp、JMX、telnet采集方式和主动、被动模式下的数据传输。同时,它还支持用户自定义插件和自定义间隔数据收集。
  • 采集数据源的广泛性:从基础设施、数据库、应用程序、传感器等终端采集数据

  • 数据采集的灵活性:数据采集的间隔、策略,采集数据的类型包括文本、二进制以及结构化JSON、CSV等数据格式

  • 支持代理和无代理监控:利用Zabbix Agent代理进行深度监控;无代理监控支持SNMP、IPMI、ODBC和Prometheus等监控协议

  • 支持采集数据的规范化和转换:对采集数据进行格式转换、验证数据的准确性等

2)告警信息自定义配置

Zabbix可以设置告警信息的周期、级别、恢复通知、时段阈值等,支持维护周期和单机停用。同时支持多条件告警、告警信息推送等。
  • 根据传入的数据流进行异常检测和趋势预测,自定义告警级别和分类

  • 将告警信息推送到不同的平台,支持告警平台、邮箱和通信平台等

  • 故障告警自动修复功能,针对部分场景实现故障自愈功能,如自动重启、自动伸缩资源

3)数据可视化展示

Zabbix可以自定义监控视图、网络拓扑、自定义面板和IT服务时间与可用性。
  • 支持采集数据的个性化展示,实现拖拽缩放、仪表盘、各种图表等功能

  • 支持地理环境和基础设施拓扑展示,展示整个集群的整体情况

  • 生成定制化报表定时发送

4)架构高可用性和扩展性

Zabbix的监控系统对设备的性能要求较低,支持proxy分布式监控、分布式集中管理、自动化监控和开放式接口,扩展性较强。
  • Zabbix高可用部署架构防止数据丢失,并且提高前端用户体验

  • 通过部署Zabbix Proxy支持分布式监控,支持无限的可扩展性

5)安全审计策略保证

Zabbix支持安全用户审计日志、权限认证和用户限制允许维护的列表。
  • Zabbix组件之间的通信通过加密传输,支持不同的加密算法

  • 用户权限定义不同的级别、用户分为不同的角色进行管理

  • 限制采集数据的敏感信息访问等

除了以上特性,Zabbix支持在本地或云平台快速部署和配置、无缝对接不同的软硬件平台、多租户管理等特性。

1.2 Zabbix监控采集方式
Zabbix支持监控各种系统平台,包括Linux和Windows等主流操作系统,也可以借助SNMP或者SSH协议监控路由交换设备。
  • 硬件监控:Zabbix IPMI Interface,通过IPMI接口进行监控,监控被监控对象的物理特征,比如电压、温度、风扇状态、电源状态等。

  • 系统监控:Zabbix Agent Interface,通过专用的代理程序进行监控,易于部署、性能消耗低,推荐首选监控方式。

  • Java监控:Zabbix JMX Interface ,通过JMX(java management extensions)java管理扩展)监控JVM虚拟机。

  • 网络设备监控:Zabbix SNMP Interface,通过SNMP协议与被监控对象进行通信,用于监控路由器、交换机这种网络设备。

  • 应用服务监控:Zabbix Agent UserParameter

  • MySQL数据库监控:percona-monitoring-plulgins

  • URL监控:Zabbix Web监控

1.3 Zabbix和Prometheus监控对比

Prometheus也是时下较为流行的分布式监控工具,Zabbix和其对比,如下表所示:

名称 发布时间 开发语言 性能 社区支持 容器支持 企业使用 部署难度
Zabbix 2012 C+PHP 上限约1w节点 活跃 较差 传统监控如服务器监控上优势明显 多系统不同监控部署方式
Prometheus 2016 Go 以万为单位 活跃 支持云原生、K8S等监控 容器相关监控首选 简单,一条命令搞定

相比较而言,Prometheus对容器监控支持能力更为强大,是云原生和K8S等容器相关监控的首选解决方案;Zabbix作为传统的监控方式,系统稳定成熟度高,对服务器等基础设施监控上具有优势,缺点是随着架构复杂度增加,定制化的难度也更大了。

2、Zabbix架构原理
2.1 Zabbix整体架构

Zabbix的架构分为服务端、Proxy层和客户端部分,主要包括以下部分:
  • Zabbix Server:核心组件,负责收集和接收来自被监控设备的数据,并与Zabbix Agents、Zabbix proxy和Zabbix Database进行通信。

  • Zabbix Database:用于存储Zabbix的数据。

  • Zabbix Agents:安装在被监控服务器上,负责收集本地数据,并将其发送到Zabbix Server。

  • Zabbix Proxy:可选组件,常用于监控节点很多的分布式环境中,代理Server收集部分数据转发到Server,可以减轻Server的压力。

  • Zabbix GUI:Zabbix的Web前端管理界面,用户通过Web前端页面可以查看Zabbix Server收集的数据,也可以对Zabbix Server进行配置。

2.2 Zabbix主要工作进程
在Zabbix中,有以下几个主要的进程:
  • zabbix_agentd:Zabbix客户端守护进程,主要负责收集客户端监控项数据。

  • zabbix_server:Zabbix服务端守护进程,主要负责收集Zabbix客户端数据。

  • zabbix_proxy:Zabbix代理进程,其功能类似于Server,作用上类似与一个中转站,最终会把收集到的数据再次提交给zabbix_server。

  • zabbix_get:一个Zabbix工具,通常运行在zabbix server或者是zabbix proxy上,用于远程获取客户端信息,通常用于排错。

  • zabbix_sender:一个Zabbix工具,通常运行在zabbix客户端,用于耗时比较长的的检查,其作用是主动发送数据

  • zabbix_java_gateway:Zabbix2.0之后引入的新功能,可以用于JAVA的设备,但是其只能主动获取数据,而不能被动获取数据。

此外,还有报警器(alerter)、配置同步器(configuration syncer)、数据发送器(data sender)、数据库watchdog等进程。不同的进程在Zabbix系统中担任不同的角色和任务,可以根据需要灵活配置和扩展。

2.3 Zabbix工作流程
Zabbix通过客户端定期收集监控设备上的数据,并将其发送给zabbix服务端;zabbix服务端将zabbix客户端发送的数据存储的数据库中,zabbix web根据数据在前端进行展示和绘图。Zabbix的数据采集模式主要包括两种:
  • Poller模式(主动轮询):Zabbix Server会主动轮询Zabbix Agent或Zabbix Proxy,获取监控数据。这种方式的好处是可以主动获取数据,数据采集的及时性相对较高,但是缺点是在大量服务器的环境中,Zabbix Server不能及时获取最新的数据。

  • Trapper模式(主动捕捉):Zabbix Agent或Zabbix Proxy主动向Zabbix Server发送数据,这种方式可以在Zabbix Server不主动轮询的情况下获取实时的监控数据,但是缺点是需要在被监控服务器上安装Agent或Proxy,增加了运维成本。

2.4 Zabbix监控框架
Zabbix的部署架构可以根据实际监控环境的需求进行选择和配置,主要有以下三种常见架构:
  • Server-Client架构:最简单的架构,监控设备和被监控设备之间直接相连,Zabbix Server和Zabbix Agent之间直接进行数据交互。适用于网络比较简单,设备比较少的监控环境。

  • Server-Proxy-Client架构:其中Proxy是Server、Client之间沟通的一个桥梁,Proxy本身不存放数据,只是将Agent发来的数据暂时存放,然后再提交给Server。这种架构经常和Master-Node-Client架构做比较,一般适用于跨机房、跨网络的中型网络架构的监控。

  • Master-Node-Client架构:最复杂的监控架构,适用于跨网络、跨机房、设备较多的大型环境。每个Node同时也是一个Server端,Node下面可以接Proxy,也可以直接接Client。

3、Zabbix部署实战
3.1 Zabbix源码安装及部署
3.1.1 部署架构

本次安装部署采用Server-client部署架构,如图所示Server端直接连到代理端。

3.1.2 安装Server端

由于Zabbix 6.0以上版本在Centos 7上不支持Server部署,本次以Zabbix 5.0版本测试。

1)系统环境配置

#1、关闭selinux
动态生效setenforce 0
配置/etc/selinux/configSELINUX=设置为disabled

#2、关闭防火墙
关闭防火墙# systemctl stop firewalld
#systemctl disable firewalld

#3、准备mysql环境

2)下载安装包仓库

rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
Retrieving https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.eaB8GC: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:zabbix-release-5.0-1.el7 ################################# [100%]

此时/etc/yum.repos.d/下会有一个zabbix.repo文件

3)安装Server端、mysql数据库和Web前端

#yum install zabbix-server-mysql zabbix-agent -y
Resolving Dependencies
--> Running transaction check
---> Package zabbix-agent.x86_64 0:5.0.36-1.el7 will be installed
---> Package zabbix-server-mysql.x86_64 0:5.0.36-1.el7 will be installed

Installed:
zabbix-agent.x86_64 0:5.0.36-1.el7 zabbix-server-mysql.x86_64 0:5.0.36-1.el7
Dependency Installed:
OpenIPMI.x86_64 0:2.0.27-1.el7 OpenIPMI-libs.x86_64 0:2.0.27-1.el7 OpenIPMI-modalias.x86_64 0:2.0.27-1.el7 fping.x86_64 0:3.16-1.el7
libevent.x86_64 0:2.0.21-4.el7 net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2 unixODBC.x86_64 0:2.3.1-14.el7
Complete!

4)安装前端软件包

# yum install centos-release-scl -y
#编辑zabbix.repo
[zabbix-frontend]
...
enabled=1
...
#安装前端软件包
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl -y

5)初始化数据库配置

#1、在mysql数据库中创建数据库用户并授权
# mysql -uroot -p -A
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user 'zabbix'@'%' identified with mysql_native_password by 'password';
mysql> grant all privileges on zabbix.* to 'zabbix'@'%';
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;

#2、导入初始架构和数据
# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

6)为Zabbix server配置数据库

#编辑配置文件/etc/zabbix/zabbix_server.conf
DBPassword=password

7)为Zabbix配置正确的时区

#编辑配置文件/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
php_value[date.timezone] = Asia/Shanghai #亚洲/上海

8)启动Zabbix服务并查看

#启动Zabbix serveragent进程,并为它们设置开机自启:
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm

查看zabbix服务启动情况

# netstat -nltp |grep zabbix
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1028/zabbix_agentd
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 1623/zabbix_server
tcp6 0 0 :::10050 :::* LISTEN 1028/zabbix_agentd
tcp6 0 0 :::10051 :::* LISTEN 1623/zabbix_server

9)异常处理

#1连接数据库失败,指定的socket有误
#错误信息:connection to database 'zabbix' failed: [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
#解决办法:由于mysql配置的socketzabbix默认的socket路径不同,修改zabbix配置文件/etc/zabbix/zabbix_server.conf中的DBSocket选项
DBSocket=/tmp/mysql.sock

#2连接数据库失败,提示加密插件caching_sha2_password.so找不到
#错误信息:cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
#解决办法:在创建用户时指定mysql的加密插件with mysql_native_password
create user 'zabbix'@'%' identified with mysql_native_password by 'password';
3.1.3 配置Web端页面

1)登录Web访问页面http://192.168.112.121/zabbix

2)配置数据库连接

3)输入服务器详细信息

4)完成安装

5)Web界面登录,默认用户是Admin、密码是zabbix

6)修改界面语言为中文

3.1.4 被监控对象安装Agent代理

1)系统环境配置

#1、关闭selinux
动态生效setenforce 0
配置/etc/selinux/configSELINUX=设置为disabled

#2、关闭防火墙
关闭防火墙# systemctl stop firewalld
#systemctl disable firewalld

2)下载Agent安装包仓库

rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rp

3)安装zabbix-agent

# yum install zabbix-agent -y

4)修改agent配置文件,指定zabbix server地址

# vi /etc/zabbix/zabbix_agentd.conf
Server=192.168.112.121

5)启动服务并设置开机启动

systemctl start zabbix-agent
systemctl enable zabbix-agent

6)检查zabbix-agent端口状态

# netstat -nltp |grep zabbix
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1814/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 1814/zabbix_agentd
3.2 Zabbix监控页面配置
3.2.1 添加主机

“配置->主机”中添加需要监控的主机,并选择监控模板指标

添加完成后,看到主机信息

在监测->主机中,能看到监控数据。同时在仪表盘中能看到当前主机的数量

3.2.2 自定义拓扑图

“监测->拓扑图”中编辑拓扑图信息,比如添加服务器节点、建立链接关系、网络流量等

链接信息中填上标签“{Zabbix server:net.if.out["ens33"].last(0)}”,可以在“主机->配置->监控项”中获得监控信息。

以上是分布式监控Zabbix的特性介绍、架构流程介绍以及安装部署实战,Zabbix功能相当丰富,需要在实际使用过程中再琢磨熟悉。

参考资料:

  1. https://www.zabbix.com/cn/

  2. https://blog.51cto.com/u_16099217/6370557

  3. https://blog.csdn.net/SmileLife_/article/details/126535575

关于 Zabbix 自动化监控和告警,我建议可以利用 Zabbix 的自动发现功能,自动添加新主机到监控系统,并应用相应的模板,从而减少手动配置的工作量。 对于告警,可以根据不同的严重程度设置不同的告警级别,并配置相应的处理流程,例如自动重启服务、自动扩容等,从而提高故障处理效率。

关于“Zabbix 和 Prometheus 各自适用于哪些监控场景?如何选择合适的监控工具?”这个问题,我觉得如果你的基础设施比较传统,比如大量的物理机、虚拟机,而且需要一个功能完善、开箱即用的监控系统,那么 Zabbix 是个不错的选择。它部署简单,上手也比较快。但如果你的环境是云原生、容器化的,或者需要更灵活的自定义监控指标,那么 Prometheus 可能更合适。它更适合动态变化的环境,而且可以和 Kubernetes 等平台无缝集成。

关于部署架构,我还想到一种:分布式 Zabbix Server with 分布式 Zabbix Proxy 架构。这种架构下,多个 Zabbix Server 和多个 Zabbix Proxy 分布在不同的地理位置或网络区域,可以实现更精细化的监控和管理。优点是扩展性强,适用于大规模分布式环境;缺点是部署和维护更加复杂,需要仔细规划和配置。

关于最佳实践,首先,要做好监控项的规划和设计,避免采集过多的无用数据,造成资源浪费。 其次,要设置合理的告警阈值,避免误报和漏报。 最后,要定期 review 和优化监控配置,确保监控系统的有效性和稳定性。

对于第二个问题,我想补充一点,如果你的团队对 Go 语言比较熟悉,或者本身就在使用 Kubernetes,那么选择 Prometheus 会更容易上手和维护,因为它本身就是用 Go 写的,而且与 Kubernetes 生态结合得很好。但是如果你对 Zabbix 比较熟悉,而且现有的监控系统已经基于 Zabbix 构建了,那么迁移到 Prometheus 的成本可能会比较高,需要慎重考虑。

对于如何利用 Zabbix 实现自动化监控和告警,我想到的是结合自动化配置工具,例如 Ansible、Puppet 等,可以自动化部署 Zabbix Agent,并配置监控项和触发器,从而实现大规模环境的自动化监控。 另外,可以自定义脚本或使用 Zabbix API 实现更复杂的监控逻辑,例如监控业务指标、应用程序性能等,并将告警信息推送到邮件、短信、钉钉等平台。

补充一下,Zabbix 其实还支持一种混合架构,就是 Server-Client、Server-Proxy-Client、Server 集群等架构的组合,根据实际情况灵活搭配,以满足不同的监控需求。这种混合架构的优点是灵活性高,可以根据具体情况进行定制;缺点是设计和实施的难度较大,需要对 Zabbix 的架构和功能有深入的了解。

针对第一个问题,其实还可以根据实际需求,比如大型、分布式环境,可以采用 Zabbix Server 集群架构,多个 Zabbix Server 组成集群,共同承担监控任务,提高了系统的可用性和容错能力。优点是高可用和负载均衡,缺点是配置和维护比较复杂。

关于监控工具的选择,我认为除了技术因素外,还要考虑团队的技术栈、运维成本、社区支持等非技术因素。比如,如果你的团队对某种工具比较熟悉,那么使用该工具的学习成本和运维成本都会更低。另外,活跃的社区也能提供更及时的帮助和支持,这也是一个重要的考虑因素。