LEMON

记录站

0%

Zabbix

一、监控生态

1. 概述

监控是整个运维乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供详实的数据用于追查定位问题。目前业界有很多不错的开源产品可供选择。选择一款开源的监控系统,是一个省时省力、效率最高的方案。当然,对监控不是很明白的朋友们,看了以下文章可能会对监控整个体系有比较深刻的认识。

2. 监控目标

每个人由于所在的行业、公司、业务、岗位不同,对监控的理解也不尽相同,但是我们需要注意,监控是需要站在公司的业务角度去考虑,而不是针对某个监控技术的使用。

1

对系统不间断的实时监控:实际上是对系统不间断的实时监控(这就是监控);

实时反馈系统当前状态:我们监控某个硬件、或者某个系统,都是需要能实时看到当前系统的状态,是正常、异常、或者故障

保证服务可靠性安全性:我们监控的目的就是要保证系统、服务、业务正常运行

保证业务持续稳定运行:如果我们的监控做得很完善,即使出现故障,能第一时间接收到故障报警,在第一时间处理解决,从而保证业务持续性的稳定运行。

3. 监控方法

发现问题:当系统发生故障报警,我们会收到故障报警的信息。

定位问题:故障邮件一般都会写某某主机故障、具体故障的内容,我们需要对报警内容进行分析。比如一台服务器连不上,我们就需要考虑是网络问题、还是负载太高导致长时间无法连接,又或者某开发触发了防火墙禁止的相关策略等,我们就需要去分析故障具体原因。

解决问题:当然我们了解到故障的原因后,就需要通过故障解决的优先级去解决该故障。

总结问题:当我们解决完重大故障后,需要对故障原因以及防范进行总结归纳,避免以后重复出现。

4. 监控工具

下面我们需要选择一款适合公司业务的监控工具进行监控,。这里我对监控工具进行了简单的分类。

2

4.1 老牌监控如下

MRTG(Multi Route Trffic Grapher)是一套可用来绘制网络流量图的软件,由瑞士奥尔滕的Tobias Oetiker与Dave Rand所开发,以GPL授权。MRTG最好的版本是1995年推出的,用Perl语言写成,可跨平台使用,数据采集用SNMP协议,MRTG将手机到的数据通过Web页面以GIF或者PNG格式绘制出图像。

Ganglia是一个跨平台的、可扩展的、高性能的分布式监控系统,如集群和网格。它基于分层设计,使用广泛的技术,用RRDtool存储数据。具有可视化界面,适合对集群系统的自动化监控。其精心设计的数据结构和算法使得监控端到被监控端的连接开销非常低。目前已有成千上万的集群正在使用这个监控系统,可以轻松地处理2000个节点的集群环境。

Cacti(英文含义为仙人掌)是一套基于PHP、MySQL、SNMP和RRDtool开发的网络流量监测图形分析工具,它通过snmpget来获取数据使用RRDtool绘图,但使用者无须了解RRDtool复杂的参数。提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、主机设备以及任何一张图,还可以与LDAP结合进行用户认证,同时也能自定义模板。在历史数据展示监控方面,其功能相当不错。Cacti通过添加模板,使不同设备的监控添加具有可复用性,并且具备可自定义绘图的功能,具有强大的运算能力(数据的叠加功能)

Nagios是一个企业级监控系统,可监控服务的运行状态和网络信息等,并能监视所指定的本地或远程主机状态以及服务,同时提供异常告警通知功能等。Nagios可运行在Linux和UNIX平台上。同时提供Web界面,以方便系统管理人员查看网络状态、各种系统问题、以及系统相关日志等。Nagios的功能侧重于监控服务的可用性,能根据监控指标状态触发告警。目前Nagios也占领了一定的市场份额,不过Nagios并没有与时俱进,已经不能满足于多变的监控需求,架构的扩展性和使用的便捷性有待增强,其高级功能集成在商业版Nagios XI中。

Smokeping主要用于监视网络性能,包括常规的ping、www服务器性能、DNS查询性能、SSH性能等。底层也是用RRDtool做支持,特点是绘制图非常漂亮,网络丢包和延迟用颜色和阴影来标示,支持将多张图叠放在一起,其作者还开发了MRTG和RRDtll等工具。 Smokeping的站点为:http://tobi.oetiker.cn/hp。

开源监控系统OpenTSDB用HBase存储所有时序(无须采样)的数据,来构建一个分布式、可伸缩的时间序列数据库。它支持秒级数据采集,支持永久存储,可以做容量规划,并很容易地接入到现有的告警系统里。OpenTSDB可以从大规模的集群(包括集群中的网络设备、操作系统、应用程序)中获取相应的采集指标,并进行存储、索引和服务,从而使这些数据更容易让人理解,如Web化、图形化等。

4.2 王牌监控

Zabbix是一个分布式监控系统,支持多种采集方式和采集客户端,有专用的Agent代理,也支持SNMP、IPMI、JMX、Telnet、SSH等多种协议,它将采集到的数据存放到数据库,然后对其进行分析整理,达到条件触发告警。其灵活的扩展性和丰富的功能是其他监控系统所不能比的。相对来说,它的总体功能做得非常优秀。从以上各种监控系统的对比来看,Zabbix都是具有优势的,其丰富的功能、可扩展的能力、二次开发的能力和简单易用的特点,读者只要稍加学习,即可构建自己的监控系统。

小米的监控系统:Open-Falcon。Open-Falcon的目标是做最开放、最好用的互联网企业级监控产品。

4.3 三方监控

现在市场上有很多不错的第三方监控,比如:监控宝、监控易、听云、还有很多云厂商自带监控,但在这里我不打算着重介绍,如果想了解三方监控可自行上官网咨询。(避免说广告植入)。

5. 监控流程

上面介绍了这么多,到底选择什么监控工具最合适呢?我这里推荐几款开源监控工具:Zabbix、Open-Falcon、LEPUS天兔(专用于监控数据库)。但本文还是基于Zabbix来构建整个监控体系生态圈。 下面我们就来聊聊Zabbix的整个流程:

数据采集:Zabbix通过SNMP、Agent、ICMP、SSH、IPMI等对系统进行数据采集;

数据存储:Zabbix存储在MySQL上,也可以存储在其他数据库服务;

数据分析:当我们事后需要复盘分析故障时,Zabbix能给我们提供图形以及时间等相关信息,方面我们确定故障所在;

数据展示:Web界面展示、(移动APP、java_php开发一个Web界面也可以);

监控报警:电话报警、邮件报警、微信报警、短信报警、报警升级机制等(无论什么报警都可以);

报警处理:当接收到报警,我们需要根据故障的级别进行处理,比如:重要紧急、重要不紧急,等。根据故障的级别,配合相关的人员进行快速处理。

6. 监控指标

上面了解了监控方法、目标、流程、也了解了监控有哪些工具,可能有人会疑惑,我们具体要监控些什么东西,在这里我进行了分类整理,包含硬件监控、系统监控、应用监控、网络监控、流量分析、日志监控、安全监控、API监控、性能监控、业务监控。

6.1 硬件监控

早期我们通过机房巡检的方式,查看硬件设备灯光闪烁情况判断是否故障,这样非常浪费人力,并且是重复性无技术含量的工作,大家懂得。

55

当然我们现在可以通过IPMI对硬件详细情况进行监控,并对CPU、内存、磁盘、温度、风扇、电压等设置报警设置报警阈值(自行对监控报警内容编写合理的报警范围) 。

IPMI监控硬件服务参考资料:Zabbix IPMI Interface

22

6.2 系统监控

