本文深入浅出,切近实际运维应用,由 zabbix 3.4 版本入手,学习 zabbix 监控告警实现方式,由 zabbix 5.0 浅出实现快速部署、快速应用。本人从业多年,关注 zabbix 开源社区,以及 zabbix 官方组织的各种峰会,了解到的前沿技术,因随着运维监控软件的不断发展,未来软件将是开箱即用的模式,运维人员在使用监控软件,不必再去花精力编写运维监控程序,而是完善监控项,这样的方式对于初学者越来越不容易学习。因此,学习 zabbix 3.4 版本是非常必要的, zabbix 官方那时候还没有集成更多的模板以直接使用,那里有大量的监控项需要自己编写实现,不仅全面了解了 zabbix ,也是对 linux 命令、 shell 脚本、 Python 语言等的很好学习,也有助于二次开发,自定义监控项的配置。
以下是部署实施基于 zabbix 监控系统的建设背景,以解决诸多运维实际问题:
目前公司系统运维主要采用人工检查的方式,问题发现的时效性较低,容易出现问题不被立刻发现,人工也容易疏忽漏查,导致问题处理不及时,影响信息化系统服务效果,就需要更好保障系统稳定运行。
公司信息化系统、操作系统、设备种类多,各类信息化系统如:OA 、 U9 , PLM 、企业邮箱等,又有 Linux 、 Windows 、 VMware 、 EMC 等系统,设备有服务器、交换机、存储等,机房环境有动环系统进行监测。如此众多的信息化系统平台,当然需要统一运维界面,实时监测各系统运行状况,为运维工作提供便利。
为适应时代的发展,未来是个智能化的时代,运维工作要实现自动化,运维工作者要向开发去转变,开发即运维,或许有一天人工智能将代替运维人员,而今的运维人员希望是人工智能创造者的一份子,了解自动化运维,与时俱进是非常必要的。
综上,为了提高运维效率,节约人力资源,对设备、机房环境实时监控,能有效、实时发出告警信息,从而及时发现问题快速响应。急需一套能满足以上需求的监控系统,经考量 zabbix 监控系统应用广泛,可实现上述功能。
Zabbix 是一个企业级解决方案,支持实时监控数千台服务器,虚拟机和网络设备,采集百万级监控指标。Zabbix 完全开源免费。
Zabbix 的主要特点有:
Zabbix 系统有一些自己定义的专业术语,为更好的熟悉系统名词,下面主要介绍本文以及 zabbix 常用的术语。
主机( host)
一台你想监控的服务器、工作站、交换机等网络设备,用 IP 或者域名表示。
主机组( host group)
多台具有某种相同角色、属性的集合。例如,所有 windows 服务器放在一个叫 “windows server” 的主机组中。
监控项( item)
你想要监控、获取主机或主机组的哪些数据。例如:我想监控所有机器的 CPU 使用情况,则需要建一个监控项,用于获取所有服务器的 CPU 使用率。
触发器( trigger)
由逻辑表达式组成的按照预先设置好的阀值来评估由监控项采集到的数据。触发器有两种状态,分别为 “ 问题 ” 和 “ 已解决 ” 。例如:在上述通过监控项获取了 CPU 的使用率,假如我想超过 CPU 使用超过 80% 的就预警,则可以创建一个触发器,当监控项获取的值超过 80% 时就按照预设的情况报警,状态为 “ 问题 ” ;低于 80% 时认为报警解除,状态恢复为 “ 已解决 ” 。
事件( event)
单次发生的需要注意的事情,例如上述触发器状态由问题变成了正常或者由正常变成了问题,均可以称为一个事件。事件包括触发器事件、自动发现事件、自动注册事件和内部事件 4 个部分。
动作( action)
一个对事件做出反应的预定义的操作;例如 CPU 使用超过 80% 时,触发器状态变成了问题,即产生了一个事件,我们可以针对此事件预设一个动作(比如执行命令 reboot ),则系统会自动针对此事件的预设动作执行命令 reboot 。
媒介( media)
发送告警通知的手段或途径。例如:当 CPU 超过 80% 报警后,通过媒介(邮件、短信、自定义脚本、微信等)形式告知。
模板( template)
一组可以被应用到一个或多个主机上的实体(监控项,触发器,图形,聚合图形,应用, web 场景等)的集合。简单的说,即多个监控项的集合。
应用集( application)
一组监控项组成的逻辑分组。例如, CPU 的监控项,归集至 cpu ,在想查看有关 cpu 方面的信息时,可以直接在界面上提供的搜索框内查询所有有关 cpu 的信息。
zabbix server
zabbix 系统实现监控的核心程序,主要功能是与被监控主机、代理机等进行交互、触发器计算、发送告警通知、收集数据并存储等。
zabbix agent
一个部署在监控对象上的,能够主动监控本地资源和应用的程序;一般来讲,我们需要在所有被监控服务器上安装此程序。
zabbix proxy
一个帮助 zabbix server 收集数据,分担 zabbix server 的负载压力的程序;另外,还可以用在 server 与 agent 机器网络不通,使用 proxy 作为网络代理,实现两者的通信功能。
系统结构说明:由 web 、 linux 、 php 、 mysql 等组件部署安装,实现 zabbix server 服务端;由被监控对象例如:Windows 系统, linux 系统、 Vmware 虚拟化平台、交换机,存储等组成了 agent 端。Zabbix server 可采用主动模式,获取 agent 上数据,也可采用被动模式,接收 agent 定时发送的数据。
版本选择说明:目前 zabbix 3 版本成熟稳定,各大企业公司运维监控系统运行于该平台上,提供的监控项比 zabbix 第 1 和 2 版本丰富,完全能满足监控对象的需要;至今 zabbix 第 3 版已持续发布 4 年多时间,开源系统积累了大量的资料与研究人员,可供交流学习,能很好服务于 zabbix 定制化;zabbix 4.0 版本 2018 年 10 月正式发布, 4.2 版本于 2019 年 4 月正式发布,目前最新的是 zabbix 5.2 版本,版本持续更新满足未来升级发展的需要,新版本增加了 ELK 、时序数据库,以及前端 web 优化,但监控本质并未发生大的变化。
Zabbix 可以运行于虚拟环境也可以部署在服务器上,因 zabbix 采集数据主要是文本,对网络带宽要求不高,千兆速率足矣,只要满足性能上的要求即可,主要为 CPU 、内存和硬盘三项。结合 zabbix 官网给出的指标、实际监控项数量、历史记录保存时间长度。根据上表的参考标准,测试环境建议小型化部署。
名称 | CPU/内存 | 数据库 | 可监控主机数量 |
---|---|---|---|
小型 | 4核心/16G | MySQL + 500GB普通硬盘 | 500台以内 |
中型 | 4核心/32G | MySQL + 500GB普通硬盘 | 500-1000台 |
大型 | 8核心/64G | MySQL + 1TB RAID存储盘 | 1000-3000台 |
超大型 | 16核心/128G | MySQL + 2TB RAID存储盘 | 3000台以上 |
Zabbix 安装方式主要是两种:1 、 yum 源安装 2 、 zabbix 源码安装,安装方法互联网上搜索非常多,这里就不再阐述。主要安装组件:PHP 、 Apache 或 Nginx 、 Mysql 、 Zabbix 软件包。
本节介绍实现对 windows 系统状态监控。使用zabbix 3.4版本,一起了解学习zabbix监控数据采集过程,这样对我们自定义监控项非常有帮助,提供方法扩展思路 。诚然zabbix 5.0 版本等高版本,许多监控项已经被zabbix agent集成,但那并不利于初学者学习与实践。
通过在被监控主机上,部署安装 zabbix_agent ,实现事件查看器监控、 CPU 监控、内存监控、磁盘读写监控、磁盘容量监控、网卡流量监控、系统时间监控、系统进程和服务监控。
考虑到公司使用的服务器目前多数为 windows server ,对于个别服务器安装了PC 操作系统不深入研究,经测试 Windows 版本支持情况如下表:
版本 | 是否支持 | 备注 |
---|---|---|
Windows server 2003 | 是 | 需要运行32位程序 |
Windows server 2008 | 是 | |
Windows server 2012 | 是 | |
Windows 7 | 是 | |
Windows 10 | 否 | 测试zabbix-agent程序有报错 |
为了监控 window 系统,首先需要在该系统下部署 zabbix_agent 代理,用于收集该系统信息。
自研程序包列表:
角色 | 安装包 | 说明 | 适用版本 |
---|---|---|---|
基于zabbix-agent-3.4.6 | Zabbix目录 | bin conf script | Windows server 2003、2008、2012 |
Zabbix agent 的原始文件为 zabbix_agents_3.4.6.win.zip ,一般部署是:解压在 window 服务器 C 盘根目录下,再改写 conf 下的配置文件。为了部署方便快捷,现提供已经配置成熟的 zabbix 目录,直接复制 zabbix 目录到 window 服务器的 C 盘根目录下,最后进行程序安装和启动。因此,涉及 C:zabbixscriptconfzabbix_agentd.win.conf 文件的均可以忽略,供学习与交流。
cmd 或 powershell 下安装和启停命令如下:
cd C:zabbixbinwin64
.zabbix_agentd.exe -c C:zabbixconfzabbix_agentd.win.conf -i 安装
.zabbix_agentd.exe -c C:zabbixconfzabbix_agentd.win.conf -s 启动
.zabbix_agentd.exe -c C:zabbixconfzabbix_agentd.win.conf -x 停止
Windows 防火墙需要添加端口的出站和入站规则,将 TCP 协议 10050 、 10051 端口开放。不然 zabbix 主动或被动模式就获取不到该设备的数据。10050 10051 是 zabbix 程序使用端口。
Zabbix agent 安装过程中,会自动将 zabbix agent 服务、开机自启动配置好,只需要检查下, agent 是否正常运行即可。
对 windows 系统下 事件查看器中系统日志进行监控和信息获取,将事件查看器中的错误( Error )、关键( Critical )等系统、程序重要信息打印在 zabbix 界面中,也可以添加监控项,触发器来针对某个信息实现告警。例如:当事件查看器中,有磁盘坏块告警信息时, zabbix 界面会进行告警提示。或是配合研发部门程序日志,程序可将告警信息写入到事件查看器中,zabbix 对其进行监控告警。
https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/zabbix_agent/win_keys
截图如下:
类型:必须是 zabbix 客户端(主动式)
键值:参考 zabbix 官方文档,例子
eventlog[System,,"Critical|Error"] 将事件查看器中 “ 系统 ” 栏中 “Critical|Error” 类型的信息过滤出来
eventlog[System,,"Error",".Disk."] 事件查看器中 “ 系统 ” 栏中 “Critical|Error” 类型的信息过滤,并使用正则表达式匹配详细信息中的来源:Disk 的关键字
eventlog[Security,,"Success Audit",,^4624$,,skip].nodata(60)}=0 and
eventlog[Security,,"Success Audit",,^4624$,,skip].regexp(administrator,1)}=0
如果在 60 秒内有监控到数据,并且监控内容不包含字符串 "administrator" 则触发告警,如果 60 秒内没有新的数据了,则触发器恢复 OK 。简单点说就是,用户登录后触发器触发至少会持续 60 秒,如果用户不断的登录成功,间隔小于 60 秒,则触发器一直是 problem 状态。
应用集:Event 事件日志
名称:{HOST.NAME} 代表主机名
表达式:添加 “ 最新一条日志级别不等于 N” , N 取值是 0 、 1 或其他, 0 表示正常, 1 和其他值表示不正常。所以 N 取值不等于 0 ,触发告警。
系统:System 安全:Security
级别:错误( Error )、关键( Critical )、信息( Information )等,参考 zabbix 官网指导说明
来源:一定要看详细信息中的 Provider Name ,次截图上,详细信息与常规来源不一致,一个是 Microsoft-Windows-TerminalServices-Printers ,一个是 TerminalServices-Printers 。容易导致正则匹配出错,建议使用含有匹配的方式。
因为 zabbix 未提供能查看 cpu 使用率的监控项,只提供了 cpu 负载的监控项,就需新增建监控项,监控 CPU 用户使用率与其类似,不再说明。(zabbix 3.4版本)
名称:CPU 使用率
键值:为了规范命名 cpu_time
信息类型:浮点数
更新时间:1m
单位:%
应用集:CPU 状态
名称:CPU 使用率过高:{HOST.NAME}
表达式:{Windows Server Model:cpu_time.avg(5m)}>90 5 分钟均值大于 90% 告警
注:根据需要调整绘图风格
最后行添加
# CPU 使用率
PerfCounter=cpu_time,"Processor(_Total)% Processor Time",60
# CPU 用户使用率
PerfCounter=cpu_usertime,"Processor(_Total)% User Time",60
注:cpu_time 为 zabbix 界面上监控项配置的键值,虽然可以自定义,但要规范命名。
60 为数据更新时间,单位秒,要小于等于 zabbix 界面上监控项配置 “ 更新时间 ” ,这样才有更新的意义。
配置完成后,重启 zabbix_agentd 生效
cd C:zabbixbinwin64
.zabbix_agentd.exe -c C:zabbixconfzabbix_agentd.win.conf -x
.zabbix_agentd.exe -c C:zabbixconfzabbix_agentd.win.conf -s
应用集:Memory 内存状态
Memory 内存状态主要监控项有:Memory 内存使用率、 Memory 内存使用量、 Memory 内存总量(带上 Memory 方便了排序归类)。Swap 交换分区使用率、 Swap 交换分区使用量、 Swap 交换分区总量。
zabbix 自带内存监控项,可以直接创建使用。
监控项配置:
说明:windows 系统下没有支持 system.swap.size[pused] , swap 使用率监控项,一般 swap 分区被使用了,就可以说明物理内存不足,可以使用 pfree 替代。
以监控内存使用率为例:
名称:内存使用率
键值:vm.memory.size[pused]
其他键值:vm.memory.size[used] vm.memory.size[total]
信息类型:浮点数
更新时间:1m
单位:%
应用集:Memory 内存状态
名称:内存使用率过高:{HOST.NAME}
表达式:{Windows Server Model:vm.memory.size[pused].avg(5m)}>90 5 分钟均值大于 90% 告警
Windows 下磁盘监控,可以细分到监控各个磁盘数据如 C 、 D 、 E 等,目前未想到到自发现规则配置,就对所有磁盘进行监控取总体值,以总体值为例进行监控配置。
细分:
LogicalDisk(E:)Disk Write Bytes/sec
LogicalDisk(C:)Disk Write Bytes/sec
LogicalDisk(D:)Disk Write Bytes/sec
LogicalDisk(_Total)Disk Write Bytes/sec
总体:
PhysicalDisk(_Total)Disk Read Bytes/sec
磁盘读写监控项较多,配置监控项如下图:
键值:
disk_read_speed 、 disk_write_speed 、 disk_free_percent 、 disk_rw_percent 、 disk_rw_percent 等。
C:zabbixscriptconfzabbix_agentd.win.conf 文件配置为:
# Disk 磁盘读速率 Bytes/s
PerfCounter=disk_read_speed,"PhysicalDisk(_Total)Disk Read Bytes/sec",60
# Disk 磁盘写速率 Bytes/s
PerfCounter=disk_write_speed,"PhysicalDisk(_Total)Disk Write Bytes/sec",60
# Disk 磁盘空闲状态百分比
PerfCounter=disk_free_percent,"PhysicalDisk(_Total)% Idle Time",60
# Disk 磁盘读和写总共用时百分比
PerfCounter=disk_rw_percent,"PhysicalDisk(_Total)% Disk Time",60
# Disk 磁盘读用时百分比
PerfCounter=disk_read_percent,"PhysicalDisk(_Total)% Disk Read Time",60
# Disk 磁盘写用时百分比
PerfCounter=disk_write_percent,"PhysicalDisk(_Total)% Disk Write Time",60
# Disk 磁盘平均读写队列长度
PerfCounter=disk_queue_length,"PhysicalDisk(_Total)Avg. Disk Queue Length",60
# Disk 磁盘平均读队列长度
PerfCounter=disk_read_queue_length,"PhysicalDisk(_Total)Avg. Disk Read Queue Length",60
# Disk 磁盘平均读队列长度
PerfCounter=disk_write_queue_length,"PhysicalDisk(_Total)Avg. Disk Write Queue Length",60
Disk 磁盘读写用时百分比:选择
Windows 系统监控 模板 : Disk 磁盘读用时百分比
Windows 系统监控 模板 : Disk 磁盘写用时百分比
Windows 系统监控 模板 : Disk 磁盘读和写总共用时百分比
调整线条以及颜色
Zabbix 自带监控模板,在自动发现规则 Mounted filesystem discovery 已经配置。可用来来监控 CDEF 等分区容量。可以改成中文易读。如下图:
Zabbix 自带监控模板,在自动发现规则 Network interface discovery 已经配置。
需要过滤掉不需要监控的端口,只显示真实的网卡流量,在 zabbix 界面,管理 - 一般 - 正则表达式中找到 Network interfaces for discovery 项,添加过滤规则。例如:
需要创建两个监控项,一个是绝对时间用于触发器告警,另一个是易读时间显示。通过获取到被监控系统时间与 zabbix server 做时差比较,超过 10 分钟告警。
键值:system.localtime[local] 易读时间
键值:system.localtime[] 绝对时间
名称:与 zabbix 主机时差超过 10 分钟:{HOST.NAME}
表达式:{Windows Server Model:system.localtime[].fuzzytime(600)}=0
Windows 的进程或程序监控,是通过监控进程数量,以此为状态标志位来判断进程是否已停止运行。
当最新进程数为 0 时,判断进程已停止运行;当 5 分钟内,平均值大于等于 1 时,恢复触发器,判断进程已恢复运行;当最新进程数不为 0 时,判断进程正在运行。
下面以监控 Xshell.exe 程序,运行进程为例,来创建实施监控。
键值:proc.num[Xshell.exe]
Zabbix 官网样例 proc.num[,,,,]
信息类型:数字(无正负) 方便看图形,标志位
更新间隔:1m 1 分钟同一规定
注:windows 下 只支持进程名和用户名称
名称:Xshell 程序已停止运行:{HOST.NAME}
问题表现形式:{Windows Server Model:proc.num[Xshell.exe].last()}=0
恢复表达式:{Windows Server Model:proc.num[Xshell.exe].avg(5m)}>1 or {Windows Server Model:proc.num[Xshell.exe].avg(5m)}=1