一、监控系统介绍
硬件-->系统-->应用
监控:
1.发现故障
2.监控业务系统业务流量
监控的两种方式:
1.有agent
2.无agent
监控应该具有的主要功能
1.周期性的数据采集
被监控的主机安装agent
不需要安装agentless
时间流数据数据项称之为一个监控的指标数据
监控模板,调用模板工具
发现能力:当增加设备时,可以自动纳入监控中
同步内置接口,来发现监控系统,从而完成自动发现新增加的主机
添加主机的方式:1.手动添加。2.自动发现
监控数据的类型的设定:1.手动添加。2.使用模板
2.数据 存储
数据存储位置,可以自主研发,也可以使用已存在在数据库,Zabbix使用的存储为MySQL或者PGSQL,存储容易成为瓶颈
3.定义阈值,发出警告
合理区间,每一项参数都需要定义一个合理的数据,超过该数据则发出警告,定义表达式,计算结构满足条件才是危险,不满足才认为正常。告警需要通过邮件等,
远程命令或脚本完成自我修复、发出警告
4.可视化
将数据流生成图标展示出来
1.cacti:采集数据,展示,存储,告警不好,结合nagios
经过定义crontab任务+snmp+rrd(roundrobin database)数据库
nagios:只报警,符合就报警,不符合就丢弃
2.Zabbix:采集数据,存储数据,告警功能,可视化,可使用grafana做可视化
3.statsd(数据采集)+influxdb(时序数据库)+grafana
4.prometheus+grafana
数据采集的方式,采集通道
1.agentless:ssh、telnet
2.agent:Zabbix agent、exporter、snmp(一般用于路由器)
二、Zabbix
架构体系:
Zabbix Server:负责接收agent发送的报告信息的核心组件,所有位置,统计数据及操作数据均由次组件进行
Zabbix Database:专用于存储所有的配置信息,收集信息等
Zabbix web GUI:通常与Server运行在同一台主机上,用来展示数据和配置监控项
Proxy:可选组件,用于分布式监控系统,代理收集监控信息,然后交给Zabbix Server
Aent:部署在被监控主机上,负责手机本地数据并发往Server或者代理端
工作架构
Zabbix Poller:周期性的获取监控服务器
poller--->监控项--->触发器-->触发时间--->行为:1.条件 2.操作 :1.远程命令 2.报警
1.主机添加到zabbix
2.定义指标项
3.定义触发器
4.定义事件
5.处理动作
zabbix逻辑组件:
主机组
主机
监控项(item)
key:实现获取监控的目标上的数据的命令或脚本的名称;
应用(application):同一类监控项的集合;
触发器(trigger):表达式;PROBLEM, OK;
事件(event):
动作(action):由条件(condition)和操作(operation)组件;
媒介(media):发送通知的通道;
通知(notification):
远程命令(remote command):
报警升级():
模板(template):快速定义被监控主机的各监控项的预设项目集合;
图形(graph):用于展示历史数据或趋势数据的图像;
屏幕(screen):由多个graph组成
功能:1.采集数据、2.存储、3.定义阈值、4.可视化
安装方式和基本配置并且启动服务
1.下载zabbix的仓库
[root@tomcat2 ~]# rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
2.安装zabbix等相关软件包,因为这里需要使用mysql数据库,所以直接安装
[root@ansible ansible]# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent mariadb-server
3.配置MySQL
[root@tomcat2 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
log_bin=mysql-bin
innodb_file_per_table=ON
skip_name=resolve=ON
max_connections = 20000
innodb_buffer_pool_size = 256M
[root@tomcat2 ~]# systemctl start mariadb
[root@tomcat2 ~]# mysql
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
mysql> quit;
4.配置zabbix_server.conf
DBPassword=password #若mysql就在本地,则只需要修改者一处配置即可
----------------------------------若数据库不在本地
# SourceIP= #监听ip
LogFileSize=0 #日志文件大小
# DBHost=localhost #数据库主机地址
DBName=zabbix #数据库名
DBUser=zabbix #zabbix数据库的用户名
DBPassword=centos #数据库密码
5.导入数据文件
[root@tomcat2 ~]# zcat /usr/share/doc/zabbix-server-mysql-3.4.10/create.sql.gz | mysql -uzabbix -p zabbix #其中-p 后面是跟的数据库名,不是密码,若需要直接给密码,则-p密码,注意:-p和密码之间不能有空格
6.修改/etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai #修改成正常时区,否则在初始化时会有问题
7.http://主机IP地址/zabbix/ 格式化即可,用户名密码默认为Admin zabbix
三、配置zabbix监控主机配置
配置/etc/zabbix/zabbix_agent.conf文件,需要授权才可以被监控,若是zabbix本机,则直接启动服务即可
接口:
ZIB、snmp、JMX(jvm虚拟机监控)、ipmi(inter智慧平台接口,在硬件级接口)
item:指标项指某一特定指标数据,数据流生成时有特定的命令获取到的时间序列数据
指标:不断变化的数据数列
指标项:key+执行命令组成
获取数据
手动添加配置监控主机
1.通过zabbix-agent
配置被监控端服务器
[root@tomcat1 yum.repos.d]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.149
[root@tomcat1 yum.repos.d]# systemctl start zabbix-agent.service
创建主机过程
各个选项的意思
一般在局域网内部需要加密,只有在跨网络在需要加密,加密浪费系统资源
资产清单配置
添加监控项:Applications监控组 items监控项,可以在key中传递参数,如system.cpu.load[percpu,avg1],在[]添加参数即可
可以手动测试需要那幢zabbix-get
zabbix-get -s 采集数据地址 -p PROT -k ”system.cpu.switches“
使用模板:内建模板,也可以在GitHub中找
告警
定义action需要在系统级别进行定义:
conditions(条件),通常是event产生,可以是多个条件
operations(操作):
remote command(远程命令)或send message(发警报),可以警报升级
传递消息:media(信道)和zabbix的用户或zabbix group,告警消息的收件地址,有与消息传递信道相匹配的收件地址
分布式监控系统
node:有单独的监控功能,数据库,一段时间后 同步给主server,若server故障,可当单独的监控使用,2.2版本以后被删除
proxy:只是代理访问数据,有数据库,代理无需配置,,数据库为临时存储,不会持久存储,需要周期性的同步server端配置
事件的定义
发送报警信息时,需要指定zabbix的用户,定义该信道收件人所需要的收件地址
发消息
1.定义信道
2.定义针对信道对应的收件地址
定义信道
定义zabbix用户与此信道匹配的收件地址
脚本存放位置:AlertScriptsPath=/usr/lib/zabbix/alertscripts/
参数:收件人,信息主体,正文
调用脚本相关
1.传递信息的通道
Eamil
Script:报警脚本,脚本存放路径:/usr/lib/zabbix/alertscripts/
zabbix服务器在调用脚本时,会想其传递三个参数
$1:经由此信道接收信息的目标;
$2:subject
$3:body
zabbix 3.0之后的版本,此三个变量定义为内部宏:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
2.收件地址
3.脚本
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr
import sys
def formatAddr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(to_list,subject,content):
mail_host = 'smtp.exmail.qq.com'
mail_user = 'USERNAME@DOMAIN.TLD'
mail_pass = 'YOUR_PASSWORD'
#以上内容根据你的实际情况进行修改
msg = MIMEText(content,'','utf-8')
msg['Subject'] = Header(subject, 'utf-8').encode()
msg['From'] = formatAddr('zabbix监控 <%s>' % mail_user).encode()
msg['to'] = to_list
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(mail_user,to_list,msg.as_string())
s.close()
return True
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])
执行自定义脚本前提
在agent需要完成的配置:
(1) zabbix用户拥有所需要的管理权限;
编辑/etc/sudoers文件,注释如下行;
# Defaults requiretty
添加如下行:
zabbix ALL=(ALL) NOPASSWD: ALL
(2) agent进程要允许执行远程命令;
编辑/etc/zabbix/zabbix_agentd.conf,设置如下配置:
EnableRemoteCommands=1
重启服务生效;
展示接口
Graph:将多个指标定义成一个张图
一个屏幕显示多个图
屏幕轮询设置,slide show
模板定义:可以是模板组,也可以链接其他模板,定义时,和定义主机一样,但是不调用,不生效
导入模板
删除模板等操作注意问题
宏:macro,预设的文本替换模式
级别:优先级别:主机--->模板---->全局
全局:administrator-->General--->Macros
模板:编辑模板--->Macros
主机:编辑主机--->Macros
类型:
内建:{MACRO_NAME},需要查询官方文档
自定义:{$MACRO_NAME}
命名方式:大写字母、数字和下划线
配置:
全局
模板宏
主机宏
监控同一个主机可以打开多路,优先选择agent
配置网络自动发现:
基于网络扫描发现指定网络中在线,然后添加主机
扫描在线主机问题,需要基于主机名来确定统一主机,然后通过判断某主机上基于哪些服务是否存在等方式来判断是否现在
步骤1.基于主机名和服务扫描在线主机
步骤2 添加主机,增加主机监控模板
步骤3.根据主机之上发现的服务,添加服务模板
主机:主机被发现、主机丢失、主机停机、主机启用
服务:
发现事件
添加网络发现,如果根据agent发现,需要想主机发送key请求
配置被发现的主机
[root@tomcat1 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.149 #指定服务器段IP地址
添加到监控主机
key的定义:
在zabbix.agent.conf端的配置文件上由用户通过UserParameter指令定义key
格式:UserParameter=key,command
实例:不带参数 定义key
UserParameter=memory.usage.used,/usr/bin/free | awk '^Mem/{print $3}'
UserParameter=memory.usage.used,/usr/bin/free | awk '^Mem/{print $4}'
手动获取数据
zabbix_get -s 192.168.1.162 -k "memory.usage.used"
网页调用key需要在key行数据
实例:带可以接受参数的定义key
UserParameter=memory.usage[*],/usr/bin/awk '/^$1/{print $$2}' /proc/meminfo
手动测试
zabbix_get -s 192.168.1.162 -k "memory.usage[参数]"
模板导入完成,必须在每一个被监控的主机上配置相对应定义key的文件
web页面监控
监控hiding站点资源下载速度,及页面相应时间,相应代码
1.哪个页面
web场景(web scenario)每个应用都定义成一个场景
web页面:每一个场景都应该监控哪些页面
内建key:
web.test.in:传输速率
web.test.time:响应时长
web.test.rsocode :响应码
主动监测和被动监测
被动检测:相对于agent而言;agent, server向agent请求获取配置的各监控项相关的数据,agent接收请求、获取数据并响应给server;
主动检测:相对于agent而言;agent(active),agent向server请求与自己相关监控项配置,主动地将server配置的监控项相关的数据发送给server;
agent端所需要基本配置:
ServerActive= #真正zabbix server端
Hostname= #报告的主机名
HostnameItem= #可以key发现主机名
zabbix自动捕获数据
zabbix_sender发送数据:
zabbix server上的某主机上,直接定义Item时随便定义一个不与其它已有key冲突的key即可,即item type为“zabbix trapper";
zabbix_sender
-z zabbix_server_ip
-p zabbix_server_port
-s zabbix_agent_hostname
-k key
-o value
配置过程
SNMP和JMX监控
SNMP:简单网络管理协议,主要用于监控交换机或路由器等
没有采集数据的服务端
linux上实现SNMP需要借助net-snmp程序包
OID:可被采集的数据取一个数字,是一个倒置的树桩结构
基于SNMP监控:
SNMP:简单网络管理协议;
agent/nms
读(get, getnext)、写(set)、trap(陷阱);
161/udp 客户端
162/udp 管理端
SNMP:
v1: 1989
v2c: 1993
v3: 1998
MIB:Management Information Base
OID:Object ID
Linux启用snmp的方法:
# yum install net-snmp提供agent的 net-snmp-utils工具程序
配置文件:
/etc/snmp/snmpd.conf
定义ACL
.1.3.6.1.2.1.
1.1.0:系统描述信息,SysDesc
1.3.0:监控时间, SysUptime
1.5.0:主机名,SysName
1.7.0:主机提供的服务,SysService
2.1.0:网络接口数目
2.2.1.2:网络接口的描述信息
2.2.1.3:网络接口类型
……
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.2 # 网络接口的相关数据
view systemview included .1.3.6.1.4.1.2021 # 系统资料负载,memory, disk io, cpu load
view systemview included .1.3.6.1.2.1.25.1.1 启动服务:
systemctl start snmpd.service
测试工具:
# snmpget -v 2c -c public HOST OID
# snmpwalk -v 2c -c public HOST OID
JMX,zabbix不能直接去jMX上获取数据,需要配置java-gateway才可以,java-gateway也是服务
tomcat主机设置:
监控tomcat:启用接口
/etc/sysconfig/tomcat或/etc/tomcat/tomcat.conf文件,添加
CATALINA_OPTS="-Djava.rmi.server.hostname=(TOMCAT_SERVER_IP指当前监听地址) -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
zabbix-java-gateway主机设置:
安装 zabbix-java-gateway程序包,启动服务;
zabbix-server端设置(需要重启服务):
JavaGateway=172.16.0.70
JavaGatewayPort=10052
StartJavaPollers=5 # 启动多少个子进程完成JMX
添加监控项:
jmx[object_name,attribute_name]
object name - 它代表MBean的对象名称
attribute name - 一个MBean属性名称,可选的复合数据字段名称以点分隔
示例:
jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
jmx的详细文档:
https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html
zabbix分布式监控
node:中间代理每一个都能独立的工作,拥有数据库,比较重量级,几乎全功能的监控数据库:现在已经不支持
proxy:没有配置,由server端分发给代理,采集到的数据临时存储,同步完成后,就删除,也需要周期性的同步数据
适用:1.负载较大 2.跨机房,因为端口不确定,所以为了方便在防火墙上单独管理
软件包 zabbix-proxy-mysql
配置步骤:
1.安装zabbix-proxy mariadb-server
2.初始化mariadb等相关信息,并且启动mariadb服务,初始化,创建相关库,授权,并且导入sql脚本
3.更改配置文件
Server=
zabbix server主机地址;
Hostname=
当前代理服务器的名称;在server添加proxy时,必须使用此处指定的名称;
需要事先确保server能解析此名称;
DBHost=
DBName=
DBUser=
DBPassword=
ConfigFrequency=10
DataSenderFrequency=1
4.将被监控端更改为proxy,将proxy改为server,在定义主机时,直接经过代理即可
调优
Database:
历史数据不要保存太长时长;
尽量让数据缓存在数据库服务器的内存中;
触发器表达式:减少使用min(), max(), avg();尽量使用last(),nodata();
数据收集:polling较慢(减少使用SNMP/agentless/agent);尽量使用trapping(agent(active));
数据类型:文本型数据处理速度较慢;尽量少收集类型为text或string类型的数据;多使用类型为numeric的;
zabbix服务器的进程:
(1) 服务器组件的数量;
alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ...
StartPollers=60 #多开几个处理请求,和cpu核心有关
StartPingers=10 #多启用几个测试连通性
...
StartDBSyncer=5 #数据同步,有多少个pollers最好配置多少个次选项
...
(2) 设定合理的缓存大小
CacheSize=8M
HistoryCacheSize=16M
HistoryIndexCacheSize=4M
TrendCacheSize=4M
ValueCacheSize=4M
(3) 数据库优化
分表:
history_*
trends*
events*
其它解决方案:
grafana:展示
collectd:收集
influxdb:存储
grafana+collectd+influxdb
prometheus:
exporter:收集
alertmanager:
grafana:展示
openfalcon