中小型企业基本全是Linux服务器,那么我们肯定是要监控起系统资源的使用情况,系统监控是监控体系的基础。

监控主要对象:

ss

CPU有几个重要的概念:上下文切换、运行队列和使用率。这也是我们CPU监控的几个重点指标。

通常情况,每个处理器的运行队列不要高于3,CPU 利用率中用“户态/内核态”比例维持在70/30,空闲状态维持在50%,上下文切换要根据系统繁忙程度来综合考量。

针对CPU常用的工具有:htop、top、vmstat、mpstat、dstat、glances。Zabbix提供系统监控模板:Zabbix Agent Interface。

ds

CPU整体状态

ddds

上下文切换

ass

负载状态

内存:通常我们需要监控内存的使用率、SWAP使用率、同时可以通过Zabbix描绘内存使用率的曲线图形发现某服务内存溢出等。

针对内存常用的工具有:free、top、vmstat、glances。

q

内存使用率

IO分为磁盘IO和网络IO。除了在做性能调优我们要监控更详细的数据外,日常监控只关注磁盘使用率、磁盘吞吐量、磁盘写入繁忙程度,网络也是监控网卡流量即可。

常用工具有:iostat、iotop、df、iftop、sar、glances。

wq

磁盘使用率

ee

磁盘读/写吞吐

ww

网卡进出口流量

3w

TCP的11种状态信息

其它系统监控还有运行的进程端口、进程数、登陆用户、Open File等(详细查看Zabbix自带OS Linux模板)。

ac

6.3 应用监控

把硬件监控和系统监控研究明白后,我们进一步操作是需要登陆到服务器上查看服务器运行了哪些服务,都需要监控起来。

应用服务监控也是监控体系中比较重要的内容,例如:LVS、HAProxy、Docker、Nginx、PHP、Memcached、Redis、MySQL等,相关的服务都需要使用zabbix监控起来。

ax

nginx_status

h

PHP-FPM_status

m

Redis_status

v

JVM监控

  • Zabbix提供应用服务监控:Zabbix Agent UserParameter
  • Zabbix提供的Java监控:Zabbix JMX Interface
  • Percona提供MySQL数据库监控:percona-monitoring-plulgins

6.4 网络监控

作为一个针对全国用户的电商网站,时刻掌握各地到机房的网络状态也是必须的。

网络监控是我们构建监控平台是必须要考虑的,尤其是针对有多个机房的场景,各个机房之间的网络状态,机房和全国各地的网络状态都是我们需要重点关注的对象,那如何掌握这些状态信息呢?我们需要借助于网络监控工具Smokeping。

Smokeping 是rrdtool的作者Tobi Oetiker的作品,是用Perl写的,主要是监视网络性能,www服务器性能,DNS查询性能等,使用rrdtool绘图,而且支持分布式,直接从多个agent进行数据的汇总。

同时,由于自己监控点比较少,还可以借助很多商业的监控工具,比如监控宝、基调、博瑞等。同时这些服务提供商还可以帮助你监控CDN的状态。

监控宝

u

6.5 流量分析

网站流量分析对于运维人员来说,更是一门必须掌握的知识了。比如对于一家电商公司来说:通过对订单来源的统计和分析,可以了解我们在某个网站上的广告投入有没有收到预期的效果。 可以区分不同地区的访问人数、甚至商品交易额等。百度统计、Google分析、站长工具等,只需要在页面嵌入一个js即可。

但是,数据始终是在对方手中,个性化定制不方便,于是Google出一个叫Piwik的开源分析工具。

Piwik

fg

百度统计

xh

6.6 日志监控

通常情况下,随着系统的运行,操作系统会产生系统日志,应用程序会产生应用程序的访问日志、错误日志,运行日志,网络日志,我们可以使用ELK来进行日志监控。

对于日志监控来说,最见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目:Logstash(收集)+ElasticSearch(存储+搜索)+Kibana(展示)。

我们将这三个组合起来的技术称之为ELK Stack,所以说ELK Stack指的是Elasticsearch、Logstash、Kibana技术栈的结合。

如果收集了日志信息,部署更新有异常出现,可以立即在Kibana上看到。

nu

ELK日志展示(当然也可以通过Zabbix过滤错误日志来进行告警。)

op

6.7 安全监控

虽然Linux开源的安全产品不少,比如四层iptables,七层WEB防护Nginx+Lua实现WAF,最后将相关的日志都收至ELkstack,通过图形化进行不同的攻击类型展示。但是始终是一件比较耗费时间,并且个人效果并不是很好。这个时候我们可以选择接入第三方服务厂商。

qxgh

0o

zqa

某某三方安全

三方厂商提供全面的漏洞库,涵盖服务、后门、数据库、配置检测、CGI、SMTP等多种类型。

全面检测主机、Web应用漏洞自主挖掘和行业共享相结合第一时间更新0-day漏洞,杜绝最新安全隐患。

6.8 API监控

由于API变得越来越重要,很显然我们也需要这样的数据来分辨我们提供的 API是否能够正常运作。

监控API接口GET、POST、PUT、DELETE、HEAD、OPTIONS的请求。可用性、正确性、响应时间为三大重性能指标。

sder

API监控

pl

三方API监控

jhk

响应时间

pkgh

6.9 性能监控

全面监控网页性能,DNS响应时间、HTTP建立连接时间、页面性能指数、响应时间、可用率、元素大小等。Zabbix提供URL监控:Zabbix Web 监控。

hfyu

Zabbix站点监控

gvb

终端响应时间

ugfr

6.10 业务监控

没有业务指标监控的监控平台,不是一个完善的监控平台,通常在我们的监控系统中,必须将我们重要的业务指标进行监控,并设置阈值进行告警通知。比如电商行业:

每分钟产生多少订单、每分钟注册多少用户、每天有多少活跃用户、每天有多少推广活动、推广活动引入多少用户、推广活动引入多少流量、推广活动引入多少利润等,重要指标都可以加入Zabbix上,然后通过Screen展示。

注:由于业务监控图表,涉及到隐私的数据太多,就不截图了。

7. 监控报警

故障报警通知的方式有很多种,当然最常用的还是短信和邮件。

vdr

短信报警

shoyji

邮件报警

youjigh

8. 报警处理

报警后故障如何处理?首先我们可以通过告警升级机制先自动处理,比如Nginx服务down了,可以设置告警升级自动启动Nginx。

但是如果一般业务出现了严重故障,我们通常根据故障的级别、业务,来指派不同的运维人员进行处理。

当然不同业务形态、不同架构、不同服务可能采用的方式都不同,这个没有一个固定的模式套用。

gfvyt

10. 面试监控

在运维面试中,常常会被问题监控相关的问题,这个问题到底该如何来回答,我针对本文给大家提供了一个简单的回答思路

1、硬件监控

通过SNMP来进行路由器交换机的监控(这些可以跟一些厂商沟通来了解如何做)、服务器的温度以及其它,可以通过IPMI来实现。当然如果没有硬件全都是云,直接跳过这一步骤。

2、系统监控

如CPU的负载,上下文切换、内存使用率、磁盘读写、磁盘使用率、磁盘inode使用率。当然这些都是需要配置触发器,因为默认太低会频繁报警。

3、服务监控

比如公司用的LNMP架构,Nginx自带Status模块、PHP也有相关的Status、MySQL的话可以通过Percona官方工具来进行监控。Redis这些通过自身的info获取信息进行过滤等。方法都类似。要么服务自带。要么通过脚本来实现想监控的内容,以及报警和图形功能。

4、网络监控

