分布式监控与SNMP
分布式监控与SNMP
我们看如上的场景,我们使用zabbix,如果是在一个局域网内中,监控agent没有任何问题,但是如果夸数据中心,跨越机房了,zabbix-server和zabbix-agent之间的延迟,可能会高到服务端认为客户端机器挂掉了。
那么这里我们就得使用zabbix支持的分布式架构功能
zabbix支持proxy模式分布式,部署较为简单,proxy和zabbix-server一样,能够从被监控的主机上获取数据,且保存在本地数据库,达到一定条件之后,会吧这些数据发给zabbix-server,再进行后续的操作,例如执行触发器,发送报警等。
zabbix-server会定期将自己的配置,发送给proxy,这样保证配置都是在server上然后同步给proxy,保证分布式架构的一致性。
proxy也主要用来解决网络问题,比如公司一般会有多个IDC机房,由于网络地域原因,机房之间的互通性不太好,又可能有防火墙的问题导致zabbix-server和zabbix-server之间的连通性不好。
上图就是企业常见用法,在每个IDC机房里防止一个zabbix-proxy代理服务器用来检测本机房,这样我们只需要解决proxy和server之间的连通问题就好,zabbix-server和proxy之间的数据传输可靠性可以完全放心,proxy也会有缓存,保证数据的完整性。
分布式监控作用:
1. 分担压力,降低server负载
Agent > Proxy > Server
2. 多机房监控
上海IDC > Proxy > Server
部署分布式监控
环境准备
zabbix-server zabbix-server01 10.0.1.50 zabbix-proxy vpn_server 10.0.1.63 zabbix-agent zbz-agent01 10.0.1.51 确保三台机器的防火墙关闭 10.0.1.50 zabbix-server01 10.0.1.51 zbz-agent01 10.0.1.63 vpn_server
部署
1.确保zabbix-server配置的自动发现和自动注册都给关闭了,【注意】 2.zabbix-server 服务端无须变动,运行着就可以 3.准备vpn_server机器,部署数据库,存储agent的监控数据,最终发给server # 确保准备好了zabbix的源 # 安装使用了mysql的proxy 1.获取zabbix官方源 rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # 这一步很重要 sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo #安装 [root@vpn_server ~]# yum install zabbix-proxy-mysql zabbix-get -y 4.安装部署数据库 [root@zbz-agent01 ~]# yum install mariadb-server mariadb -y [root@vpn_server ~]# systemctl start mariadb 5.建立数据库用户 mysql create database zabbix_proxy character set utf8 collate utf8_bin; grant all privileges on zabbix_proxy.* to zabbix@'localhost' identified by 'zabbix'; flush privileges; exit 6.导入zabbix-proxy数据文件 [root@vpn_server ~]# rpm -ql zabbix-proxy-mysql /etc/logrotate.d/zabbix-proxy /etc/zabbix/zabbix_proxy.conf /usr/lib/systemd/system/zabbix-proxy.service /usr/lib/tmpfiles.d/zabbix-proxy.conf /usr/lib/zabbix/externalscripts /usr/sbin/zabbix_proxy_mysql /usr/share/doc/zabbix-proxy-mysql-5.0.2 /usr/share/doc/zabbix-proxy-mysql-5.0.2/AUTHORS /usr/share/doc/zabbix-proxy-mysql-5.0.2/COPYING /usr/share/doc/zabbix-proxy-mysql-5.0.2/ChangeLog /usr/share/doc/zabbix-proxy-mysql-5.0.2/NEWS /usr/share/doc/zabbix-proxy-mysql-5.0.2/README /usr/share/doc/zabbix-proxy-mysql-5.0.2/schema.sql.gz /usr/share/man/man8/zabbix_proxy.8.gz /var/log/zabbix /var/run/zabbix # 导入数据 zcat /usr/share/doc/zabbix-proxy-mysql-5.0.2/schema.sql.gz |mysql -uzabbix -pzabbix zabbix_proxy 7.修改proxy配置,连接数据库 sed -i.ori '162a DBPassword=zabbix' /etc/zabbix/zabbix_proxy.conf sed -i 's#Server=127.0.0.1#Server=10.0.1.50#' /etc/zabbix/zabbix_proxy.conf sed -i 's#Hostname=Zabbix proxy#Hostname=zbz-agent01#' /etc/zabbix/zabbix_proxy.conf 8.检查zabbix-proxy配置 [root@vpn_server ~]# grep ^'[a-Z]' /etc/zabbix/zabbix_proxy.conf Server=10.0.1.50 ServerPort=10051 Hostname=vpn_server LogFile=/var/log/zabbix/zabbix_proxy.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_proxy.pid SocketDir=/var/run/zabbix DBHost=localhost DBPassword=zabbix DBName=zabbix_proxy DBUser=zabbix SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000 StatsAllowedIP=127.0.0.1 9.启动zabbix-proxy服务 systemctl restart zabbix-proxy.service
此时proxy和server已经正确可以通信了
Agent客户端配置
1.修改agent配置,指向proxy # 检查配置 [root@zbz-agent01 ~]# egrep -i '^server|^hostname' /etc/zabbix/zabbix_agent2.conf Server=10.0.1.63 ServerActive=10.0.1.63 Hostname=zbz-agent01 # 重启agent [root@zbz-agent01 ~]# systemctl restart zabbix-agent2
这一切都可以通过日志来看到结果
# 我们可以模拟,停掉zabbix-agent,查看server和proxy的日志 [root@vpn_server ~]# tail /var/log/zabbix/zabbix_proxy.log 3655:20200812:173017.815 proxy #17 started [task manager #1] 3666:20200812:173017.845 proxy #28 started [preprocessing worker #3] 3664:20200812:173017.845 proxy #26 started [preprocessing worker #1] 3665:20200812:173017.893 proxy #27 started [preprocessing worker #2] 3656:20200812:173018.854 enabling Zabbix agent checks on host "zbz-agent01": host became available 3656:20200812:173051.020 Zabbix agent item "vfs.fs.size[/,total]" on host "zbz-agent01" failed: first network error, wait for 15 seconds 3661:20200812:173106.920 Zabbix agent item "vm.memory.size[available]" on host "zbz-agent01" failed: another network error, wait for 15 seconds 3661:20200812:173121.939 Zabbix agent item "net.tcp.port[<10.0.1.51>,3306]" on host "zbz-agent01" failed: another network error, wait for 15 seconds 3661:20200812:173136.959 temporarily disabling Zabbix agent checks on host "zbz-agent01": host unavailable 3661:20200812:173236.020 enabling Zabbix agent checks on host "zbz-agent01": host became available
SNMP监控
如果我们需要监控打印机、路由器等设备,肯定不能使用 zabbix agentd,因为他们不能安装软件
还好他们一般都支持SNMP协议,这样我可以使用SNMP来监控他们.如果你希望使用SNMP-agent来获取这些设备的信息
那么在安装 zabbix server 的时候你需要增加 snmp 的支持,备注:SNMP 检查基于 UDP 协议。
snmp simple network manager protocol 简单网络管理协议 很多无法安装zabbix-agent的设备,都可以通过snmp协议监控
部署
1.服务端安装snmp程序 [root@zabbix-server01 ~]# yum -y install net-snmp net-snmp-utils 2.配置snmp程序 # 开启snmp的配置 sed -i.ori '57a view systemview included .1' /etc/snmp/snmpd.conf systemctl start snmpd.service 3.测试snmp命令 snmpwalk -v 2c -c public 127.0.0.1 sysname # 参数解释 # snmpwalk 类似 zabbix_get # -v 2c 指定使用snmp协议的版本 snmp分为v1 v2 v3 # -c public 指定暗号 # sysname 类似zabbix的key [root@zabbix-server01 ~]# snmpwalk -v 2c -c public 127.0.0.1 sysname SNMPv2-MIB::sysName.0 = STRING: zabbix-server01
snmp-OID
Zabbix的snmp监控还没开始讲,不过先给大家列一些snmp常用的一些OID,比如cpu、内存、硬盘什么的。
先了解这些,再使用snmp监控服务器。
SNMP代理提供大量的对象标识符(OID-Object Identifiers)。一个OID是一个唯一的键值对。该代理存放这些值并让它们可用。
用法:
[root@zabbix-server01 ~]# snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.1.5.0 SNMPv2-MIB::sysName.0 = STRING: zabbix-server01 [root@zabbix-server01 ~]# snmpwalk -v 2c -c public 127.0.0.1 .1.3.6.1.2.1.1.1.0 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix-server01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 [root@zabbix-server01 ~]#
系统参数(1.3.6.1.2.1.1) | |||
---|---|---|---|
OID | 描述 | 备注 | 请求方式 |
.1.3.6.1.2.1.1.1.0 | 获取系统基本信息 | SysDesc | GET |
.1.3.6.1.2.1.1.3.0 | 监控时间 | sysUptime | GET |
.1.3.6.1.2.1.1.4.0 | 系统联系人 | sysContact | GET |
.1.3.6.1.2.1.1.5.0 | 获取机器名 | SysName | GET |
.1.3.6.1.2.1.1.6.0 | 机器坐在位置 | SysLocation | GET |
.1.3.6.1.2.1.1.7.0 | 机器提供的服务 | SysService | GET |
.1.3.6.1.2.1.25.4.2.1.2 | 系统运行的进程列表 | hrSWRunName | WALK |
.1.3.6.1.2.1.25.6.3.1.2 | 系统安装的软件列表 | hrSWInstalledName | WALK |
网络接口(1.3.6.1.2.1.2) | ||||
---|---|---|---|---|
OID | 描述 | 备注 | 请求方式 | |
.1.3.6.1.2.1.2.1.0 | 网络接口的数目 | IfNumber | GET | |
.1.3.6.1.2.1.2.2.1.2 | 网络接口信息描述 | IfDescr | WALK | |
.1.3.6.1.2.1.2.2.1.3 | 网络接口类型 | IfType | WALK | |
.1.3.6.1.2.1.2.2.1.4 | 接口发送和接收的最大IP数据报[BYTE] | IfMTU | WALK | |
.1.3.6.1.2.1.2.2.1.5 | 接口当前带宽[bps] | IfSpeed | WALK | |
.1.3.6.1.2.1.2.2.1.6 | 接口的物理地址 | IfPhysAddress | WALK | |
.1.3.6.1.2.1.2.2.1.8 | 接口当前操作状态[up\ | down] | IfOperStatus | WALK |
.1.3.6.1.2.1.2.2.1.10 | 接口收到的字节数 | IfInOctet | WALK | |
.1.3.6.1.2.1.2.2.1.16 | 接口发送的字节数 | IfOutOctet | WALK | |
.1.3.6.1.2.1.2.2.1.11 | 接口收到的数据包个数 | IfInUcastPkts | WALK | |
.1.3.6.1.2.1.2.2.1.17 | 接口发送的数据包个数 | IfOutUcastPkts | WALK | |
CPU及负载 | ||||
OID | 描述 | 备注 | 请求方式 | |
. 1.3.6.1.4.1.2021.11.9.0 | 用户CPU百分比 | ssCpuUser | GET | |
. 1.3.6.1.4.1.2021.11.10.0 | 系统CPU百分比 | ssCpuSystem | GET | |
. 1.3.6.1.4.1.2021.11.11.0 | 空闲CPU百分比 | ssCpuIdle | GET | |
. 1.3.6.1.4.1.2021.11.50.0 | 原始用户CPU使用时间 | ssCpuRawUser | GET | |
.1.3.6.1.4.1.2021.11.51.0 | 原始nice占用时间 | ssCpuRawNice | GET | |
. 1.3.6.1.4.1.2021.11.52.0 | 原始系统CPU使用时间 | ssCpuRawSystem. | GET | |
. 1.3.6.1.4.1.2021.11.53.0 | 原始CPU空闲时间 | ssCpuRawIdle | GET | |
. 1.3.6.1.2.1.25.3.3.1.2 | CPU的当前负载,N个核就有N个负载 | hrProcessorLoad | WALK | |
. 1.3.6.1.4.1.2021.11.3.0 | ssSwapIn | GET | ||
. 1.3.6.1.4.1.2021.11.4.0 | SsSwapOut | GET | ||
. 1.3.6.1.4.1.2021.11.5.0 | ssIOSent | GET | ||
. 1.3.6.1.4.1.2021.11.6.0 | ssIOReceive | GET | ||
. 1.3.6.1.4.1.2021.11.7.0 | ssSysInterrupts | GET | ||
. 1.3.6.1.4.1.2021.11.8.0 | ssSysContext | GET | ||
. 1.3.6.1.4.1.2021.11.54.0 | ssCpuRawWait | GET | ||
. 1.3.6.1.4.1.2021.11.56.0 | ssCpuRawInterrupt | GET | ||
. 1.3.6.1.4.1.2021.11.57.0 | ssIORawSent | GET | ||
. 1.3.6.1.4.1.2021.11.58.0 | ssIORawReceived | GET | ||
. 1.3.6.1.4.1.2021.11.59.0 | ssRawInterrupts | GET | ||
. 1.3.6.1.4.1.2021.11.60.0 | ssRawContexts | GET | ||
. 1.3.6.1.4.1.2021.11.61.0 | ssCpuRawSoftIRQ | GET | ||
. 1.3.6.1.4.1.2021.11.62.0 | ssRawSwapIn. | GET | ||
. 1.3.6.1.4.1.2021.11.63.0 | ssRawSwapOut | GET | ||
.1.3.6.1.4.1.2021.10.1.3.1 | Load5 | GET | ||
.1.3.6.1.4.1.2021.10.1.3.2 | Load10 | GET | ||
.1.3.6.1.4.1.2021.10.1.3.3 | Load15 | GET |
内存及磁盘(1.3.6.1.2.1.25) | |||
---|---|---|---|
OID | 描述 | 备注 | 请求方式 |
.1.3.6.1.2.1.25.2.2.0 | 获取内存大小 | hrMemorySize | GET |
.1.3.6.1.2.1.25.2.3.1.1 | 存储设备编号 | hrStorageIndex | WALK |
.1.3.6.1.2.1.25.2.3.1.2 | 存储设备类型 | hrStorageType[OID] | WALK |
.1.3.6.1.2.1.25.2.3.1.3 | 存储设备描述 | hrStorageDescr | WALK |
.1.3.6.1.2.1.25.2.3.1.4 | 簇的大小 | hrStorageAllocationUnits | WALK |
.1.3.6.1.2.1.25.2.3.1.5 | 簇的的数目 | hrStorageSize | WALK |
.1.3.6.1.2.1.25.2.3.1.6 | 使用多少,跟总容量相除就是占用率 | hrStorageUsed | WALK |
.1.3.6.1.4.1.2021.4.3.0 | Total Swap Size(虚拟内存) | memTotalSwap | GET |
.1.3.6.1.4.1.2021.4.4.0 | Available Swap Space | memAvailSwap | GET |
.1.3.6.1.4.1.2021.4.5.0 | Total RAM in machine | memTotalReal | GET |
.1.3.6.1.4.1.2021.4.6.0 | Total RAM used | memAvailReal | GET |
.1.3.6.1.4.1.2021.4.11.0 | Total RAM Free | memTotalFree | GET |
.1.3.6.1.4.1.2021.4.13.0 | Total RAM Shared | memShared | GET |
.1.3.6.1.4.1.2021.4.14.0 | Total RAM Buffered | memBuffer | GET |
.1.3.6.1.4.1.2021.4.15.0 | Total Cached Memory | Memcached | GET |
.1.3.6.1.4.1.2021.9.1.2 | Path where the disk is mounted | dskPath | WALK |
.1.3.6.1.4.1.2021.9.1.3 | Path of the device for the partition | dskDevice | WALK |
.1.3.6.1.4.1.2021.9.1.6 | Total size of the disk/partion (kBytes) | dskTotal | WALK |
.1.3.6.1.4.1.2021.9.1.7 | Available space on the disk | dskAvail | WALK |
.1.3.6.1.4.1.2021.9.1.8 | Used space on the disk | dskUsed | WALK |
.1.3.6.1.4.1.2021.9.1.9 | Percentage of space used on disk | dskPercent | WALK |
.1.3.6.1.4.1.2021.9.1.10 | Percentage of inodes used on disk | dskPercentNode | WALK |
添加主机-SNMP
取消原有的主机模板,重新添加
注意点击原有的模板,【取消并清理】否则有些监控项冲突
稍微等待会,zabbix-server已然改为snmp监控了
zabbix自定义监控Nginx
zabbix本身有监控nginx的模板,可以直接使用该模板,我们再针对nginx做一些自定义的监控,主要是结合nginx的status模块添加监控。
zabbix自带的Nginx监控模板,这个我们先不用
zabbix-agent部署好nginx
1.直接yum快速安装 yum install nginx -y 2.添加nginx的status状态功能 vim /etc/nginx/nginx.conf location /status { stub_status on; access_log off; } 3.启动nginx,查看状态页 [root@zbz-agent01 ~]# curl http://10.0.1.51/status Active connections: 3 server accepts handled requests 3 3 3 Reading: 0 Writing: 1 Waiting: 2 4.监控内容解释 Active connections:当前所有处于打开状态的活动连接数(TCP连接数,即三次握手四次挥手次数) accepts : 已经接收连接数 handled : 已经处理过的连接数 requests : 已经处理过的请求数,在保持连接模式下,请求数量可能会大于连接数量 Reading: 正处于接收请求的连接数 Writing: 请求已经接收完成,处于响应过程的连接数 Waiting : 保持连接模式,处于活动状态的连接数 5.添加nginx的监控项,需要我们自定义了 [root@zbz-agent01 ~]# cd /etc/zabbix/zabbix_agent2.d/ # 作用主要是,格式化输出,取出每个指标的值 [root@zbz-agent01 zabbix_agent2.d]# cat userparameter_nginx.conf UserParameter=nginx.active,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Active' | awk '{print $NF}' UserParameter=nginx.reading,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Reading' | awk '{print $2}' UserParameter=nginx.writing,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Writing' | awk '{print $4}' UserParameter=nginx.waiting,curl -s http://127.0.0.1/status 2>/dev/null| grep 'Waiting' | awk '{print $6}' UserParameter=nginx.accepts,curl -s http://127.0.0.1/status 2>/dev/null| awk NR==3 | awk '{print $1}' UserParameter=nginx.handled,curl -s http://127.0.0.1/status 2>/dev/null| awk NR==3 | awk '{print $2}' UserParameter=nginx.requests,curl -s http://127.0.0.1/status 2>/dev/null| awk NR==3 | awk '{print $3}' 6.启动nginx和zabbix-agent服务 [root@zbz-agent01 zabbix_agent2.d]# systemctl start zabbix-agent2
zabbix-server配置
注意可能要关闭之前超哥讲解的snmp配置,还原为zbx默认agent形式
添加监控,依次添加7个
注意,关闭proxy代理,还要更改zabbix-agent的配置文件,重启服务
可以在添加好监控项之后,【测试】一下,看是否正确。
创建图形
查看图形效果
可以用ab压测命令,增大网站压力,查看zabbix图形监控
[root@zbz-agent01 zabbix_agent2.d]# yum install httpd-tools -y ab -c 100 -n 100000 http://127.0.0.1/