v5.0 server:10051 agent:10050

一、监控软件简介

1.各种监控软件

  1. Nagios是一款企业级监控系统,其监控服务的运行状态和网络信息等,并能监视所指定的本地或远程主机服务以及参数,同时具有优秀的异常告警功能。目前,Nagios占了一定的市场份额,不过由于其未能跟上企业的需求且没有对监控数据进行有效的存储,架构扩展性也有待增强。
  2. Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合.由SoundCloud公司开发。Prometheus应该是为数不多的适合DockerMesosKubernetes环境的监控系统之一。近几年随着k8s的流行,prometheus成为了一个越来越流行的监控工具。
  3. Zabbix是一款流行的开源运维管理软件,它采用分布式监控的架构,提供网络监测、触发器、告警设置、日志记录等基本运维管理功能,同时提供了友好的管理界面,Zabbix能够监控网络中的各种设备参数和运行状况,支持对各种设备的告警参数进行灵活的阈值配置运维管理人员可以借助Zabbix快速发现和解决网络故障,保障系统平稳运行。

2.Nagios和Zabbix的区别

1.nagios图形不是特别好,也可以安装图形插件,但是仍然不够直观 
2.nagios一般情况下如果需要图形可以和cacti配合使用 
3.cacti的监控是轮询监控,效率低,图形相对nagios比较好看 
4.zabbix和nagios因为是并发监控,对cpu的要求更高 
5.zabbix在性能和功能上都强大很多 
6.zabbix的图形相当漂亮 
7.支持多种监控方式 zabbix-agent snmp 等等 
8.支持分布式监控,能监控的agent非常多 
9.zabbix有图形的web配置界面,配置简洁 
10.zabbix支持自动发现

二、Zabbix详解

1.版本

Zabbix目前最新为5.4,不过centos系统只支持8,5.0版本是最新的centos7能够支持的
课上实验为3.4

2.优点

-  开源,无软件成本投入
-  Server 对设备性能要求低
-  支持设备多,自带多种监控模板
-  支持分布式集中管理,有自动发现功能,可以实现自动化监控
-  当监控项比较多,服务器队列比较大时可以采用被动模式,被监控端主动从监控端去下载需要监控的item 然后取数据上传到监控端。 这种方式对监控端的负载比较小。
-  Api接口的支持,方便与其他系统结合

3.缺点

-  需在被监控主机上安装 agent,所有数据都存在数据库里, 产生的数据据很大,瓶颈主要在数据库。
-  项目批量修改不方便   
-  社区虽然成熟,但是中文资料相对较少,服务支持有限;
-  系统级别报警设置相对比较多,如果不筛选的话报警邮件会很多;并且自定义的项目报警需要自己设置,过程比较繁琐;
- 缺少数据汇总功能,如无法查看一组服务器平均值,需进行二次开发;

4.监控方式

(1)被动检测

相对于agent而言;server向agent请求获取配置的各监控项相关的数据,agent接收请求、获取数据并响应给server;

当zabbix-server监控主机过多时候,由于server端去搜集信息,zabbix会出现严重的性能问题,比如:
1,当监控端到一个量级的时候,web操作界面很卡,容易出现502
2,图层断裂
3,启的进程太多,即使item数量减少,以后加一定量的机器也会出现问题
所以主要往2个优化方面考虑:
1,添加proxy节点或者node模式做分布式监控
2,调整agentd为主动模式

(2)主动检测

相对于agent而言;agent向server请求与自己相关监控项配置,主动地将server配置的监控项相关的数据发送给server;
主动监控能极大节约监控server 的资源。

(3)如何开启主动

客户端zabbix-agent.conf

StartAgents=0                 ####0表示被动模式关闭,开启主动模式

需要注意,修改为主动模式,监控模板也要改变,将监控类型修改为Zabbix客户端(主动式)

5.Zabbix-proxy

Zabbix proxy 可以替Zabbix Server收集性能和可用性数据。

Zabbix Proxy是一个可以从一个或多个受监控设备收集监控数据,并将信息发送到Zabbix sever,基本上是代server工作的。所有收集的数据都在本地进行缓存,然后传送到proxy所属的Zabbix sever。
部署Proxy是可选的,但是可能非常有益于分散单个Zabbix sever的负载。 如果只有proxy收集数据,sever上的进程就会减少CPU消耗和磁盘I / O负载。 
Zabbix proxy需要使用独立的数据库。

6.Zabbix常用术语

未命名文件.png

7.自动发现

配置agent端->配置自动发现的IP范围->配置检测类型为agent客户端->设置发现动作->关联模板

三、Zabbix监控项

1.系统层

内存、swap空间、CPU、磁盘空间、I/O读写、I/O读写队列、进出口网络流量、系统中总进程数量、系统中线程的数量
以上监控项均有zabbix自带模板,还可以自定义,iptables策略更改、TCP连接数。

2.业务层

(1)Nginx

nginx需要安装模块./configure –with-http_stub_status_module ,再开启模块监控,在配置文件里添加

location /status {
                stub_status on;
                allow 127.0.0.1;
                access_log off;
        }

image.png
参数解释

Active connections: 对后端发起的活动连接数.

Server accepts handled requests: Nginx总共处理了7个连接,成功创建7次握手(证明中间没有失败的),总共处理了12个请求.

Reading: Nginx 读取到客户端的Header信息数.

Writing: Nginx 返回给客户端的Header信息数.

Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接.

nginx需要自定义的监控项包含上边的几个参数,用awk截取即可,另外还有
nginx调用的进程数:/sbin/pidof nginx | wc -l

(2)MySQL