如果是云主机又不是跨机房,那么可以选择不监控网络。当然你说我们是跨机房以及如何如何,推荐使用smokeping来做网络相关的监控,或者直接交给你们的网络工程师来做,因为术业有专攻。

5、安全监控

如果是云主机可以考虑使用自带的安全防护。当然也可以使用iptables。如果是硬件,那么推荐使用硬件防火墙。使用云可以购买防DDOS,避免出现故障导致down机一天。如果是系统,那么权限、密码、备份、恢复等基础方案要做好。Web同时也可以使用Nginx+Lua来实现一个Web层面的防火墙。当然也可以使用集成好的OpenResty。

6、Web监控

Web监控的话题其实还是很多。比如可以使用自带的Web监控来监控页面相关的延迟、js响应时间、下载时间、等等。这里我推荐使用专业的商业软件监控宝或听云来实现。毕竟人家全国各地都有机房(如果本身是多机房那就另说了)。

7、日志监控

如果是Web的话可以使用监控Nginx的50x、40x的错误日志,PHP的ERROR日志。其实这些需求无非是,收集、存储、查询、展示,我们其实可以使用开源的ELKStack来实现。Logstash(收集)、Elasticsearch(存储+搜索)、Kibana(展示)。

8、业务监控

上面做了那么多,其实最终还是保证业务的运行。这样我们做的监控才有意义。所以业务层面这块的监控需要和开发以及总监开会讨论,监控比较重要的业务指标,(需要开会确认)然后通过简单的脚本就可以实现,最后设置触发器即可 。

9、流量分析

平时我们分析日志都是拿awk sed xxx一堆工具来实现。这样对我们统计IP、PV、UV不是很方便。那么可以使用百度统计、Google统计、商业,让开发嵌入代码即可。为了避免隐私也可以使用Piwik来做相关的流量分析。

10、可视化

通过Screen以及引入一些第三方的库来美化界面,同时我们也需要知道,订单量突然增加、突然减少。或者说突然来了一大波流量,这流量从哪儿来,是不是推广了,还是被攻击了。可以结合监控平来梳理各个系统之间的业务关系。

11、自动化监控

如上我们做了那么多的工作,当然不能是一台一台的来加key实现。可以通过Zabbix的主动模式以及被动模式来实现。当然最好还是通过API来实现。

总结

真正想做到更完整的监控体系,目前的开源软件确实无法很好地满足,有条件的公司都开始自己开发自己的监控系统,比如小米开源的Open-Falcon。

也有比较好的开源的监控框架如Sensu等,再加上InfluxDB、Grafana可以用来定制符合自己企业的监控平台。

二、Zabbix配置文件详解

在zabbix服务(server)端、客户(agent)端、代理(proxy)端分别对应着一个配置文件。

  • zabbix_server.conf(服务端)
  • zabbix_agentd.conf(客户端)
  • zabbix_proxy.conf (代理端)

1. zabbix_server.conf详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
NodeID=0                      #分布式节点id号,0代表是独立服务器,默认是被注释掉的,不强制配置
ListenPort=10051 #zabbix server的端口,默认是10051,可以自行修改,范围是1024-32767 ,一般默认即可
SourceIP= #连接的源ip地址(出口),默认为空,默认即可
LogFile=/tmp/zabbix_server.log #日志文件的存放位置
LogFileSize=1 #说明:日志达到多少M里就轮转;若此参数值为0时,则不轮转,日志将不断变大,建议设置成轮转。
DebugLevel=3 #指定调试级别,默认即可
PidFile=/tmp/zabbix_server.pid #pid文件的存放位置
DBHost=localhost #数据库主机名,当设置为localhost时,连接mysql通过sock
DBName=zabbix #指定存放zabbix数据数据库的名字
DBUser=zabbix #指定连接数据库的用户名
DBPassword=123456 #用户连接数据库需要的密码
DBSocket=/var/lib/mysql/mysql.sock #前文主机设置为localhost,用户连接数据库所用的sock位置
DBPort=3306 #数据库的端口号,当用sock连接时,无关紧要,当通过网络连接时需设置
StartPollers=5 #说明;初始化时,启动子进程数量,数量越多,则服务端吞吐能力越强,对系统资源消耗越大。
StartIPMIPollers=0 #说明:主要用于IPmi技术用于获取硬件状态场景。若无相关监控项,建议设置为0
StartTrappers=5 #用于设置诸如SNMP STRAPPER场景提交来的数据的接收进程数,若客户机SNMP TRAPPER技术较多,建议加大此参数值
StartPingers=1 #用于设置启用icmp协议PING主机方式启动线程数量,若单台代理所管理机器超过500台,建议加大此数值
StartDiscoverers=1 #用于设置自动发现主机的线程数量,若单台代理所管理机器超过500台,可以考虑加大此数值(仅适用于直接AGENT场景)
StartHTTPPollers=1 #说明:用于设置WEB拨测监控线程数,可视具体情况增加或减少此数值。
JavaGateway=127.0.0.1 #JavaGateway的ip地址或主机名
JavaGatewayPort=10052 #JavaGateway的端口号
StartJavaPollers=5 #开启连接javagatey的进程数
SNMPTrapperFile=/tmp/zabbix_traps.tmp # SNMP trap发送到server的数据临时存放文件
StartSNMPTrapper=0 #如果设置为1,snmp trapper进程就会开启
ListenIP=0.0.0.0 #监听来自trapper的ip地址
HousekeepingFrequency=1 #说明:多少小时清理一次代理端数据库的history, alert, and alarms,以保持代理端数据库轻便,建议保持默认
MaxHousekeeperDelete=500 #每次轮询housekeeper这个任务的时候,超过这个阀值的行都会被清理。
SenderFrequency=30 #说明:多少秒后重试发送失败的报警信息
CacheSize=8M #说明:zabbix初始化时占用多少系统共享内存用于存储配置信息,HOST,ITEM,TRIGGER数据,视监控主机数量和监控项调整,建议调整到32M或者更大
CacheUpdateFrequency=60 #说明:zabbix更新操作系统CACHE配置,若管理页面操作不频繁,可以考虑加大参数值
StartDBSyncers=4 #将采集数据从CACHE同步到数据库线程数量,视数据库服务器I/O繁忙情况,和数据库写能力调整。数值越大,写能力越强。对数据库服务器I/O压力越大。
HistoryCacheSize=8M #说明:用于设置划分多少系统共享内存用于存储采集的历史数据,此数值越大,数据库读压力越小
TrendCacheSize=4M #说明:用于设置划分多少系统共享内存用于存储计算出来的趋势数据,此参数值从一定程度上可影响数据库读压力
HistoryTextCacheSize=16M #说明:指定划出多少系统共享内存用于存储 character, text or log history数据,若二级代理内存足够,建议可适当扩大此数值,可很大程度上解决系统I/O压力,和数据库读压力
ValueCacheSize=8M #说明:划出系统多少共享内存用于已请求的存储监控项信息,若监控项较多,建议加大此数值
NodeNoEvents=0 #说明:若节点为子结点,是否允许本地事件(events表)发送到主节点,1为不发送,但不影响此节点以下的节点的传播能力,视ZABBIX分布式系统架构设计开启或关闭。在不明架构前提下,建议保持默认
NodeNoHistory=0 #说明:若节点为子结点,是否允许本地历史数据发送到主节点,1为不发送,但不影响此节点以下的节点的传播能力,视ZABBIX分布式系统架构设计开启或关闭,在不明架构前提下,建议保持默认
Timeout=3 #说明:与AGNET\SNMP设备和其它外部设备通信超时设置,单位为秒;若采集数据不完整或网络繁忙,或从管理页面发现客户端状态变化频繁,可以考虑加大此数值。注意若此数值加大,应该考虑参数 StartPollers 是否有相应加大的必要。
TrapperTimeout=300 #说明:启用 trapper功能,用于进程等待超时设置。根据需要调整
UnreachablePeriod=45 #说明:当AGNET端处于不可用状态下,间隔多少秒后,尝试重新连接。建议根据具体情况设置。注意,若此数值过小,右agent端业务系统繁忙时,有可能造成报警信息误报
UnavailableDelay=60 #说明:当AGENT端处于可用状态下,间隔多少秒后,进行状态检查。若出现可正常采集数据,但管理页面AGENT状态不正常;若在网络,端口等均通畅情况下,AGENT状态仍不正常,可以考虑加大此数值
UnreachableDelay=15 #说明:当agent端处于不可达状态下,延迟多少秒后,进行重新尝试,建议保持默认,在AGENT接入调试阶段,可考虑减少此数值
AlertScriptsPath=/usr/local/zabbix/shell #监控报警脚本的存放路径
FpingLocation=/usr/local/sbin/fping #说明:IPv4 FPING命令路径,仅ROOT可用。注意使用此命令时,应该确认此命令是否存在
SSHKeyLocation= #说明:在服务端需要SSH到AGENT端且采用用KEY验证方式时使用,默认为空。
LogSlowQueries=3000 #说明:用于服务端数据库慢查询功能,单位是毫秒;1毫秒=0.001秒,若有服务端数据库监控慢查询的需求,可以视具体情况调整此数。
TmpDir=/tmp #临时文件夹
Include=/usr/local/etc/zabbix_server.general.conf #说明:include配置文件,可以使用正则表达式,例如:/usr/local/zabbix-2.4.4/conf/ttlsa.com/*.conf
Include=/usr/local/etc/zabbix_server.conf.d/ #子配置文件路径
StartProxyPollers=1 #在zabbix proxy被动模式下用此参数
ProxyConfigFrequency=3600 #取值范围:1-604800,默认值:3600,proxy被动模式下,server多少秒同步配置文件至proxy
ProxyDataFrequency=1 #取值范围:1-3600,默认值:1,被动模式下,zabbix server间隔多少秒向proxy请求历史数据

