为什么要监控?
如何去监控?
数据采集 ——》数据存储 ——》数据分析 ——》 展示和告警
监控对象:
1.监控对象的理解:CPU是怎么工作的,原理
2.监控对象的指标:CPU使用率 CPU负载 CPU个数 上下文切换
3.确定性能基准线:怎么样才算故障?CPU负载多少才算高
监控范围:
1.硬件监控 服务器的硬件故障
2.操作系统监控 CPU 内存 IO 进程
3.应用服务监控
4.业务监控
要监控什么?
监控类别 | 监控场景 |
---|---|
硬件监控 | 温度,硬件故障等 |
系统监控 | CPU,内存,硬盘,网卡流量,TCP状态,进程数 |
应用监控 | Nginx,Tomcat,PHP,MySQL,Redis等 |
日志监控 | 系统日志、服务日志、访问日志、错误日志 |
安全监控 | WAF,敏感文件监控 |
API监控 | 可用性,接口请求,响应时间 |
业务监控 | 例如电商网站,每分钟产生多少订单、注册多少用户、多少活跃用户、推广活动效果 |
流量分析 | 根据流量获取用户相关信息,例如用户地理位置、某页面访问状况、页面停留时间等 |
硬件监控:
1.使用IPMI
2.机房巡检
安装IPMI
yum install -y OpenIPMI ipmitool
使用IPMI两种方式
1.本地调用
2.远程调用 (IP地址 用户名和密码)
ipmi配置网络两种方式
1.ipmi over lan 独立
路由器和交换机:SNMP监控
安装snmp:
yum install net-snmp net-snmp-utils
使用案例:
vim /etc/snmp/snmpd.conf
snmp代理启动,就能通过代理获取SNMP数据,SNMP不需要服务端,需要各个代理启动服务即可,代理获取到数据返回给服务端。默认监控UDP的161端口
snmp-utils
[root@aliyun ~]# cd /etc/snmp/
[root@aliyun snmp]# ll
total 24
-rw------- 1 root root 18861 Jun 23 23:39 snmpd.conf
-rw------- 1 root root 220 Jun 23 23:39 snmptrapd.conf
[root@aliyun snmp]# mv snmpd.conf snmpd.conf.bak
[root@aliyun snmp]# vim snmpd.conf
[root@aliyun snmp]# cat /etc/snmp/snmpd.conf
rocommunity kolor 172.18.203.141
[root@aliyun snmp]# systemctl start snmpd
[root@aliyun snmp]# netstat -nulp | grep 161
udp 0 0 0.0.0.0:161 0.0.0.0:* 5129/snmpd
基于 TCP/IP 的网络管理包括两部分:网络管理站 (manager) 和被管理的网络单元(被管设备)。这些被管设备的共同点就是都运行 TCP/IP 协议。管理进程和代理进程之间的通信有两种方式,一种是管理进程向代理进程发出请求,询问参数值,另一种方式是代理进程主动向管理进程报告某些重要的事件。
基于 TCP/IP 的网络管理包含 3 个组成部分:
( 1 ) 一个管理信息库( MIB )。管理信息库包含所有代理进程的所有可被查询和修改的参数。
( 2 ) 关于 MIB 的公用结构和表示符号,叫做管理信息结构 SMI 。例如: SMI 定义计数器是一个非负整数,它的计数范围是 0-4294967295 ,当达到最大值后,又从 0 开始。
( 3 ) 管理进程和代理进程之间的通信协议,叫做简单网络管理协议 SNMP 。 SNMP 包括数据交换的格式等,主要采用 UDP 协议。
1 、协议: SNMP 定义了 5 种报文:
( 1 ) get-request 操作:从代理进程处提取一个或多个参数值。
( 2 ) get-next-request 操作:从代理进程处提取一个或多个参数的下一个参数值。
( 3 ) set-request 操作:设置代理进程的一个或多个参数值。
( 4 ) get-response 操作:由代理进程发出的一个或多个参数值。它是 3 种的响应操作。
( 5 ) trap 操作:代理进程主动发出的报文,通知管理进程由事情发生。
前面 3 个操作是由管理进程向代理进程发出的,后两个是代理进程发给管理进程的。
说明: ◆ 前 4 种操作是简单的请求-应答方式,由于采用 UDP 协议,因此一定要有超时和重传机制。
◆ 管理进程采用 UDP 的 161 端口,代理进程使用 UDP 的 162 端口,因此一个系统可以同时为管理进程和代理进程。
对象标识符(OID,唯一标识一个MIB对象)
对象标识是一种数据类型,它指明一种授权命名的对象。对象标识是一个整数序列,以点分隔。这些整数构成一个树型结构,类似于 DNS 和文件系统。对象标识从顶部开始,顶部没有标识,以 root 表示。所有的 MIB 变量都从 1.3.6.1.2.1 这个标识开始。树上的每个节点还有文字名,例如 1.3.6.1.2.1 就和 iso.org.dod.internet.memt.mib 对应。
iso.org.dod.internet.mgmt.mib.ip.ipInReceives
相应的数字表示(对象标识符OID,唯一标识一个MIB对象)为:
1.3.6.1.2.1.4.3
需要注意的是,MIB中的管理对象的OID有些需要动态确定,如IP路由表,为了指明地址202.120.86.71的下一站路由(next hop),我们可以引用这样的实例:
iso.org.dod.internet.mgmt.mib.ip. ipRouteTable.ipRouteEntry.ipRouteNextHop.202.120.86.71, 相应的数字表示为:1.3.6.1.2.1.4.21.1.7.202.120.86.71
2、Linux SNMP oid
Linux下常用服务器监控 对应的OID:https://blog.csdn.net/apple_llb/article/details/50494787
https://www.ibm.com/developerworks/cn/linux/l-cn-snmp/?spm=a2c4e.11153940.blogcont564652.7.44c050a2mHPaX5
如:系统的启动时间 对应的OID是 sysUpTime 1.3.6.1.2.1.1.3
[root@aliyun ~]# cat /etc/snmp/snmpd.conf
rocommunity kolor 172.18.203.141
[root@aliyun ~]# snmpget -v2c -c kolor 172.18.203.141 1.3.6.1.2.1.1.3.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2289) 0:00:22.89
如:1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
[root@aliyun ~]# snmpget -v2c -c kolor 172.18.203.141 1.3.6.1.4.1.2021.10.1.3.1
UCD-SNMP-MIB::laLoad.1 = STRING: 0.02
3、Get-request 和 Get-next-request
( 1 ) get-request 操作:从代理进程处提取一个或多个参数值。
( 2 ) get-next-request 操作:从代理进程处提取一个或多个参数的下一个参数值。
snmpwalk实现了调用get-next-request,直接获取到1分钟、5分钟、15分钟的负载情况
CPU有三个重要的概念:
top命令
3.1%us【user space】— 用户空间占用CPU的百分比。
3.1%sy【sysctl】— 内核空间占用CPU的百分比。
0.0%ni【】— 改变过优先级的进程占用CPU的百分比
93.8%id【idolt】— 空闲CPU百分比
0.0%wa【wait】— IO等待占用CPU的百分比
0.0%hi【Hardware IRQ】— 硬中断占用CPU的百分比
0.0%si【Software Interrupts】— 软中断占用CPU的百分比
确定服务类型:
确定性能基准:
CPU的两种工作状态:内核态和用户态(或者称管态和目态)
内核态
用户态
按P,按照进程的CPU使用率排序
按M,按照进程的内存使用率排序
第一行,任务队列信息,同 uptime 命令的执行结果
系统时间:21:11:19
运行时间:up 38 days,
当前登录用户: 1 user
负载均衡(uptime) load average: 0.00, 0.00, 0.00
average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
第二行,Tasks — 任务(进程)
系统现在共有多少个进程,其中处于运行中的有多少个,多少个在休眠(sleep),停止状态的有几个,僵尸状态的有0个。
总进程:137 total, 运行:1 running, 休眠:136 sleeping, 停止: 0 stopped, 僵尸进程: 0 zombie
第三行,cpu状态信息
3.1%us【user space】— 用户空间占用CPU的百分比。
3.1%sy【sysctl】— 内核空间占用CPU的百分比。
0.0%ni【】— 改变过优先级的进程占用CPU的百分比
93.8%id【idolt】— 空闲CPU百分比
0.0%wa【wait】— IO等待占用CPU的百分比
0.0%hi【Hardware IRQ】— 硬中断占用CPU的百分比
0.0%si【Software Interrupts】— 软中断占用CPU的百分比
第四行,内存状态
3880200 total,220984 free, 711236 used, 2947980 buffers【缓存的内存量】
第五行,swap交换分区信息
备注:
可用内存=free + buffer + cached
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,
第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。
纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
第六行,空行
第七行以下:各进程(任务)的状态监控
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
vmstat命令,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 0
2表示每隔两秒采集一次服务器状态,1表示只采集一次。
r 表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞,等待IO请求完成
swpd 虚拟内存(swap)已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
假如 bi,bo 长期不等于 0,表示物理内存容量太小
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。
用法:iostat [ 选项 ] [ <时间间隔> [ <次数> ]]
常用选项说明:
-c:只显示系统CPU统计信息,即单独输出avg-cpu结果,不包括device结果
-d:单独输出Device结果,不包括cpu结果
-k/-m:输出结果以kB/mB为单位,而不是以扇区数为单位
-x:输出更详细的io设备统计信息
interval/count:每次输出间隔时间,count表示输出次数,不带count表示循环输出
说明:更多选项使用使用man iostat查看
1、iostat,结果为从系统开机到当前执行时刻的统计信息
输出含义:
avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值。重点关注iowait值,表示CPU用于等待io请求的完成时间。
Device: 各磁盘设备的IO统计信息。各列含义如下:
Device: 以sdX形式显示的设备名称
tps: 每秒进程下发的IO读、写请求数量
KB_read/s: 每秒从驱动器读入的数据量,单位为K。
KB_wrtn/s: 每秒从驱动器写入的数据量,单位为K。
KB_read: 读入数据总量,单位为K。
KB_wrtn: 写入数据总量,单位为K。
[root@aliyun ~]# iostat
Linux 3.10.0-957.21.3.el7.x86_64 (aliyun) 11/09/2020 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.36 0.00 1.04 0.02 0.00 93.58
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.29 0.42 12.71 838989 25343637
2、iostat -x -k -d 1 2。每隔1S输出磁盘IO的详细详细,总共采样2次。
以上各列的含义如下:
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
重点关注参数
OMM机制
[root@aliyun ~]# free -m
total used free shared buff/cache available
Mem: 3789 1073 234 1 2481 2412
Swap: 0 0 0
[root@aliyun ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 1.0G 234M 1.5M 2.4G 2.4G
Swap: 0B 0B 0B
有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:
free -h -s 3
上面的命令每隔 3 秒输出一次内存的使用情况,直到你按下 ctrl + c。
输出简介
下面先解释一下输出的内容:
Mem 行(第二行) 是内存的使用情况。
Swap 行(第三行) 是交换空间的使用情况。
total 列 显示系统总的可用物理内存和交换空间大小。
used 列 显示已经被使用的物理内存和交换空间。
free 列 显示还有多少物理内存和交换空间可用使用。
shared 列 显示被共享使用的物理内存大小。
buff/cache 列 显示被 buffer 和 cache 使用的物理内存大小。
available 列 显示还可以被应用程序使用的物理内存大小。
buff/cache
缓存cache是用来加速从硬盘中读取数据的。一个程序读取了一个数据,先放在缓存里,下一个程序再来需要的时候,直接调用缓存即可,因为很显然内存的存取速度要大于硬盘。
缓冲buffer是用来加速向硬盘写入数据的,保存数据到硬盘,不是立刻生效,而是在内存缓冲积累到一定程度后,再全部放入硬盘,避免硬盘被频繁操作,从而影响系统的运行情况。
写数据到内存里,这个数据的内存空间称为缓冲区(buffer),写入到内存缓冲区
从内存读取数据,这个存数据的内存空间称为缓存区(cache),从内存读取缓存区
CPU ===> 内存 =>磁盘 (buffer)
CPU <= 内存 <===磁盘 (cache)
free 与 available
在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。
vmstat也可以
顺序IO 快、随机IO 慢
安装:yum install iotop
测试:dd if=/dev/zero of=/tmp/1.file bs=1M count=1000
if,从zero空文件来
of,目的文件
bs,块大小
count,数量
dd if 详解:https://blog.csdn.net/qq_33160790/article/details/77488160
1.将本地的/dev/hdb整盘备份到/dev/hdd
#dd if=/dev/hdb of=/dev/hdd
2.将/dev/hdb全盘数据备份到指定路径的image文件
#dd if=/dev/hdb of=/root/image
3.将备份文件恢复到指定盘
#dd if=/root/image of=/dev/hdb
4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
#dd if=/dev/hdb | gzip > /root/image.gz
5.将压缩的备份文件恢复到指定盘
#gzip -dc /root/image.gz | dd of=/dev/hdb
6.备份与恢复MBR
备份磁盘开始的512个字节大小的MBR信息到指定文件:
#dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
恢复:
#dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分
iftop可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等
相关参数及说明
1、iftop界面相关说明
界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。
中间的<= =>这两个左右箭头,表示的是流量的方向。
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行iftop到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量
iftop 的输出从整体上可以分为三大部分:
2、iftop相关参数
常用的参数
-i 设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n 使host信息默认直接都显示IP,如:# iftop -n
-N 使端口信息默认直接都显示端口号,如: # iftop -N
-P 使host信息及端口信息默认就都显示;
-F 显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display this message),帮助,显示参数信息
-p使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b使流量图形条默认就显示;
-f这个暂时还不太会用,过滤计算包用的;
-m设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M
进入iftop画面后的一些操作命令(注意大小写)
按h切换是否显示帮助;
按n切换显示本机的IP或主机名;
按s切换是否显示本机的host信息;
按d切换是否显示远端目标主机的host信息;
按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按N切换显示端口号或端口服务名称;
按S切换是否显示本机的端口信息;
按D切换是否显示远端目标主机的端口信息;
按p切换是否显示端口信息;
按P切换暂停/继续显示;
按b切换是否显示平均流量图形条;
按B切换计算2秒或10秒或40秒内的平均流量;
按T切换是否显示每个连接的总流量;
按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按j或按k可以向上或向下滚动屏幕显示的连接记录;
按1或2或3可以根据右侧显示的三列流量数据进行排序;
按<根据左边的本机名或IP排序;
按>根据远端目标主机的主机名或IP排序;
按o切换是否固定只显示当前的连接;
按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
按!可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
按q退出监控。
iftop 的强大之处在于它能够实时显示网络的流量状态,监控网卡流量的来源 IP 和目标地址,这对于检测服务器网络故障、流量异常是非常有用的,只需通过一个命令就能把流量异常或网络故障的原因迅速定位,因此对于运维人员来说,iftop 命令是必不可少的一个网络故障排查工具
yum install -y gcc glibc gcc-c++ pcre-devel openssl-devel
cd /usr/src/local
wget https://nginx.org/download/nginx-1.10.1.tar.gz
tar zxvf nginx-1.10.1.tar.gz
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=www
make && make install
ln -s /usr/local/nginx-1.10.1/ /usr/local/nginx
语法检查:/usr/local/nginx/sbin/nginx -t
监控宝:https://help.cloudwise.com/help/18/21/48
server {
location /nginx-status
{
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
}
在浏览器中输入nginx的地址:http://127.0.0.1/status,即可查看nginx的状态信息
Active connections – 活跃的连接数量
server accepts handled requests — 总共处理了7个连接 , 成功创建7次握手, 总共处理了36个请求。
reading — 读取客户端的连接数。
writing — 响应数据到客户端的数量。
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。
目录:
1.Zabbix是什么?
Zabbix是一款企业级的分分布式开源监控方案。能够监控服务器,网络设备,应用程序等对象。所有的报告、统计信息和配置参数都可以通过Web前端页面访问。
2.Zabbix功能?
3.Zabbix监控范畴
4.Zabbix组件和架构
https://www.bilibili.com/video/BV1Wa4y147wG?p=6
5.Zabbix术语
主机(host)
主机组(host group)
监控项(item)
值预处理(value preprocessing)
触发器(trigger)
事件(event)
事件标签(event tag)
事件关联(event correlation)
异常(problems)
异常状态更新(problem update)
动作(action)
升级(escalation)
媒介(media)
告警通知(notification)
远程命令(remote command)
模版(template)
应用(application)
Web场景(web scenario)
前端(frontend)
仪表板(dashboard)
组件(widget)
Zabbix API
Zabbix server
Zabbix agent
Zabbix proxy
加密(encryption)
网络自动发现(network discovery)
低级别自动发现(low-level discovery)
低级别自动发现规则(low-level discovery rule)
监控项原型(item prototype)
触发器原型(trigger prototype)
还有其他的一些Zabbix 实体原型也被用于自动发现中——图表原型,主机原型,主机组原型,应用原型。
agent自动注册(agent auto-registration)
1.安装要求
2.部署Zabbix服务端
3.用户和用户组
部署MySQL
YUM部署Zabbix服务器
源码编译部署Zabbix服务器
1.安装MySQL
部署文档:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
# yum -y install yum-utils
# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
默认启用的是MySQL 8.0
# yum-config-manager --disable mysql80-community
# yum-config-manager --enable mysql57-community
# yum install mysql-community-server
# systemctl start mysqld
# systemctl status mysqld
# grep 'temporary password' /var/log/mysqld.log
# mysql -uroot -p
初始化
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Zabbix2020@';
# vi /etc/my.cnf
[mysql]
socket = /tmp/mysql.sock
[mysqld]
user = mysql
port = 3306
datadir = /var/lib/mysql
socket = /tmp/mysql.sock
bind-address = 0.0.0.0
pid-file = /var/run/mysqld/mysqld.pid
character-set-server = utf8
collation-server = utf8_general_ci
log-error = /var/log/mysqld.log
max_connections = 10240
open_files_limit = 65535
innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 256M
# systemctl restart mysqld
2.YUM方式部署Zabbix服务器
# rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
# yum install zabbix-server-mysql zabbix-web-mysql
# yum install zabbix-agent
# mysql -uroot -p
mysql> create database zabbix;
mysql> grant all on zabbix.* to 'zabbix'@'localhost' identified by 'Zabbix2020@';
导入表结构和数据:
# cd /usr/share/doc/zabbix-server-mysql-4.0.26
# zcat create.sql.gz | mysql -uroot -p zabbix
启动Zabbix Server进程
配置数据库
# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix2020@
DBSocket=/tmp/mysql.sock
# systemctl start zabbix-server
# vi /etc/httpd/conf.d/zabbix.conf
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value always_populate_raw_post_data -1
php_value date.timezone Asia/Shanghai
# systemctl start httpd
问题一:
遇到的错误:Error connecting to database: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
解决:
方案一:
localhost 改为 127.0.0.1就好了,同时vi /etc/zabbix/zabbix_server.conf
DBHost=127.0.0.1
或者
方案二:
vim /etc/my.cnf
修改socket为:/var/lib/mysql/mysql.sock,然后重启数据库
vi /etc/zabbix/zabbix_server.conf
DBSocket=/var/lib/mysql/mysql.sock
问题而:
https://blog.csdn.net/Thanlon/article/details/106237953
3.源码编译方式部署Zabbix服务器
3.1 部署Nginx
# wget http://nginx.org/download/nginx-1.15.3.tar.gz
# yum install gcc pcre-devel openssl-devel -y
# useradd -M -s /sbin/nologin nginx
# tar zxvf nginx-1.15.3.tar.gz
# cd nginx-1.15.3
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
# make && make install
# chown nginx -R /usr/local/nginx/
# vi /usr/local/nginx/conf/nginx.conf
pid /var/run/nginx.pid;
# vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target.network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# systemctl start nginx
3.2 部署PHP
安装依赖包:
# yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel libxslt-devel
安装PHP:
# wget http://docs.php.net/distributions/php-5.6.36.tar.gz
# tar zxvf php-5.6.36.tar.gz
# cd php-5.6.36
# ./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli \
--enable-session --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --enable-xmlwriter --enable-xmlreader \
--enable-xml --enable-sockets --enable-bcmath --with-gettext
# make -j 2 && make install
# cp php.ini-production /usr/local/php/etc/php.ini
# cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf
# cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/
# vi /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.traget
[root@localhost `]# systemctl daemon-reload
# systemctl start php-fpm
# systemctl enable php-fpm
3.3 部署Zabbix Server
https://www.zabbix.com/cn/download_sources#tab:40LTS
# wget https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.25.tar.gz
# tar zxvf zabbix-4.0.25.tar.gz
# mysql -uroot -p
mysql> create database zabbix_src;
mysql> grant all on zabbix_src.* to 'zabbix_src'@'localhost' identified by 'Zabbix2020@';
导入表结构和数据:
# cd zabbix-4.0.25/database/mysql/
# mysql -uzabbix_src -p'Zabbix2020@' zabbix_src < schema.sql
# mysql -uzabbix_src -p'Zabbix2020@' zabbix_src < images.sql
# mysql -uzabbix_src -p'Zabbix2020@' zabbix_src < data.sql
# yum install libxml2-devel libcurl-devel libevent-devel net-snmp-devel mysql-community-devel -y
# groupadd zabbix
# useradd -g zabbix zabbix -s /sbin/nologin
# cd zabbix-4.0.25
# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-java --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2
# make install
# vi /usr/local/zabbix/etc/zabbix_server.conf
DBHost=localhost
DBName=zabbix_src
DBUser=zabbix_src
DBPassword=Zabbix2020@
DBSocket=/tmp/mysql.sock
# vi /usr/lib/systemd/system/zabbix_server.service
[Unit]
Description=Zabbix Server
After=syslog.target
After=network.target
[Service]
Environment="CONFFILE=/usr/local/zabbix/etc/zabbix_server.conf"
EnvironmentFile=-/etc/sysconfig/zabbix-server
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_server.pid
KillMode=control-group
ExecStart=/usr/local/zabbix/sbin/zabbix_server -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
TimeoutSec=0
[Install]
WantedBy=multi-user.target
启动Zabbix
# systemctl start zabbix_server
Server上启动Agent
# /usr/local/zabbix/sbin/zabbix_agentd
3.4 部署Zabbix Web界面
Zabbix前端使用PHP写的,所以必须运行在PHP支持的Web服务器上。
# cp zabbix-4.0.25/frontends/php/* /usr/local/nginx/html/ -rf
# vi /usr/local/php/etc/php.ini
max_execution_time = 300
memory_limit = 128M
post_max_size = 16M
upload_max_filesize = 2M
max_input_time = 300
always_populate_raw_post_data = -1
date.timezone = Asia/Shanghai
(有分号的要去掉)
# systemctl restart php-fpm
# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
问题一:nginx: [emerg] unknown log format “main” in /usr/local/nginx/conf/nginx.conf
解决办法:
打开nginx.conf,"main"错误是因为丢失了log_format选项,之前把他屏蔽掉了,修改之后问题解决。
打开IP地址直接访问到安装页面,因为上面已经设置好server,无需再加Zabbix
问题二:Please create database manually, and set the configuration parameters for connection to this database. Press “Next step” button when done.
问题来源:连接mysql的时候总是连接不上
解决方法:创建zabbix数据库的时候应该这样创建:create database zabbix character set utf8 collate utf8_bin; 重新导入数据
问题三:Cannot create the configuration file.
报错:
解决:点击Download the configuration file
vim /usr/local/nginx/html/conf/zabbix.conf.php
或者
设置 web服务器用户在zabbix网页的conf/目录具有写权限,配置文件会自动保存。
<?php
// Zabbix GUI configuration file.
global $DB;
$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = '127.0.0.1';
$DB['PORT'] = '3306';
$DB['DATABASE'] = 'zabbix_src';
$DB['USER'] = 'zabbix_src';
$DB['PASSWORD'] = 'Zabbix2020@';
// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA'] = '';
$ZBX_SERVER = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = '';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
1、部署Zabbix Agent
后期可以通过Ansible部署Agent
# rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm
# yum -y install zabbix-agent
# vi /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
Server=10.0.100.132
ListenPort=10050
ListenIP=10.0.100.134
ServerActive=10.0.100.132 # 主动向server发起的地址
Hostname=10.0.100.134 # 注意这里要和Zabbix创建主机名称一致
Include=/etc/zabbix/zabbix_agentd.d/*.conf
# systemctl start zabbix-agent
2、Server与Agentd连通性测试
[root@Zabbix-Server ~]# /usr/local/zabbix/bin/zabbix_get -s 10.0.100.134 -p 10050 -k “system.cpu.load[all,avg1]”
3、创建主机、监控项、触发器、图形和模板
创建的案例都可以在模板中找到对应的
监控类型 | 模板对象 |
---|---|
服务监控 | TemplateApp HTTP Service |
TemplateApp HTTPS Service | |
TemplateApp SSHService | |
TemplateApp Telnet Service | |
TemplateApp ICMP Service | |
硬件资源监控 | TemplateApp OS Linux |
TemplateApp OS Windows | |
数据库监控 | TemplateApp DB MySQL |
网络设备监控 | TemplateModule InterfacesSNMPv2 |
TemplateNet Network Generic DevicesSNMPv2 |
用户自定义参数
在agent端设置
[root@Zabbix-Agentd ~]# vim /etc/zabbix/zabbix_agentd.conf
[root@Zabbix-Agentd ~]# systemctl restart zabbix-agent
第一个实验测试
简单的命令:
UserParameter=echo-test,echo 123
一个更复杂的例子
UserParameter=mysql.ping,mysqladmin -uroot ping | grep -c alive
如果MySQL服务器是活动状态,代理将返回“1”,否则为0
在server进行测试
[root@Zabbix-Server ~]# /usr/local/zabbix/bin/zabbix_get -s 10.0.100.134 -p 10050 -k “echo-test”
123
第二个实验测试
Agent的 zabbix_agentd.conf
UserParameter=echo-test[*],echo $(($1+$2))
第三个实验测试
vim /tmp/up.sh
chmod +x /tmp/up.sh
if [ $1 == "available" ];then
echo 123
elif [ $1 == "used" ];then
echo 456
fi
vim /etc/zabbix/zabbix_agentd.conf
key是唯一的,不能重复。
`UserParameter=vm.memory.size2[*],/bin/bash /tmp/up.sh $1
一个简单有效的表达式看起来像::
{
{10.0.100.134:vm.memory.size[total].last()}<20G
示例1:来自www.zabbix.com主机的最后一次负载值大于5时进入PROBLEM状态
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5
示例2:在5分钟内CPU iowait平均负载大于20时进入PROBLEM状态
{www.zabbix.com:system.cpu.util[,iowait].avg(5m)}>20
示例3:当负载大于5或者最近10分钟内负载大于2时进入PROBLEM状态
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
示例4:当文件/etc/passwd检查的checksum值与最近的值不同时进入PROBLEM状态
{www.zabbix.com:system.vfs.file.cksum[/etc/passwd].diff()}=1
示例5:当网卡“eth0”在5分钟内接收的字节大于100KB时进入PROBLEM状态
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
示例6:在30分钟内超过5次不可达时进入PROBLEM状态
{zabbix.zabbix.com:net.icmping.count(30m,0)} > 5
示例7:在5分钟内未收到数据进入PROBLEM状态
{zabbix.zabbix.com:agent.ping.nodata(5m)} = 1
根据支持的事件源定义操作:
②配置——》动作——》创建操作——》可设置指定的媒介类型
③管理——》报警媒介类型——》设置媒介账号和密码
④管理——》用户——》报警媒介——》设置收件人账号
⑤设置触发器
⑥查看验证
Login denied: Authentication failed: 535
因为发邮件的是授权码,而不是普通的密码
⑦将邮件信息格式化一下
配置——》动作——》操作
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
步骤:编写通知脚本——》创建媒体类型——》用户指定媒介类型
①配置邮件信息
# yum -y install mailx
# vi /etc/mail.rc # 添加邮件信息
set from=123qq.com smtp=smtp.qq.com
set smtp-auth-user=123@qq.com smtp-auth-password=hxxxx
set smtp-auth=login
# echo "this is test mail." | mail -s "test mail" [email protected]
②编写告警脚本
Zabbix找到告警脚本的位置可进行设置:
[root@Zabbix-Server ~]# vim /usr/local/zabbix/etc/zabbix_server.conf
AlertScriptsPath=
# vim /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh
#! /bin/bash
to=$1
subject=$2
body=$3
FILE=/tmp/mail.tmp
echo "$body" > $FILE
dos2unix -k $FILE # 解决正文变成附件.bin
mail -s "$subject" "$to" < $FILE
# yum -y install dos2unix
# chmod +x /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh
# ./sendmail.sh [email protected] zabbix "zabbix test"
Zabbix提供参数进行传参,收件人,主题,正文
给予mail.tmp,Zabbix权限
# chown zabbix.zabbix /tmp/mail.tmp
⑤配置——》动作 设置好
配置——》主机——》触发器条件设置
等待1~2分钟
步骤:钉钉自定义机器人——》编写通知脚本——》创建媒体类型——》用户指定媒介类型
①钉钉是基于群聊去通知的,添加机器人
https://oapi.dingtalk.com/robot/send?access_token=d27fa26b37655bcc1503294e9eb2ede3212a94969fc4adc42de1537d16a72b9e
②编写通知脚本
[root@Zabbix-Server ~]# vim /usr/local/zabbix/share/zabbix/alertscripts/dingding.py
[root@Zabbix-Server ~]# chmod +x /usr/local/zabbix/share/zabbix/alertscripts/dingding.py
[root@Zabbix-Server ~]# yum install python-requests
dingding.py
#! /usr/bin/python
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=d27fa26b37655bcc1503294e9eb2ede3212a94969fc4adc42de1537d16a72b9e"
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
"186..."
],
"isAtAll": False
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
[root@Zabbix-Server ~]# cd /usr/local/zabbix/share/zabbix/alertscripts/
[root@Zabbix-Server alertscripts]# chmod +x dingding.py
[root@Zabbix-Server alertscripts]# ./dingding.py test
{“errcode”:310000,“errmsg”:“keywords not in content, more: [https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq]”}
报错原因:我自定义钉钉的时候设置了关键字zabbix才触发
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
[root@Zabbix-Server alertscripts]# ./dingding.py zabbix-test
监控指标
步骤:
创建模板:A ——》 在模板A中:创建Web scenarios ——》在模板A中:创建Triggers ——》主机关联模板A
⑤字体乱码调整
1.从windows下控制面板->字体->选择一种中文字库例如“楷体”,simkai.ttf
2.把它拷贝到zabbix的web端的fonts目录下例
/usr/local/nginx/html/assets/fonts/simkai.ttf
这种是YUM路径下的
/usr/share/zabbix/assets/fonts/simkai.ttf
3.修改配置文件
[root@Zabbix-Server ~]# vim /usr/local/nginx/html/include/defines.inc.php
define('ZBX_FONT_NAME', 'simkai');
define('ZBX_GRAPH_FONT_NAME', 'simkai'); // font file name
这种是YUM路径下的
# vim /usr/share/zabbix/include/defines.inc.php
define('ZBX_FONT_NAME', 'simkai');
define('ZBX_GRAPH_FONT_NAME', 'simkai'); // font file name
PS补充:
YUM方式安装:
这里一定要注意是ttf格式,而不是ttc哦。 通过mv命令修改
mv /tmp/MSYH.ttf /usr/share/zabbix/assets/fonts/
vim /usr/share/zabbix/include/defines.inc.php
找到两个FONT_NAME所在的位置
zabbix 4.2:/usr/share/zabbix/assets/fonts/
zabbix 4.0:/usr/share/zabbix/fonts/
监控指标:
步骤:
1.Tomcat开启JMX远程连接
2.安装Zabbix Java gateway并配置
3.将主机关联模板
前提:安装JDK。yum install -y java-1.8.0-openjdk.x86_64
java -version
客户机通过这种方式无需安装agentd,通过java gateway
我这里均在Server完成
①客户机Tomcat开启JMX远程连接
进入Tomcat/bin目录,修改catalina.sh,找到如下内容"#— - Execute The Requested Command",在其上方添加以下配置,此配置不需要用户名、密码
CATALINA_OPTS="
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=10.0.100.132
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
第一行:开启JMX远程连接
第二行:ip是你要监控的tomcat所在服务器的ip地址,当前IP
第三行:JMX开启的端口号,是你要开启的监控端口号。
第四行:ssl,false表示不使用ssl链接
第五行:authenticate,false表示不使用监控,即不需要用户名和密码
执行startup.sh报错,Dcom.sun.management.jmxremote: 未找到命令
-Djava.rmi.server.hostname=10.0.100.132: 未找到命令
/usr/local/jdk1.8/jdk1.8.0_201//bin/java: 没有那个文件或目录
创建软链接,再不行就卸载重新安装。 yum install java-1.8.0-openjdk* -y
重新安装JDK:
jdk-8u211-linux-x64.tar.gz下载
链接:https://pan.baidu.com/s/19Eg67jW6V5XkDAfYQ0lxhA?errmsg=Auth+Login+Sucess&errno=0&ssnerror=0&
提取码:6r5f
解压:
# tar zxvf /root/jdk-8u211-linux-x64.tar.gz
# mv jdk1.8.0_211/ /usr/local/java/
设置环境变量
追加下列内容到
# vim /etc/profile
export JAVA_HOME=/usr/local/java
export TOMCAT_HOME=/usr/local/tomcat
export JRE_HOME=/usr/local/java/jre
export PATH=$TOMCAT_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
# source /etc/profile
[root@Zabbix-Server ~]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
[root@Zabbix-Server bin]# pwd
/usr/local/tomcat/bin
[root@Zabbix-Server bin]# vim catalina.sh
CATALINA_OPTS='-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999 ##监听端口号,方便远程访问
-Dcom.sun.management.jmxremote.ssl=false ##是否对连接开启SSL加密,默认开启
-Dcom.sun.management.jmxremote.authenticate=false ##是否需要开启用户认证,默认开启
-Djava.rmi.server.hostname=10.0.100.132'
[root@Zabbix-Server bin]# sh startup.sh
[root@Zabbix-Server bin]# netstat -nltp | grep 9999
②服务器安装启动配置Zabbix java gateway
源码编译的时候直接附带上就行
YUM安装的时候就yum install zabbix-java-gateway
如果要配置:vim /usr/local/zabbix/sbin/zabbix_java/settings.sh
(这里实验无需动)
[root@Zabbix-Server ~]# cd /usr/local/zabbix/sbin/zabbix_java/
[root@Zabbix-Server zabbix_java]# sh startup.sh
[root@Zabbix-Server zabbix_java]# ps -ef | grep java
root 34813 1 4 17:54 pts/1 00:00:01 java -server -classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-4.0.25.jar -Dzabbix.pidFile=/tmp/zabbix_java.pid -Dsun.rmi.transport.tcp.responseTimeout=3000 com.zabbix.gateway.JavaGateway
root 34858 33372 0 17:55 pts/1 00:00:00 grep --color=auto java
[root@Zabbix-Server zabbix_java]# netstat -antp | grep 10052
tcp6 0 0 :::10052 :::* LISTEN 34813/java
配置zabbix连接gateway
[root@Zabbix-Server ~]# cd /usr/local/zabbix/etc/
[root@Zabbix-Server etc]# vi zabbix_server.conf
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
[root@Zabbix-Server etc]# systemctl restart zabbix_server
模板关联:Template App Generic Java JMX
链接参考:https://blog.csdn.net/ht9999i/article/details/107470628
监控指标:
active | 当前活动的客户端连接数,包括waiting连接数 |
---|---|
accepts | 已接受的客户端连接数 |
handlled | 已处理的连接总数 |
requests | 客户端请求的总数 |
reading | 正在读取请求头的当前连接数 |
writing | 将响应写回客户端的当前连接数 |
waiting | 等待请求空闲客户端的当前连接数 |
步骤:
1.编写监控数据采集脚本
2.创建模板
3.将运行Nginx的主机关联模板
这次分清服务端和客户机
①编写监控数据采集脚本
1、先进行测试
客户机启动zabbix-agent
[root@Zabbix-Agentd ~]# systemctl status zabbix-agent
服务端测试连通性
[root@Zabbix-Server bin]# /usr/local/zabbix/bin/zabbix_get -s 10.0.100.134 -p 10050 -k 'system.hostname'
Zabbix-Agentd
[root@Zabbix-Agentd ~]# vim /etc/nginx/nginx.conf
server {
listen 8080;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 10.0.100.0/24;
deny all;
}
}
[root@Zabbix-Agentd ~]# systemctl restart nginx
[root@Zabbix-Agentd ~]# curl http://10.0.100.134:8080/nginx_status
Active connections: 7
server accepts handled requests
11 11 16
Reading: 0 Writing: 1 Waiting: 6
2、编写监控数据采集脚本
[root@Zabbix-Agentd ~]# vi nginx_status.sh
#!/bin/bash
#active 当前活动的客户端连接数,包括waiting连接数
#accepts 已接受的客户端连接数
#handled 已处理的连接总数
#requests 客户端请求的总数
#reading 正在读取请求头的当前连接数
#writing 将响应写回客户端的当前连接数
#waiting 等待请求空闲客户端的当前连接数
result="/usr/bin/curl -s http://10.0.100.134:8080/nginx_status"
case $1 in
active)
$result |awk '/Active/ {print $NF}'
;;
accepts)
$result |awk 'NR==3 {print $1}'
;;
handled)
$result |awk 'NR==3 {print $2}'
;;
requests)
$result |awk 'NR==3 {print $3}'
;;
reading)
$result |awk '/Reading/ {print $2}'
;;
writing)
$result |awk '/Writing/ {print $4}'
;;
waiting)
$result |awk '/Waiting/ {print $6}'
;;
*)
echo "USAGE:$0 {active|reading|writing|waiting|accepts|handled|requests}"
esac
[root@Zabbix-Agentd ~]# sh nginx_status.sh active
1
[root@Zabbix-Agentd ~]# sh nginx_status.sh accepts
18
[root@Zabbix-Agentd ~]# mkdir -p /usr/local/zabbix_srcipts/
[root@Zabbix-Agentd ~]# mv nginx_status.sh /usr/local/zabbix_srcipts/nginx_status.sh
Agentd指定UserParameter
[root@Zabbix-Agentd ~]# vi /etc/zabbix/zabbix_agentd.conf
[root@Zabbix-Agentd ~]# systemctl restart zabbix-agent
UserParameter=nginx.status[*],/usr/local/zabbix_srcipts/nginx_status.sh $1
Server进行测试
[root@Zabbix-Server bin]# /usr/local/zabbix/bin/zabbix_get -s 10.0.100.134 -p 10050 -k 'nginx.status[accepts]'
20
图形验证
监控项设置成7个,分别获取
监控指标
步骤:
1.编写监控数据采集脚本
2.创建模板
3.将运行MySQL的主机关联模板
查询mysql最大连接数
mysql> show variables like '%max_connections%'
获取当前的连接数
mysql> show global status where Variable_name='Threads_connected';
查询流量
mysql> show global status like '%byte%';
查询缓冲池
mysql> show global status like '%buffer_pool%';
得到Innodb_buffer_pool_pages_total
查询数量
mysql> show global status like '%select%';
1、编写监控数据采集脚本
mysql> grant all on zabbix.* to ‘zabbix’@‘localhost’ identified by ‘Zabbix2020@’;
mysql使用免密码登录
[root@Zabbix-Agentd ~]# vi /etc/my.cnf
[mysql]
host=127.0.0.1
user=zabbix
password=Zabbix2020@
[mysqladmin]
host=10.0.100.134
user=zabbix
password=Zabbix2020@
mysql -N -N 参数是不显示表头
userparameter_mysql.conf 放到Include目录,会自己加载
# 连接数
UserParameter=mysql.max_connections,echo "show variables where Variable_name='max_connections';" | mysql -N | awk '{print $2}'
UserParameter=mysql.current_connections,echo "show global status where Variable_name='Thread_connected';" | mysql -N | awk '{print $2}'
# 缓冲池 换算为G
UserParameter=mysql.buffer_pool_size,echo "show variables where Variable_name='innodb_buffer_pool_size';" | mysql -N | awk '{printf "%.2f",$2/1024/1024/1024}'
UserParameter=mysql.buffer_pool_usage_percent,echo "show global status where Variable_name='Innodb_buffer_pool_pages_free' or Variable_name='Innodb_buffer_pool_pages_total';" | mysql -N | awk '{a[NR]=$2}END{print "%.1f",100-((a[1]/a[2])*100)}'
# 增删改查,两个$,表示转义,输出"$2"
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | mysql -N | awk '{print $$2}'
# 实例状态
UserParameter=mysql.ping,mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
[root@Zabbix-Agentd ~]# mv userparameter_mysql.conf /etc/zabbix/zabbix_agentd.d/
mv:是否覆盖"/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf"? y
[root@Zabbix-Agentd ~]# systemctl restart zabbix-agent
Zabbix Server服务端进行测试
[root@Zabbix-Server ~]# /usr/local/zabbix/bin/zabbix_get -s 10.0.100.134 -p 10050 -k ‘mysql.status[uptime]’
3196
2、创建模板 (创建监控项,创建图形) —— 直接选了自带的
自带的MySQL Template,已经写好了监控项
监控指标(11种连接状态):
步骤:
1.编写监控数据采集脚本
2.创建模板
3.将所有主机关联模板
1、编写监控数据采集脚本
[root@Zabbix-Agentd ~]# vi /etc/zabbix/zabbix_agentd.conf
UserParameter=tcp.status[*],ss -antp | awk '{a[$$1]++}END{print a["'$1'"]}'
awk自身变量 和 引入的外部变量不一样,外部变量需要加两个双引号和一个单引号
$$是防止转义,$$1输出$1
[root@Zabbix-Agentd ~]# systemctl restart zabbix-agent
2、创建模板
创建监控项、图形
TCP Connection status
两种情况:新采购100台服务器、已有100台服务器
新采购100台服务器
已有100台服务器
网络发现:扫描预定网段
自动注册:Agent主动向Zabbix Server注册
网络发现的好处:
Zabbix Zabbix网络发现基于以下信息:
网络发现:网络发现规则——》动作——》添加主机,添加主机到主机组,关联模板
1、Ansible部署Agent
Zabbix服务器上安装Ansible
[root@Zabbix-Server ~]# yum -y install ansible
Server上Ansible配置
[root@Zabbix-Server ~]# vi /etc/ansible/hosts
[webservers]
10.0.100.13
[root@Zabbix-Server ~]# vim zabbix_agent.yml
变量zabbix_server: 10.0.100.132 会在zabbix_agentd.conf用到
---
- hosts: webservers
vars:
- zabbix_server: 10.0.100.132
tasks:
- name: Install zabbix agent - CentOS6
yum: name=https://repo.zabbix.com/zabbix/4.0/rhel/6/x86_64/zabbix-agent-4.0.0.2-el6.x86_64.rpm state=present
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
- name: Install zabbix agent - CentOS7
yum: name=https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present
when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
- name: Copy zabbix agent configuration file
template: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf
- name: Start zabbix agent
service: name=zabbix-agent state=started enabled=true
...
[root@Zabbix-Server ~]# vim zabbix_agentd.conf.j2
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
Server={{ zabbix_server }}
ListenPort=10050
ListenIP={{ ansible_default_ipv4.address }}
ServerActive={{ zabbix_server }}
Hostname={{ ansible_default_ipv4.address }}
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UserParameter=tcp.status[*],ss -antp | awk '{a[$$1]++}END{print a["'$1'"]}'
客户端确保卸载agent才能进行测试 yum -y remove zabbix-agent,pkill zabbix_agentd,而且要删除客户端主机
[root@Zabbix-Server ~]# ansible-playbook zabbix_agent.yml -k
默认是root,建立免交互-k,统一密码
报错:Using a SSH password instead of a key is not possible because Host Key checking
解决方法:vi /etc/ansible/ansible.cfg
在文件中进行搜索定位到
:/host_key_checking
# uncomment this to disable SSH key host checking
#host_key_checking = False
修改后:
# uncomment this to disable SSH key host checking
host_key_checking = False
在客户端上测试验证
[root@Zabbix-Agentd ~]# vi /etc/zabbix/zabbix_agentd.conf
2、创建自动发现规则
配置——》自动发现——》自动发现规则——》uname
Agent主动上报——》动作(自动注册)——》添加主机、添加主机到主机组——》关联模板
1、Agent主动上报
[root@Zabbix-Agentd ~]# vim /etc/zabbix/zabbix_agentd.conf
ServerActive=10.0.100.132
如果想要更灵活,可以使用元数据
可以在zabbix_agentd.conf.j2设置后再ansible-playbook 或者 直接在agent修改/etc/zabbix/zabbix_agentd.conf
HostMetadataItem=system.uname
,返回的是Linux就自动注册
官网:docs.grafana.org/installation/rpm/
下载:https://grafana.com/grafana/download/7.1.0
服务端安装Grafana
# wget https://dl.grafana.com/oss/release/grafana-7.1.0-1.x86_64.rpm
# sudo yum install grafana-7.1.0-1.x86_64.rpm
# systemctl start grafana-server
访问地址:http://<server ip>:3000
用户名密码默认均为 admin
grafana安装zabbix连接插件
[root@Zabbix-Server ~]# grafana-cli plugins list-remote | grep zabbix
id: alexanderzobnin-zabbix-app version: 4.0.1
[root@Zabbix-Server ~]# grafana-cli plugins install alexanderzobnin-zabbix-app
[root@Zabbix-Server ~]# systemctl restart grafana-server
Plugin Error
Fetch error: 404 Not Found Instantiating http://10.0.100.132:3000/public/@grafana/ui Loading http://10.0.100.132:3000/public/plugins/alexanderzobnin-zabbix-app/datasource-zabbix/module.js Loading plugins/alexanderzobnin-zabbix-app/datasource-zabbix/module
Grafana版本不支持。因此我重新安装后正常 然后安装好Zabbix插件后,Configuration找不到Zabbix数据源,无法Add
data source
#默认情况下,未签名的插件不会加载,需要允许
#否则会出现更新插件但依旧无法找到zabbix数据源 vi /etc/grafana/grafana.ini allow_loading_unsigned_plugins = alexanderzobnin-zabbix-datasource
创建zabbix数据源,读取zabbix_api获取数据
Zabbix API地址:http://10.0.100.132/api_jsonrpc.php