监控系统
在运维领域,监控系统即用于监控生产环境所使用的硬件、软件或者是业务的运行情况的报警系统。其能够对生产环境所产生的异常作出报警,使得管理员能够及时获知报警信息,保证业务的正常运行。
监控系统功能可以分为以下几个模块:
- 采样:即周期性地获取某个关注指标相关的数据,一个监控系统通常支持多种采样手段,常见的手段有:ssh/telnet、agent、IPMI、SNMP、JMX等等。
- 存储:即用于存储采样所收集到的数据,以便于管理员进行回溯查看。其存储的数据可分为历史数据和趋势数据,其中历史数据即每次采样所收集到的数据结果,通常保存周期为三个月到半年;而另一个趋势数据即为一段时间内的所采样的数据的最大值、最小值、平均值等数据,因数据量较小,通常保存较长的时间。监控系统常用的存储系统有Mysql、mariadb、Oracle、rrd等等。
- 报警:即当监控的对象发生异常时,系统用于通常管理员或其他相关人员的报警媒介。常用的报警媒介有:邮件、短信、微信、脚本等等。
- 展示:监控系统通过采样收集得到的数据,那么肯定得通过展示才能让管理人员更加方便的知道当前的监控项的运行情况。展示就是监控系统把数据从数据库中读取出来,然后通过统一的整理归类为标准的图形化进行输出展示,常见的展示接口有:webGUI、GUI、APP等等。
监控通道:ssh,snmp(简单网络管理协议simple network management protocol),telnet,agent,IPMI接口,...
SNMP
SNMP即Simple Network Management Protocol,简单网络管理协议,是用于在网络实体或节点之间交换管理或监控信息的协议,最通用的监控系统;只要配置了snmp的监控端,就能监控所有设备;
SNMP优点:
- 标准化协议:SNMP协议属于TCP/IP协议中的标准网络管理协议,因此其兼容大多数的网络设备。
- 认可度高/流行度高:几乎所有主流的厂商都支持SNMP,所有使用SNMP管理的设备都使用相同的管理接口以支持通用的管理消息集合。
- 可移植性高:SNMP独立于操作系统和编程语言,SNMP的功能设计是可移植的,它定义了一套核心操作集,所有支持SNMP的设备都需要支持这套操作。
- 轻量级:SNMP协议的工作不会对设备的操作或性能产生冲击,网络设备只需以极小的资源消耗和负载即可增加对SNMP的管理支持。
- 扩展性高:因为所有的SNMP管理的设备上都会支持相同的一套核心操作集,而且SNMP也支持计算机网络设备中各种类型的设备的信息交互,因此添加设备变得很简单
SNMP的监控端就是一个命令行,安装一个程序包即可;
cacti
提供简单web监控配置接口;利用snmp协议,用snmpget自动定义cron任务,到被监控主机上采样数据,cacti存储在自己的rrd(轮询)数据库中,但没有报警功能;
rrd数据库类似于一个环,一共能存储356天的数据,也就是在这个环上有365或366个固定的位置来存储每天的数据;存满之后,会覆盖最老的数据;每天的平均数据,是趋势数据;从创建的那一刻起,空间就固定了;好处是自动能清除数据;每一个数据指标就需要一个rrd;
cacti利用snmp客户端的工具像snmpget或snmpgetnext命令工具,到被监控端的agent上获取数据,然后存储咋rrd当中,周期性获取的,想查看某一天数据时,cacti提供了网页是通过php程序开发的,只要部署好了httpd、php,让php能够从rrd数据库当中加载数据,并且能即时把数据绘图,动态成图,例如每隔5秒钟或5分钟自动到rrd中加载数据,把新的数据再重新绘图;因此,这图的动态的,不断的再绘制的;但告警能力很有限;
所以,较早前cacti通常与另一个程序nagios一同实现;nagios系统能够实现对所关注的业务,能够制定合理区间,如果不在合理区间要做从软状态到硬状态变换;例如发现80端口不提供服务,采样一次为web服务down状态,连续采样3次都是down状态时,才认为从OK到problem状态发生改变;但是nagios不记录采样的数据,只记录几个窗口中的数据;例如,只记录过去到现在的8次数据;保存在内存中,一旦发现状态变化,就能实现告警操作,而nagios的告警功能非常强大;
但把cacti和nagios结合起来使用,有些不方便;
zabbix出现,就实现了上述的功能;既能实现采样、存储、告警、展示等功能;
zabbix:
LTS:长期支持维护版本:3.0,4.0
zabbix多种监控功能:
- 支持Zabbix Agent
- SNMP Agent
- IPMI Agent
- 无代理监控
- web服务监控
- 数据库监控
- zabbix内部监控
- 计算以后进行监控展示
- 客户自定义命令监控
zabbix特性
zabbix的程序架构
zabbix监控java应用时,通过java gateway组件与java应用程序通信
zabbix程序的构成 | |
---|---|
zabbix_server | 服务端守护进程 |
zabbix_agentd | agent端守护进程 |
zabbix_proxy | 代理服务器,可选组件 |
zabbix_get | 命令行工具,通常用于手动向agent发起数据采集请求;(测试数据采集) |
zabbix_sender | 命令行工具,通常运行与agent端,手动向server端发送数据 |
zabbix_java_gateway | JMX接口用到的组件,zabbix2.0引入,java网关类似于zabbix_agentd,但只用于监控java或JVM虚拟机相关程序;只能是单单向,由zabbix server从JMX来取数据 |
zabbix常用术语
zabbix常用术语 | 含义 |
---|---|
主机(host) | 要监控的网络设备;可有ip后dns名称指定 |
主机组(host group) | 主机的逻辑容器;可以包含主机和模板,但同一组内的主机模板不能互相连接,主机组通常给用户或用户组指派权限时使用 |
监控项(item) | 监控的数据指标,zabbix每一个item用一个key标识,可有用于标明的监控项,一个监控项就是一个采集指标,所以定义监控项就是定义一个key;key指明了用什么命令采集数据;这个key就是定义的采集指标或指标采集时所用到的命令的简写标识 |
触发器(trigger) | 一个表达式,用于评估某监控对象的某特定item内所接收到的数据是否在合理范围内,即阈值;接收到的数据量大于阈值时,触发器状态将从OK转变为Problem,当数据量再次回归到合理范围内时,其状态将从Problem转换回Ok |
事件(event) | 即发生的一个值得关注的事情,例如触发器的状态转变,新的agent或重新上线的agnet的自动注册等 |
动作(action) | 指对于特定事件事先定义的处理方法,通过包含操作(如发通知)和条件(何时执行操作) |
报警升级(escalation) | 发生报警或执行远程命令的自定义方案,如每隔5分钟发生一次警报,共发送5次等 |
媒介(media) | 发送通知的手动或通道,如email,Jabber或SMS等 |
通知(notification) | 通过选定的媒介向用户发送的有关某事件的信息 |
远程命令(remote command) | 预定义的命令,可在被监控主机处于某特定条件下自动执行 |
模板(template) | 用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至单个主机 |
应用(application) | 一组item相关联的集合 |
web场景(web scennario) | 用于检测web站点可用性的一个或多个HTTP请求 |
前端(frontend) | zabbix的web接口 |
zabbix server端的子进程 | |
---|---|
poller | 通用的,基于agent实现采集 |
httppoller | 执行基于http协议监控数据采集 |
housekeeper进程 | 负责清理过期数据;例如每5分钟检查一次是否有过期数据 |
pinger进程 | 探测主机是否在线 |
nodewatcher进程 | 监控节点是否在线 |
alerter | 报警器,执行报警时可分级escalator |
discoverer | 可实现自动发现 |
db_config_syncer | 与代理通信时发送数据配置同步 |
db_data_syncer | 与代理通信时发送数据同步 |
watchdog进程 | 用来监控每个子进程是否OK |
安装zabbix
配置服务端
192.168.0.103
配置MySQL
[root@zabbix ~]# yum install mariadb-server -y
[root@zabbix ~]# vim /etc/my.cnf
#添加如下两行
skip_name_resolve = ON #禁止数据库反解主机名
innodb_file_per_table = ON #开启独立表空间
[root@zabbix ~]# systemctl start mariadb.service
[root@zabbix ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
[root@zabbix ~]# systemctl enable mariadb.service #设置开机自启
[root@zabbix ~]# mysql
MariaDB [(none)]>CREATE DATABASE zabbix CHARSET 'utf8';
MariaDB [(none)]> GRANT ALL ON zabbix.* TO zbxuser@'127.0.0.1' IDENTIFIED BY 'zbxpass';
MariaDB [(none)]> GRANT ALL ON zabbix.* TO zbxuser@'192.%.%.%' IDENTIFIED BY 'zbxpass';
MariaDB [(none)]> FLUSH PRIVILEGES;
安装zabbix官方仓库
[root@zabbix ~]# yum -y install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
[root@zabbix ~]# cat /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - $basearch
baseurl=http://repo.zabbix.com/zabbix/3.0/rhel/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - $basearch
baseurl=http://repo.zabbix.com/non-supported/rhel/7/$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
安装epel源,若无wget命令,手动安装yum -y install wget
[root@zabbix ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
...
安装zabbix-server-mysql,zabbix-get
安装过程中,可能由于读条慢导致安装报错,重复执行安装命令之道进度条达100%即可
[root@zabbix ~]# yum install zabbix-server-mysql zabbix-get -y
...complete!
初始化zabbix的数据库,有专用的zabbix脚本实现
zabbix的2.0与3.0不一样,2.0有三个sql脚本而且要安装特定的固定顺序依次执行;
3.0只有一个sql脚本create.sql,需要把脚本导入到mysql数据库中;
[root@zabbix ~]# rpm -ql zabbix-server-mysql
/etc/logrotate.d/zabbix-server
/etc/zabbix/zabbix_server.conf
/usr/lib/systemd/system/zabbix-server.service
/usr/lib/tmpfiles.d/zabbix-server.conf
/usr/lib/zabbix/alertscripts
/usr/lib/zabbix/externalscripts
/usr/sbin/zabbix_server_mysql
/usr/share/doc/zabbix-server-mysql-3.0.28
/usr/share/doc/zabbix-server-mysql-3.0.28/AUTHORS
/usr/share/doc/zabbix-server-mysql-3.0.28/COPYING
/usr/share/doc/zabbix-server-mysql-3.0.28/ChangeLog
/usr/share/doc/zabbix-server-mysql-3.0.28/NEWS
/usr/share/doc/zabbix-server-mysql-3.0.28/README
/usr/share/doc/zabbix-server-mysql-3.0.28/create.sql.gz
/usr/share/man/man8/zabbix_server.8.gz
/var/log/zabbix
/var/run/zabbix
[root@zabbix ~]# cd /usr/share/doc/zabbix-server-mysql-3.0.28/
[root@zabbix ~]# gzip -d create.sql.gz
[root@zabbix ~]# mysql -uzbxuser -h127.0.0.1 -pzbxpass zabbix < /usr/share/doc/zabbix-server-mysql-3.0.28/create.sql
[root@zabbix ~]# mysql -uzbxuser -h127.0.0.1 -pzbxpass
MariaDB [(none)]> use zabbix;
Database changed
MariaDB [zabbix]> show tables;
+----------------------------+
| Tables_in_zabbix |
+----------------------------+
| acknowledges |
| actions |
| alerts |
| application_discovery |
| application_prototype |
| application_template |
......
修改zabbix配置文件
[root@zabbix ~]# cp /etc/zabbix/zabbix_server.conf zabbix_server.conf_20191013 #备份配置文件
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf
其中:
在GENERAL PARAMETERS段:
ListenPort=10051
SourceIP= 执行监控操作时,zabbix server有多个ip时,指定使用的IP,因为客户端在执行监控时要验证服务端ip的,基于ip授权;
日志设置
日志类型有三种方式:
system - syslog 写入系统日志;
file - file specified with LogFile parameter 自定义单独使用日志文件;
console - standard output 日志发往控制台,调试才使用;
LogType=file 日志类型
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0 设置日志文件大小,超过后自动滚动;0表示不滚动;
PidFile=/var/run/zabbix/zabbix_server.pid 服务端pid文件的路径;
DBHost=127.0.0.1 数据库服务器地址;如果不在当前主机此项是必须改的;
DBName=zabbix 数据库名
DBUser=zbxuser 数据库登录用户
DBPassword=zbxpass 数据库登录密码
DBSocket=/var/lib/mysql/mysql.sock 因为mysql数据库在本地,所以,此项为本土通信使用;
启动zabbix
[root@zabbix ~]# vim /etc/sysconfig/selinux #修改为disabled
SELINUX=disabled
[root@zabbix ~]# reboot
[root@zabbix ~]# systemctl stop firewalld.service
[root@zabbix ~]# systemctl disable firewalld.service
[root@zabbix ~]# systemctl start zabbix-server.service
[root@zabbix ~]# ss -tnl #10051端口开启
LISTEN 0 128 *:10051 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::10051 :::*
注意:centos7.1中trousers程序包版本不支持zabbix,所以只有centos7.2以上版本才支持,因此,需升级trousers版本到trousers-0.3.13-1.el7.x86_64.rpm,如果未安装trousers,直接yum安装
配置web端
开启node1:192.168.0.104,部署web界面
安装zabbix仓库步骤省略
[root@node1 ~]# yum install httpd php-mysql php-mbstring php-gd php-bcmath php-ldap php-xml -y
[root@node1 ~]# yum install zabbix-web zabbix-web-mysql -y
指明zabbix的时区,即配置php的时区指定;两种方式修改php时区,一个是全局php.ini,一个是zabbix在php中自己的配置文件/etc/httpd/conf.d/zabbix.conf;
[root@node1 ~]# vim /etc/httpd/conf.d/zabbix.conf
其中:
Alias /zabbix /usr/share/zabbix 路径别名,所有的zabbix页面文件是在/usr/share/zabbix文件中;
仅修改:
php_value date.timezone Asia/Shanghai
其它都是定义授权项的无需修改;
[root@node1 ~]# systemctl start httpd.service
[root@node1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
访问web界面,浏览器输入:http://192.168.0.104/zabbix
zabbix server需要改成服务端IP,图中localhost有误
安装后配置文件:/etc/zabbix/web/zabbix.conf.php
,若之前填写出现错误,可以修改
默认管理员账户/密码:admin/zabbix
配置agent
192.168.0.105
安装agent
[root@agent ~]# yum install zabbix-agent zabbix-sender -y
...
complete!
[root@agent ~]# rpm -ql zabbix-agent
/etc/logrotate.d/zabbix-agent
/etc/zabbix/zabbix_agentd.conf
/etc/zabbix/zabbix_agentd.d
/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
/usr/lib/systemd/system/zabbix-agent.service
/usr/lib/tmpfiles.d/zabbix-agent.conf
/usr/sbin/zabbix_agentd
/usr/share/doc/zabbix-agent-3.0.28
/usr/share/doc/zabbix-agent-3.0.28/AUTHORS
/usr/share/doc/zabbix-agent-3.0.28/COPYING
/usr/share/doc/zabbix-agent-3.0.28/ChangeLog
/usr/share/doc/zabbix-agent-3.0.28/NEWS
/usr/share/doc/zabbix-agent-3.0.28/README
/usr/share/doc/zabbix-agent-3.0.28/userparameter_examples.conf
/usr/share/man/man8/zabbix_agentd.8.gz
/var/log/zabbix
/var/run/zabbix
编辑配置文件
[root@agent ~]# vim /etc/zabbix/zabbix_agentd.conf
##### Passive checks related(被动检测相关的配置:agent等待server过来请求数据)
Server=192.168.0.103
可使用逗号分隔授权给哪些zabbix-server或zabbix-proxy过来采集数据的服务器地址列表;
ListenPort=10050 本机的监听端口
ListenIP=0.0.0.0 监听主机,表示本机所有地址;
StartAgents=3 启动agent进程数;
##### Active checks related(主动检测相关的配置:agent主动向server发送监控数据)
ServerActive=192.168.0.103
以逗号分隔的,当前agent主动发送监控数据过去的server端;
Hostname=node2 在zabbix主机上的主机名;
启动zabbix-agent
[root@agent ~]# systemctl start zabbix-agent.service
[root@agent ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::10050 :::*
配置监控
一次完整的简单监控配置:
host group --> host --> [application] --> item --> trigger (Events) --> (Media Type,User Group,User) --> action(conditions,operations(send message,remote script))
参数简述
主机配置:
监控主机的接口:4种
- Agent interfaces
- SNMP interfaces
- JMX interfaces
- IPMI interfaces
定义item:key+parameters
key:2种
- zabbix内建:预定义;内建key有n种分类;
type:agent(被动),agent(主动),snmp v1,... - 用户自定义:在客户端进行定义,在服务端进行添加;
采集到的信息的种类 | |
---|---|
numeric | 数值,无符号,浮点数 |
charactor | 字符串数据 |
log | 日志数据 |
text | 文本数据 |
数据的类型 | |
---|---|
boolean | 布尔型 |
octal | 八进制数据 |
decimal | 十进制数据 |
hexadecimal | 十六进制数据 |
store value | |
---|---|
AS is | 数据不做任何处理;采样的是什么就记录什么 |
Delta(Simple change) | 本次采样数据减去前一次采样数据 |
Delta(speed per second) | 本次采样数据减去前一次采样数据,而后除以采样间隔时长 |
trigger:触发器
逻辑表达式:{<server>:<item>.<function>(<parameters<)}<operator><constant>
参数 | 含义 |
---|---|
server | 主机名称 |
key | 主机上关系的相应监控项的key |
function | 评估采集到的数据是否在合理范围内所使用的函数 |
parameter | 函数参数 |
触发器所支持的函数有avg、count、change、date、dayofweek、delta、diff、iregexp、last、sum、now等
触发器定义了数据指标的阈值;通常定义不合理区间;
- OK:正常状态 --> 老版本为false;
- PROBLEM:非正常状态 --> 老版本为true;
安全连接:发邮件时是否使用安全的连接
类型 | |
---|---|
starttls | 使用smtp协议时,自动触发ssl |
ssl/tls | 需要额外配置ssl,明确指明使用smtp协议时才会调用ssl |
如果使用的是互联网上的邮件服务器,基于认证的方式,填入注册的邮箱、密码即可;
Action:动作
- conditions:触发此动作的条件,一般通过“事件”触发
- operations:触发条件满足时采取的动作
①send message
- Meida Type:传递消息的通道;
- script:用来定义信息通道,完成信息传递的脚本;
(1)脚本放置路径:在服务器端/etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alerscripts
(2)zabbix会向脚本传递三个参数:
$1:经由此信道发送的信息的接收目标;可以是邮箱地址,电话号码;
$2:信息的主题,subject;
$3:传递信息的内容;
3.x版本之后三个参数默认不再传递,需要自行定义;可以使用宏来模拟此前的行为
{ALTET.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
注意:每个信息接收人相对于此媒介来说,得配置相应的接收地址
媒介:定义告警方式的传输信息的通道
Meida Type类型 | |
---|---|
邮件,需要定义发件人邮箱地址和SMTP服务器 | |
script | 自定义脚本;必须放置在指定路径下,可调用短信网关、微信网关 |
jabber | 即时通信通用框架;基于msn、sq、Yahoo Messenger、google的GTalk的等通信软件 |
SMS | 短信(北美使用) |
Ez Texting(USA,Canada) | 商业 |
User:主要定义利用指定信道接收消息;
User Groups:用户的逻辑容器;
②remote command
功能:在agent所在的主机上运行用户指定的命令或脚本来尝试着恢复故障
-重启服务
使用IPMI接口重启服务器;
- 任何自定义脚本可完成的功能
custom script(常用)
ssh
telnet
global script
remote command中的脚本是远程执行的脚本,而sent message中media type里的脚本是用来发信息的脚本;
在被管理主机上zabbix_agentd进程是以zabbix用户身份运行的,所以要执行远程命令时,会用到管理权限,所以zabbix基于sudo的方式执行命令;
在192.168.0.105被管理终端上:
第一步:开启zabbix用户的sudo管理权限:
[root@agent ~]# visudo
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
zabbix ALL=(ALL) NOPASSWD: ALL
#Defaults requiretty #把此项注释掉,否则远程执行命令失败,表示不需要控制终端
第二步:开启zabbix server执行远程命令
[root@agent ~]# vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1 允许远程命令在本机执行
LogRemoteCommands=1 启用远程命名执行的记录日志
[root@agent ~]# systemctl restart zabbix-agent.service
[root@agent ~]# usermod -s /bin/bash zabbix
可执行的命令类型:5种方式
- IPMI
- ssh:需要提供账号、密码,一般不使用;
- telnet
- Customed Script:自定义脚本
sudo /usr/bin/systemctl restart httpd.service - Global Script
告警升级:
(1)remote command
(2)send message
在zabbix server端编辑发送邮件的脚本:
例如:
[root@agent ~]# vim /usr/lib/zabbix/alertscripts/sendmail.sh
#!/bin/bash
#
contact=$1
subject=$2
body=$3
echo "$body" | mail -s "$subject" "$contact"
[root@agent ~]# chmod +x /usr/lib/zabbix/alertscripts/sendmail.sh
[root@agent lib]# /usr/lib/zabbix/alertscripts/sendmail.sh root@localhost "test" "test body"
[root@agent lib]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Fri Nov 15 19:57 18/598 "test"
&
在web页面设置:
[root@agent ~]# vim /etc/zabbix/zabbix_server.conf
DebugLevel=5 开启调试级别