2、zabbix_agentd.conf详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PidFile=/tmp/zabbix_agentd.pid    #pid文件的存放位置
LogFile=/tmp/zabbix_agentd.log #日志文件的位置
LogFileSize=1 #当日志文件达到多大时进行轮询操作
DebugLevel=3 #日志信息级别
SourceIP= #连接的源ip地址(出口),默认为空,即可
EnableRemoteCommands=0 #是否允许zabbix server端的远程指令,0表示不允许,1表示允许
LogRemoteCommands=0 #是否开启日志记录shell命令作为警告 0表示不允许,1表示允许
Server=127.0.0.1 #zabbix server的ip地址或主机名,可同时列出多个,需要用逗号隔开
ListenPort=10050 #zabbix agent监听的端口
ListenIP=0.0.0.0 #zabbix agent监听的ip地址
StartAgents=3 #zabbix agent开启进程数
ServerActive=127.0.0.1 #开启主动检查
Hostname=Zabbix server #在zabbix server前端配置时指定的主机名要相同,最重要的配置
RefreshActiveChecks=120 #主动检查刷新的时间,单位为秒数
BufferSend=5 #数据缓冲的时间
BufferSize=100 #zabbix agent数据缓冲区的大小,当达到该值便会发送所有的数据到zabbix server
MaxLinesPerSecond=100 #zabbix agent发送给zabbix server最大的数据行
AllowRoot=0 #是否允许zabbix agent 以root用户运行
Timeout=3 #设定处理超时的时间
Include=/usr/local/etc/zabbix_agentd.userparams.conf #子配置文件路径

Include=/usr/local/etc/zabbix_agentd.conf.d/ #包含子配置文件的路径

UnsafeUserParameters=0 #是否允许所有字符参数的传递

UserParameter= #指定用户自定义参数

3、zabbix_proxy.conf详解

1
2
3
4
5
6
7
8
9
Server=192.168.70.133             #指定zabbix server的ip地址或主机名
Hostname=zabbix-proxy-1.35 #定义监控代理的主机名,需和zabbix server前端配置时指定的节点名相同
LogFile=/tmp/zabbix_proxy.log #指定日志文件的位置
PidFile=/tmp/zabbix_proxy.pid #pid文件的位置
DBName=zabbix_proxy #数据库名
DBUser=zabbix #连接数据库的用户
DBPassword=123456 #连接数据库用户的密码
ConfigFrequency=60 #zabbix proxy从zabbix server取得配置数据的频率
DataSenderFrequency=60 #zabbix proxy发送监控到的数据给zabbix server的频率

三、Zabbix监控结合Grafana绘图

1. Zabbix概述

Zabbix是一个企业级的开源分布式监控解决方案,由C语言编写而成的底层架构(server端和agent端),由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收费的技术支持赢利。官方网站:http://www.zabbix.com

2. Zabbixj架构图

zabbix根据网络环境、监控规模等,分了三种架构: server-client 、server-proxy-client、master-node-client 三种 。

server-client架构

也是zabbix的最简单的架构,监控机和被监控机之间不经过任何代理 ,直接由zabbix server和zabbix agentd之间进行数据交互。适用于网络比较简单,设备比较少的监控环境 。

master-node-client架构

该架构是zabbix最复杂的监控架构,适用于跨网络、跨机房、设备较多的大型环境 。每个node同时也是一个server端,node下面可以接proxy,也可以直接接client 。node有自已的配置文件和数据库,其要做的是将配置信息和监控数据向master同步,master的故障或损坏对node其下架构的完整性。

server-proxy-client架构

其中proxy是server、client之间沟通的一个桥梁,proxy本身没有前端,本身也并不存放数据,只是将agentd发来的数据暂时存放,然后再提交给server ;该架构经常是和master-node-client架构做比较的架构 ,一般适用跨机房、跨网络的中型网络架构的监控。

Zabbix基本机构图如下

3. Zabbix的优劣势

优点

  • 支持设备多

  • 支持分布式集中管理

  • 开源,无软件成本投入

  • 开放式接口,扩展性强

  • Server对设备性能要求低(实际测试:2个CPU 1G内存,监控5台设备,CPU使用率保持在10%以下,内存剩余400M以上)

  • 当监控的项目比较多 服务器队列比较大的时候可以采用被动状态,被监控客户端主动从server端去下载需要监控的项目然后取数据上传到server端。这种方式对服务器的负载比较小。

缺点

  • 无厂家支持,出现问题解决比较麻烦
  • 需在被监控主机上安装agent,所有数据都存在数据库里,产生的数据据很大,瓶颈主要在数据库。

4. Zabbix组件说明

1)zabbix server:负责接收agent发送的报告信息的核心组件,所有配置、统计数据及操作数据都由它组织进行;

2)database storage:专用于存储所有配置信息,以及由zabbix收集的数据;

3)web interface:zabbix的GUI接口;

4)proxy:可选组件,常用于监控节点很多的分布式环境中,代理server收集部分数据转发到server,可以减轻server的压力;

5)agent:部署在被监控的主机上,负责收集主机本地数据如cpu、内存、数据库等数据发往server端或proxy端;

5. Zabbix监控流程

agentd需要安装到被监控的主机上,它负责定期收集各项数据,并发送到zabbix server端,zabbix server将数据存储到数据库中,zabbix web根据数据在前端进行展现和绘图。

这里agentd收集数据分为主动和被动两种模式:

  • 主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy

  • 被动:server向agent请求获取监控项的数据,agent返回数据。