官方自带模板,但是监控不全,可以安装个插件zabbix-percona来监控
https://www.percona.com/downloads/percona-monitoring-plugins/LATEST/

#监控MySQL版本
UserParameter=mysql.version,mysql -V | cut -f6 -d" " | sed 's/,//'
#监控MySQL进程数
UserParameter=mysql.process,ps -ef|grep "mysql"|grep -v "grep"|wc -l
#监控MySQL运行状态
UserParameter=mysql.ping,/usr/bin/mysqladmin ping|grep alive|wc -l
#监控MySQL运行时间
UserParameter=mysql.uptime,/usr/bin/mysqladmin extended-status|grep Uptime|head -1|cut -f3 -d"|"
#监控MySQL的连接数
UserParameter=mysql.Threads.connected,/usr/bin/mysqladmin extended-status|grep Threads_connected|head -1|cut -f3 -d"|"
#监控MySQL活动状态的连接数
UserParameter=mysql.Threads.running,/usr/bin/mysqladmin extended-status|grep Threads_running|head -1|cut -f3 -d"|"
#监控MySQL客户端异常中断的数值
UserParameter=mysql.aborted.clients,/usr/bin/mysqladmin extended-status|grep Aborted_clients|head -1|cut -f3 -d"|"
#监控MySQL主从状态
UserParameter=mysql.Slave.status,/usr/bin/mysqladmin extended-status|grep Slave_runnin | grep -o ON |wc -l
#监控MySQL每秒钟获得的查询量
UserParameter=mysql.questions,/usr/bin/mysqladmin extended-status | grep Questions | head -1 | cut -f3 -d"|"
#监控MySQL从数据文件里取数据的次数
UserParameter=mysql.read.rnd,/usr/bin/mysqladmin extended-status|grep Handler_read_rnd_next|head -1 | cut -f3 -d"|"
#监控MySQL往数据文件里写数据的次数
UserParameter=mysql.write.rnd,/usr/bin/mysqladmin extended-status|grep Handler_write|head -1|cut -f3 -d"|"
#监控MySQL内部COMMIT命令的个数
UserParameter=mysql.commit,/usr/bin/mysqladmin extended-status|grep Handler_commit| head -1 | cut -f3 -d"|"
#监控MySQL请求从一张表中删除行的次数。
UserParameter=mysql.delete,/usr/bin/mysqladmin extended-status|grep Handler_delete| head -1 | cut -f3 -d"|"
#监控MySQL表缓存没有命中的数量
UserParameter=mysql.Opened.tables,/usr/bin/mysqladmin extended-status|grep Opened_tables| head -1 | cut -f3 -d"|"
#监控MySQL没有使用索引查询数量
UserParameter=mysql.slowqueries,/usr/bin/mysqladmin extended-status|grep Slow_queries|cut -f3 -d"|"
#监控MySQL执行全表搜索查询的数量
UserParameter=mysql.select.scan,/usr/bin/mysqladmin extended-status|grep Select_scan|cut -f3 -d"|"

(3)Redis

监控redis主要是通过redis里的info命令,可以将info的结果导出为日志:redis-cli -p 3000 -a “info”>/redis/info.txt 从日志中截取信息

1、连接客户数
grep "connected_clients:" ${tmpFile} | awk -F ":" '{print $2}'
2、阻塞连接数
grep "blocked_clients:" ${tmpFile} | awk -F ":" '{print $2}'
3、 redis占用内存,单位Byte转成MB
grep "used_memory:" ${tmpFile} | awk -F ":" '{print $2}' | awk '{printf "%.2f",$1/1024/1024}'
4、内存峰值,单位Byte转成MB
grep "used_memory_peak:" ${tmpFile} | awk -F ":" '{print $2}' | awk '{printf "%.2f",$1/1024/1024}'
5、主从角色
grep "role:" ${tmpFile} | awk -F ":" '{print $2}' # master(主),slave(从)
6、 master_link_status
grep "master_link_status:" ${tmpFile} | awk -F ":" '{print $2}' # up down
down: Master 已经不可访问了,Slave依然运行良好,并且保留有AOF与RDB文件
7、执行命令总数和qps
grep "total_commands_processed:" ${tmpFile} | awk -F ":" '{print $2}'
计算qps需要计算两次total_commands_processed,然后除以时间差。逻辑是第一分钟将total_commands_processed的值和当时采集该值的时间保存到last.cache中,第二分钟采集的时候获取值和时间,和上次相减得到两个差值相除即可。

(4)Tomcat

zabbix-agent安装zabbix-java-gateway->配置zabbix-server调用java gateway->Tomcat开启JMX监控->zabbix-server端添加jmx监控端口
具体操作见飞哥课件,整体来说就是tomcat要开启jmx,zabbix去调用jmx监控,可以用自带的模板,当然也可以自定义监控项,但还是要去调用jmx,调用jmx可以用工具cmdline-jmxclient

获取堆内存信息:
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.15.84:8088 java.lang:type=Memory HeapMemoryUsage
获取栈内存信息:
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.15.84:8088 java.lang:type=Memory NonHeapMemoryUsage
——————–Threading —————-
获取线程数:
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.15.84:8088 java.lang:type=Threading ThreadCount
当前线程cpu时间:
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.15.84:8088 java.lang:type=Threading CurrentThreadCpuTime
当前线程用户时间:
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.15.84:8088 java.lang:type=Threading CurrentThreadUserTime
获取Java 虚拟机启动或峰值重置以来峰值活动线程计数。
java -jar cmdline-jmxclient-0.10.3.jar – 192.168.15.84:8088 java.lang:type=Threading PeakThreadCount