6. 客户端守护进程

此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等。

zabbix_get

zabbix工具,单独使用的命令,通常在server或者proxy端执行获取远程客户端信息的命令。通常用户排错。例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。

zabbix_sender

zabbix工具,用于发送数据给server或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致zabbix超时。于是我们在脚本执行完毕之后,使用sender主动提交数据。

zabbix_server

zabbix服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server。(备注:当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据)

zabbix_proxy

zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。为什么要用代理?代理是做什么的?卖个关子,请继续关注运维生存时间zabbix教程系列。

zabbix_java_gateway

zabbix2.0之后引入的一个功能。顾名思义:Java网关,类似agentd,但是只用于Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。

7. Zabbix项目实战

环境:

主机 操作系统 ip地址 主要软件
server.zabbix Centos 7.4.1708 64 192.168.2.1/24 Lamp、mailx、zabbix-4.2.7、grafana-4.6.1-1
agent01.zabbix Centos 7.4.1708 64 192.168.2.2/24 zabbix-4.2.7
agent02.zabbix Centos 7.4.1708 64 192.168.2.3/24 zabbix-4.2.7

环境配置

修改三台主机名

1
2
3
hostnamectl set-hostname server.zabbix && logout
hostnamectl set-hostname agent01.zabbix && logout
hostnamectl set-hostname agent02.zabbix && logout

在 hosts文件里追加以下配置(配置相同)

1
2
3
4
5
cat <<END>> /etc/hosts
192.168.2.1 server.zabbix
192.168.2.2 agent01.zabbix
192.168.2.3 agent02.zabbix
END

时间同步

1
2
3
4
yum -y install ntpdate
ntpdate ntp1.aliyun.com
echo "ntpdate ntp1.aliyun.com" >>/etc/rc.local
chmod u+x /etc/rc.d/rc.local

关闭防火墙 及 selinux配置

1
2
systemctl stop firewalld
setenforce 0

实施步骤:

步骤 说明
第一步 1.安装zabbix server服务端
第二步 2.配置优化zabbix服务的web页面
第三步 3.实现监控server.zabbix端自身的OS、mysql、httpd
第四步 4.自定义Zabbix监控项(重点)
第五步 5.实现Zabbix邮件报警功能
第六步 6.自动发现—自动添加服务器监控
第七步 7.Zabbix聚合图形
第八步 8.安装并配置Grafana的web界面(呈现效果)

7.1 安装zabbix server服务端

上传Lamp和Zabbix相关依赖的软件包

image-20200619120232323

配置 server 端的本地 lamp yum源

1
2
3
4
5
6
[root@server ~]# cat <<END>> /etc/yum.repos.d/yum.repo 
[zabbix]
baseurl=file:///opt/zabbix
enabled=1
gpgcheck=0
END

server端上安装lamp和依赖包;注:最好多安几遍,包太多,可能安不全

1
[root@server ~]# yum -y install net-snmp net-snmp-devel libxml2 libxml2-devel libcurl-devel libevent libevent libevent-devel curl curl-devel mysql-devel snmp perl-DBI php-xml php-bcmath php-mbstring php-ldap php-xmlrpc httpd php php-mysql php-common php-gd php-odbc php-pear gcc* net-snmp libssh2 libssh2-devel mariadb-server mariadb mariadb-devel

image-20200619121029385

image-20200619120850161

启动 mariadb、httpd 服务 并 设置mariadb数据库密码

1
2
3
[root@server ~]# for i in mariadb httpd;do systemctl start $i;done
[root@server ~]# for i in mariadb httpd;do systemctl enable $i;done
[root@server ~]# mysqladmin -u root -p password "123123"

源码安装Zabbix服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 创建zabbix运行用户
[root@server ~]# useradd zabbix -M -s /sbin/nologin

## 创建zabbix日志存放目录
[root@server ~]# mkdir -p /usr/local/zabbix/logs

## 更改属主数组
[root@server ~]# chown -R zabbix:zabbix /usr/local/zabbix/

## 解压
[root@server ~]# tar xf zabbix-4.2.7.tar.gz -C /usr/src/ && cd /usr/src/zabbix-4.2.7

## 配置
[root@server zabbix-4.2.7]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2

## 编译、安装
[root@server zabbix-4.2.7]# make && make install && cd

## 配置解释
--enable-server //启动服务端
--enable-agent //启动客户端
--enable-ipv6 //启动ipv6
--with-net-snmp //路由交换

登陆数据库创建保存监控模板的数据库,并导入数据模板以及授权zabbix用户连接数据库

1
2
3
4
5
6
7
8
9
[root@server ~]# mysql -uroot -p123123
create database if not exists zabbix default character set utf8 collate utf8_general_ci;
use zabbix;
source /usr/src/zabbix-4.2.7/database/mysql/schema.sql;
source /usr/src/zabbix-4.2.7/database/mysql/images.sql;
source /usr/src/zabbix-4.2.7/database/mysql/data.sql;
grant all on zabbix.* to zabbix@'192.168.2.1' identified by 'zabbix';
flush privileges;
exit

修改服务zabbix_server.conf 端及客户端zabbix_agentd.conf的配置文件

zabbix_server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 备份
[root@server ~]# cp /usr/local/zabbix/etc/zabbix_server.conf /opt/zabbix_server.conf.bak

## 编辑配置文件
[root@server ~]# vim /usr/local/zabbix/etc/zabbix_server.conf
:%g/^#/d
:%g/^$/d

LogFile=/usr/local/zabbix/logs/zabbix_server.log
PidFile=/usr/local/zabbix/logs/zabbix_server.pid
Timeout=4
DBHost=192.168.2.1
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
DBSocket=/var/lib/mysql/mysql.sock
Include=/usr/local/zabbix/etc/zabbix_server.conf.d/*.conf

## 配置解释
DBHost=192.168.2.1 # 指定数据库的ip地址
DBName=zabbix # 数据库的名字
DBUser=zabbix # 指定连接数据库的用户名
DBPassword=zabbix # 用户连接数据库需要的密码
DBSocket=/var/lib/mysql/mysql.sock # 指定mysql mysql.sock文件路径;ps -aux|grep mysql

zabbix_agentd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 备份
[root@server ~]# cp /usr/local/zabbix/etc/zabbix_agentd.conf /opt/zabbix_agentd.conf.bak

## 编辑配置文件
[root@server ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
:%g/^#/d
:%g/^$/d

LogFile=/usr/local/zabbix/logs/zabbix_agentd.log
PidFile=/usr/local/zabbix/logs/zabbix_agentd.pid
Server=192.168.2.1
ServerActive=192.168.2.1
Hostname=server.zabbix # 这里一定要和本机的名称一致
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf

## 配置解释
PidFile=/tmp/zabbix_agentd.pid # 运行的PID文件
Server=127.0.0.1,192.168.2.1 # 输入zabbix_server主机的ip地址,可以指定多个
ServerActive=192.168.2.1 # 输入agent主机采集到数据发送到的server端{主动}
Hostname=server.zabbix # 输入agent本机的主机名
LogFile=/usr/local/zabbix/logs/zabbix_agentd.log # 指定日志文件
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf # 开启附加配置文件目录

启动server(监控端) 及 agent(被监控端)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 加入开机启动项
[root@server ~]# cat <<END>> /etc/rc.local
/usr/local/zabbix/sbin/zabbix_server
/usr/local/zabbix/sbin/zabbix_agentd
END

# 启动server
[root@server ~]# /usr/local/zabbix/sbin/zabbix_server

# 启动agent
[root@server ~]# /usr/local/zabbix/sbin/zabbix_agentd

## 检查是否启动
[root@server ~]# netstat -utpln |grep 1005
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 12454/zabbix_agentd
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 12387/zabbix_server
tcp6 0 0 :::10050 :::* LISTEN 12454/zabbix_agentd
tcp6 0 0 :::10051 :::* LISTEN 12387/zabbix_server

将Zabbix自带的web页面添加到httpd的网页存放目录中,并修改php的配置文件,然后重启httpd服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
## 拷贝Zabbix自带的php页面到apache网站存放目录中
[root@server ~]# cp -r /usr/src/zabbix-4.2.7/frontends/php/ /var/www/html/zabbix
[root@server ~]# chown -R apache:apache /var/www/html/

## 编辑php配置文件
[root@server ~]# vim /etc/php.ini
date.timezone = Asia/Shanghai
max_execution_time = 300
max_input_time = 300
post_max_size = 32M
memory_limit = 128M
extension = bcmath.so

## 配置解释
date.timezone = Asia/Shanghai # 时区
max_execution_time = 300 # 单位秒,通过POST、GET以及PUT方式接收数据时间进行限制
max_input_time = 300 # php程序上传文件解析数据时的时间限制
post_max_size = 32M # POST 方式请求数据所允许的最大大小
memory_limit = 128M # 设置php程序的内存限制
extension=bcmath.so # 加载zabbix程序需要加载的扩展模块bcmath.so

## 重启apache
[root@server ~]# systemctl restart httpd
[root@server ~]# netstat -anptu|grep httpd
tcp6 0 0 :::80 :::* LISTEN 31106/httpd

7.2 配置优化zabbix服务的web页面

访问安装 http://192.168.2.1/zabbix/

image-20200619125158344

image-20200619125237448

image-20200619125349757

image-20200619125601330

image-20200619125634128

image-20200619125711508

登陆Zabbix页面并进行一些简单优化,默认用户名admin,密码zabbix

image-20200619130143925

image-20200619130337305

image-20200619130437102

解决zabbix显示图像下边文字乱码情况:

image-20200619130638409

1
2
3
4
5
6
7
8
9
10
[root@server ~]# mv simkai.ttf /var/www/html/zabbix/assets/fonts/
[root@server ~]# cd /var/www/html/zabbix/assets/fonts/ && ls
DejaVuSans.ttf simkai.ttf

[root@server fonts]# mv DejaVuSans.ttf DejaVuSans.ttf.bak
[root@server fonts]# mv simkai.ttf DejaVuSans.ttf
[root@server fonts]# chown -R apache:apache ./ && ll
总用量 12252
-rw-r--r-- 1 apache apache 11785184 6月 19 12:05 DejaVuSans.ttf
-rw-r--r-- 1 apache apache 756072 6月 19 12:41 DejaVuSans.ttf.bak

image-20200619130834248

7.3 实现监控server.zabbix端自身的OS、mysql、httpd

添加主机:配置—主机—创建主机

image-20200619135116794

  • 选择OS、mysql、httpd模板

这些模板都是官方默认提供的,里面包含了所有,比如:监控项、触发器、触发器、图形、自动发现等所有的配置,不需要再手动编写,但是一般在公司都是自己编写这些个配置。

image-20200619135826322

勾选以下三个监控模板,点击选择按钮

image-20200619135446081

image-20200619140058514

image-20200619140128762

他们的对应关系:

  • 应用集 针对 监控项
  • 监控项 针对 触发器

image-20200619140310324

  • 创建MySQL图形

image-20200619141052844

image-20200619141210596

image-20200619141354833

选择监控项,点击选择

image-20200619141506204

image-20200619141607265

查看监控主机的图形;

但是意外出现了,关于Mysql数据库的所有监控项没有图形,如图所示;

image-20200619141733803

经过查看,问题如下图,监控Mysql服务器的键值不支持

image-20200619141835550

解决方案如下;

  • 打开zabbix_server服务器,同时在此也是被监控端,设置MySQL监控项失效的键值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
## 注意:下面标红的$1要手写进去,直接粘贴,粘不进去的!!!
[root@server ~]# cat <<END>>/usr/local/zabbix/etc/zabbix_agentd.conf
UnsafeUserParameters=1
UserParameter=mysql.version,mysql -V
UserParameter=mysql.status[*],/usr/local/zabbix/etc/chk_mysql.sh $1
UserParameter=mysql.ping, mysqladmin -uroot -p123123 -P3306 ping | grep -c alive
END


## 内容解释
#允许key键能够接收任何类型的value值;必写!
UnsafeUserParameters=1
#定义键值, mysql.version键, 以及键的值mysql –V; 会将mysql –V赋值给mysql.version键{MySQL版本}
UserParameter=mysql.version,mysql –V
#定义键mysql.status[*],值/usr/local/zabbix/etc/chk_mysql.sh $1;{脚本}
UserParameter=mysql.status[*],/usr/local/zabbix/etc/chk_mysql.sh $1
#定义键mysql.ping,值mysqladmin -uroot -p123123 -P3306 ping | grep -c alive;{mysql存活}
UserParameter=mysql.ping, mysqladmin -uroot -p123123 -P3306 ping | grep -c alive


## 在脚本中指定agent端的mysql 的ip地址,连接的用户名密码等
[root@server ~]# vim /usr/local/zabbix/etc/chk_mysql.sh
#!/bin/bash
# 用户名
MYSQL_USER='root'

# 密码
MYSQL_PWD='123123'

# 端口
MYSQL_PORT='3306'

# 数据连接
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -P${MYSQL_PORT}"

# 参数是否正确
if [ $# -ne "1" ];then
echo "arg error!"
fi

# 获取数据
case $1 in
Uptime)
result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"`
echo $result
;;
Com_update)
result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3`
echo $result
;;
Slow_queries)
result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"`
echo $result
;;
Com_select)
result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3`
echo $result
;;
Com_rollback)
result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|" -f3`
echo $result
;;
Questions)
result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"`
echo $result
;;
Com_insert)
result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3`
echo $result
;;
Com_delete)
result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3`
echo $result
;;
Com_commit)
result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3`
echo $result
;;
Bytes_sent)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
echo $result
;;
Bytes_received)
result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
echo $result
;;
Com_begin)
result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3`
echo $result
;;

*)
echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
;;
esac


## 给予脚本执行权限
[root@server ~]# chmod a+x /usr/local/zabbix/etc/chk_mysql.sh


## 重启zabbix_agentd服务
[root@server ~]# yum -y install psmisc #安装killall命令
[root@server ~]# killall -9 zabbix_agentd
[root@server ~]# /usr/local/zabbix/sbin/zabbix_agentd
[root@server ~]# netstat -utpln |grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 32092/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 32092/zabbix_agentd


## 检查MySQL是否激活
[root@server ~]# mysqladmin -uroot -p123123 -P 3306 ping
mysqld is alive

--------------------------------------------------------------------------------------------------------------------
检测mysql状态时会使用zabbix_get命令:在此可以通过zabbix_get命令进行获取服务器监控项的具体键值,mysql.ping是在zabbix_agentd.conf配置文件中的键值名称,通过此名称可以查看键值,通常能够获取到键值,获取监控数据就是没问题的;只要zabbix_get能获取到的数据,那图形也就一定能获取并显示,否则图形绝对获取不到数据并显示。
--------------------------------------------------------------------------------------------------------------------

## 使用zabbix_get工具测试脚本中的键值
[root@server ~]# ln -s /usr/local/zabbix/bin/* /usr/local/bin/ # 为zabbix_get的命令做软链接

[root@server ~]# zabbix_get -s 192.168.2.1 -k mysql.ping
1

[root@server ~]# zabbix_get -s 192.168.2.1 -k mysql.status[Com_update]
588

[root@server ~]# zabbix_get -s 192.168.2.1 -k mysql.version
mysql Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1

再次打开zabbix的web界面,查看mysql监控项界面

image-20200619143939270

image-20200619143849601

image-20200619144050951

image-20200619144118893

  • 创建httpd服务的图形

这和MySQL的过程是一样的,而且它比MySQL还要省事,因为OS和HTTPD模板的键值默认就是支持的,不需要在取值了

image-20200619150724807

image-20200619150757318

image-20200619150847855

7.4 自定义Zabbix监控项(重点)

  • 以上关联的 Template OS Linux 模板基本涵盖了所有系统层面的监控,包括了我们最关注的几项:ping、load、cpu使用率、memory、disk、网卡流量等等,当然有些触发器的阀值可能需要根据服务器的自身情况进行修改。

  • 下面添加自定义服务器内存使用检测项,在此配置一个监控项为:内存使用70M进行警告提醒:

  • 修改客户端zabbix_agentd.conf配置文件,最后一行添加:

    • UserParameter=memory_used,free -m|grep Mem|awk ‘{print $3}’
  • 语法:UserParameter=key,shell command

    • 监控key值:memory_userd,key值可以随意编写,但是一会需要在web页面创建监控项时指定key值
    • Shell命令或脚本:free -m|grep Mem|awk ‘{print $3}’
  • 注:在zabbix_server端可以使用zabbix_get -s agent端ip地址 -p 10050 -k key名通过此命令可以查看agent端key的监控值

在此之前,先将agent01.zabbix主机的zabbix客户端软件安装好,并加入至Linux Servers组中

1、安装并配置zabbix客户端,只安装agent端,不装server端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
## 安装所需依赖包
[root@agent01 ~]# yum -y install libxml2-devel libcurl-devel pcre-devel

## 创建zabbix运行用户
[root@agent01 ~]# useradd zabbix -M -s /sbin/nologin

## 创建zabbix日志存放目录
[root@agent01 ~]# mkdir -p /usr/local/zabbix/logs

## 更改属主数组
[root@agent01 ~]# chown -R zabbix:zabbix /usr/local/zabbix/

## 解压
[root@agent01 ~]# tar xf zabbix-4.2.7.tar.gz -C /usr/src/ && cd /usr/src/zabbix-4.2.7

## 配置
[root@agent01 zabbix-4.2.7]# ./configure --prefix=/usr/local/zabbix --enable-agent --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2

## 编译、安装
[root@agent01 zabbix-4.2.7]# make && make install && cd

## 备份文件
[root@agent01 ~]# cp /usr/local/zabbix/etc/zabbix_agentd.conf /opt/zabbix_agentd.conf.bak

## 编辑配置文件
[root@agent01 ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
LogFile=/usr/local/zabbix/logs/zabbix_agent.log
PidFile=/usr/local/zabbix/logs/zabbix_agent.pid
Server=192.168.2.1
ServerActive=192.168.2.1
Hostname=agent01.zabbix # 这里一定要和本机的名称一致
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf

## 启动agent端
[root@agent01 ~]# /usr/local/zabbix/sbin/zabbix_agentd
[root@agent01 ~]# netstat -utpln |grep zabbix
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 27693/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 27693/zabbix_agentd

## 加入开机启动项
[root@agent01 ~]# chmod a+x /etc/rc.d/rc.local
[root@agent01 ~]# echo '/usr/local/zabbix/sbin/zabbix_agentd' >> /etc/rc.local

2、将其agent01主机加入至Linux Servers组中,至于模板的话就选择一个Template OS Linux系统的就行了

image-20200619155353287

image-20200619155555878

image-20200619155614944

自定义监控具体实现方式如下,在agent.zabbix主机的配置文件中来定义监控项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 定义系统所用的物理内存大小
[root@agent01 ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
UserParameter=memory_used,free -m|grep Mem|awk '{print $3}'

## 重启zabbix_agent端
[root@agent01 ~]# killall -9 zabbix_agentd
[root@agent01 ~]# /usr/local/zabbix/sbin/zabbix_agentd
[root@agent01 ~]# netstat -anptu|grep "agentd"
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 27789/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 27789/zabbix_agentd

## 再去server.zabbix.com主机上测试能否查看其监控项键值
[root@server ~]# zabbix_get -s 192.168.2.2 -k memory_used
129

使用web界面添加此监控项

image-20200619160519496

image-20200619160627909

image-20200619161155740

image-20200619161233426

监控项添加完成后,创建触发器(根据条件进行触发某个告警操作)

image-20200619161434762

image-20200619161633476

image-20200619161713696

image-20200619161748261

image-20200619161922879

插入后,手动修改表达式为 >200 作为条件,然后添加就行了

image-20200619162135220

image-20200619162327374

触发器创建完成后,创建监控显示的图形

image-20200619162417014

image-20200619162531482

image-20200619162649078

查看这个图形

image-20200619162737392

模拟内存使用超过200M触动触发器

[root@agent01 ~]# dd if=/dev/zero of=/opt/lemon.txt bs=1G count=5 &

image-20200619162958307

image-20200619163030339

7.5 实现Zabbix邮件报警功能

首先配置server.zabbix端的邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
## 安装邮箱应用
[root@server ~]# yum -y install mailx dos2unix
[root@server ~]# mailx -V
12.5 7/5/10

## 配置mail.rc
[root@server ~]# vim /etc/mail.rc //在此文件末尾添加,指定接收邮件邮箱地址,指定邮箱服务器地址,指定接收邮件邮箱地址的授权码,并非163邮箱的密码,而是授权码,登陆163邮箱地址后,--设置--开启smtp和pop3--点击客户端生成授权码--使用此授权码进行指定到此配置文件。
set from=lemon_row@163.com smtp=smtp.163.com
set smtp-auth-user=lemon_row@163.com smtp-auth-password=TZVLGNYMVOEWCIHR
set smtp-auth=login

## 测试
[root@server ~]# echo "测试1" |mail -s "good1" lemon_row@163.com //测试邮件接收情况

image-20200619164159730

配置zabbix_server.conf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@server ~]# vim /usr/local/zabbix/etc/zabbix_server.conf
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts //邮件报警的脚本存放位置
:wq

## 编写报警邮件脚本,调整mail命令语法位置,使用dos2unix命令转换字符,避免收到邮件不显示正常邮件内容而出现ATT00001.bin的错误;
[root@server ~]# vim /usr/local/zabbix/share/zabbix/alertscripts/mailbox.sh
#!/bin/bash
#export.UTF-8
bt=$2 #邮件标题
sjr=$1 #发送给谁
FILE=/tmp/mailtmp.txt
echo "$3" >$FILE
/usr/bin/dos2unix -k $FILE
/bin/mail -s "$bt" "$sjr" <$FILE
:wq

## 注意文件以及报警脚本的归属以及权限,注:脚本文件和存放邮件消息文件属主必须是zabbix
[root@server ~]# chmod a+x /usr/local/zabbix/share/zabbix/alertscripts/mailbox.sh
[root@server ~]# chown zabbix:zabbix /usr/local/zabbix/share/zabbix/alertscripts/mailbox.sh
[root@server ~]# touch /tmp/mailtmp.txt && chmod a+x /tmp/mailtmp.txt
[root@server ~]# chown zabbix:zabbix /tmp/mailtmp.txt

## 测试脚本邮件接收情况
[root@server ~]# /usr/local/zabbix/share/zabbix/alertscripts/mailbox.sh lemon_row@163.com "good2" "测试2"
dos2unix: converting file /tmp/mailtmp.txt to Unix format ...

image-20200619164749416

配置zabbix web网站进行监控项的邮件报警,每一张图片后附带解释和注意事项,大体步骤分为 监控–创建报警媒介类型–更新用户使用的报警媒介类型–创建动作(根据触发器触发)–验证

创建报警媒介类型:

image-20200619165010104

image-20200619165048174

输入创建的报警媒介类型的名称,指定类型为脚本的方式,并且输入zabbix_server端/usr/local/zabbix/share/zabbix/alertscripts目录下的脚本名称,确保脚本的归属是zabbix,并且脚本的权限是777,下边设置脚本参数,也就是发送邮件的语法:脚本收件人标题内容,必须严格按照此标准填写;

脚本参数: {ALERT.SENDTO} {ALERT.SUBJECT} {ALERT.MESSAGE}

image-20200619165804032

image-20200619165917407

配置zabbix中的用户所使用的报警媒介类型以及接收邮件的邮箱

image-20200619170022217

image-20200619170311840

image-20200619173024229

image-20200619173046667

创建动作,也就是发送邮件的动作

image-20200619170557684

输入动作名,动作名最好为英文,可以选择触发这个动作的条件(可以选择触发器=触发器的名称或者选择触发器似触发器名称),作为条件,如若如图不选择触发器的条件,那么任何消息都会提示到邮箱

image-20200619170759716

添加报警动作,一旦此触发器添加触发,添加报警邮件的标题和内容,默认操作步骤持续时间(修改持续时间为60秒 (一分钟发送一次邮件)),添加操作(添加接收邮件的用户)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

image-20200619171145098

image-20200619171327264

添加恢复操作(指故障恢复之后发送邮件的动作),具体步骤和添加操作相同;

image-20200619171618945

image-20200619171822179

image-20200619171847166

开始模拟内存使用超过200M后邮件报警

测试:agent01.zabbix主机测试邮件报警情况

[root@agent01 ~]# dd if=/dev/zero of=/opt/lemon.txt bs=1G count=10 &

这时会超过在上面表达式中写的200M,接着就会邮件警报、向lemon_row@163.com发送邮件警报信息,每隔60秒发送一次,直到故障修复完成

  • 故障报警邮件

image-20200619222346519

  • 恢复报警邮件

image-20200619222554131

7.6 自动发现—自动添加服务器监控

什么是自动发现?

  • 会自动添加主机或监控项等等的规则动作

1、配置自动发现

配置–>自动发现–>创建发现规则

image-20200619223035841

image-20200619223456878

2、添加动作:发现主机后需要执行的操作

配置–>动作–>事件源选:自动发现–>创建动作:

image-20200619223621979

image-20200619224021925

image-20200619224642774

image-20200619225315284

3、在agent02.zabbix主机上安装zabbix.agentd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
## 安装所需依赖包
[root@agent02 ~]# yum -y install libxml2-devel libcurl-devel pcre-devel

## 创建zabbix运行用户
[root@agent02 ~]# useradd zabbix -M -s /sbin/nologin

## 创建zabbix日志存放目录
[root@agent02 ~]# mkdir -p /usr/local/zabbix/logs

## 更改属主数组
[root@agent02 ~]# chown -R zabbix:zabbix /usr/local/zabbix/

## 解压
[root@agent02 ~]# tar xf zabbix-4.2.7.tar.gz -C /usr/src/ && cd /usr/src/zabbix-4.2.7

## 配置
[root@agent02 zabbix-4.2.7]# ./configure --prefix=/usr/local/zabbix --enable-agent --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2

## 编译、安装
[root@agent02 zabbix-4.2.7]# make && make install && cd

## 备份文件
[root@agent02 ~]# cp /usr/local/zabbix/etc/zabbix_agentd.conf /opt/zabbix_agentd.conf.bak

## 编辑配置文件
[root@agent02 ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
LogFile=/usr/local/zabbix/logs/zabbix_agent.log
PidFile=/usr/local/zabbix/logs/zabbix_agent.pid
Server=192.168.2.1
ServerActive=192.168.2.1
Hostname=agent02.zabbix # 这里一定要和本机的名称一致
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf

## 启动agent端
[root@agent02 ~]# /usr/local/zabbix/sbin/zabbix_agentd
[root@agent02 ~]# netstat -utpln |grep zabbix
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 24736/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 24736/zabbix_agentd

## 加入开机启动项
[root@agent02 ~]# chmod a+x /etc/rc.d/rc.local
[root@agent02 ~]# echo '/usr/local/zabbix/sbin/zabbix_agentd' >> /etc/rc.local

4、耐心等待一段时间验证就OK了

image-20200619231534483

image-20200619230335497

image-20200619230516373

7.7 Zabbix聚合图形

检测–>聚合图形–>创建聚合图形

image-20200619231148577

image-20200619231234106

image-20200619231329998

image-20200619231425604

image-20200619232128949

image-20200619232240570

image-20200619232254439

image-20200619232521828

image-20200619232714454

7.8 安装并配置Grafana的web界面

Grafana简介

官网:https://grafana.com

Grafana是一个可视化面板(Dashboard)有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。以InfluxDB(由go语言编写,是一个开源,分布式,时间序列,事件,可度量和无外部依赖的数据库)作为底层数据库;

Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@server ~]# yum -y install fontconfig freetype* urw-fonts               //安装grafana依赖
[root@server ~]# wget https://dl.grafana.com/oss/release/grafana-7.0.1-1.x86_64.rpm
[root@server ~]# yum install grafana-7.0.1-1.x86_64.rpm //安装grafana
[root@server ~]# grafana-cli plugins install alexanderzobnin-zabbix-app //安装zabbix驱动插件;很慢
installing alexanderzobnin-zabbix-app @ 3.12.2
from url: https://grafana.com/api/plugins/alexanderzobnin-zabbix-app/versions/3.12.2/download
into: /var/lib/grafana/plugins

✔ Installed alexanderzobnin-zabbix-app successfully

Restart grafana after installing plugins . <service grafana-server restart>
[root@server ~]# mkdir -p /opt/grafana/data/plugins/
[root@server ~]# cp -r /var/lib/grafana/plugins/alexanderzobnin-zabbix-app/ /opt/grafana/data/plugins/
[root@server ~]# ls /opt/grafana/data/plugins/
alexanderzobnin-zabbix-app
[root@server ~]# chmod 777 /opt/grafana/data/plugins/ -R
[root@server ~]# systemctl start grafana-server
[root@server ~]# systemctl enable grafana-server
[root@server ~]# netstat -utpln |grep 3000
tcp6 0 0 :::3000 :::* LISTEN 42924/grafana-serve

访问测试http://192.168.2.1:3000,默认用户名admin,密码admin,在此是谷歌浏览器翻译过后的界面,大家可以自行下载谷歌浏览器,下载翻译插件,在此不做过多介绍;安装grafana;http://192.168.2.1:3000/login

image-20200619234606770

image-20200619234700036

image-20200619234812921

image-20200929143318582

image-20200929143339590

image-20200929143357541

添加数据源

image-20200929143425562

image-20200929143444556

image-20200929143518789

image-20200929143545762

创建仪表盘

image-20200929143634589

创建仪表盘时指定显示的图形

image-20200929143715473

选择数据源和图中需要显示的主机和主机的监控项

image-20200929143752184

创建完,保存此仪表盘,输入仪表盘的名称

image-20200929143840271

image-20200929143856933

-------------本文结束感谢您的阅读-------------