zabbix

开源监控工具
zabbix zennos opennms cacti nagios ganglia
zabbix
(功能)数据采集-->数据存储-->数据展示和分析-->报警
数据采集:
SNMP
agent
ICMP/SSH/IPMI
数据存储:
cacti:rrd(rrdtools)
nagios:(默认不保存数据),mysql
zabbix:mysql/pgsql/oracle
数据展示(web):
(获取数据后绘图)
报警:采集到的数据超出阈值(报警本身不是监控系统自身完成,只是触发外在能够执行报警的媒介)
mail(smtp)
Chat Message即时信息
SMS
jabber(即时通信协议)
command execution 命令执行
SNMP:simple network mangement protocol
SNMP:工作模式:
NMS向agent采集数据
agent向NMS报告数据
NMS请求agent修改配置
SNMP组件:
MIB:mangement information base 管理信息库
SMI:MIB表示符号
SNMP协议
NMS可发起的操作:
Get GetNext Set Trap
agent:Respose
UDP:
NMS:162
agent:161
状态码:
200:OK 表示客户端请求成功
400:Bad Required 由于客户端请求有语法错误,不能被服务器所理解
401:Unauthorized 请求未经授权,这个状态码必须和www-Authorized报头域一起使用
403:Forbidden 服务器收到请求,但拒绝提供服务,服务器通常会在响应正文中给出不提供服务的原因
404:NotFound 请求的资源不存在,如输入了错误的URL
500:Internal Server Error 服务器发生不可预期的错误,导致无法完成客户的请求
503:服务器当前不能够处理客户端的请求
--------------------------------------------------------------------------------------
zabbix采集:
zabbix agent
agent(active)
SNMP
SSH
zabbix存储:
用RDBMS保存(mysql/oracle)
zabbix展示:
PHP,web GUI
zabbix报警:
报警升级
确定zabbix监控对象
手动添加
自动发现
hosts(主机),hosts group(主机组)
item,application ---在线否,主机的资源,服务的连接状况,网络相关统计数据等
item:key ---在agent端key值不能重复
graph展示,screen(满屏展示)
trigger:定义一个数据指标的域值 event(事件):trigger可以生成event
action:notifiction,operation,condition
可监控的项:
CPU:load average,CPU Utilization
memory:memory utilization,swap/pagefile utilization
network:network transfer,network error/drop packet
disk:filesystem utilization,disk I/O
service:process monitoring,windows server,tcp port connectivity,tcp port response time,DNS monitoring,ntp monitoring
log:text log,eventlog
file:file monitoring
other:perforance counter
web监控:response time 响应时间
download speed 下载速度
response code 响应代码
avaliability of certain content 获取特定要求的内容
complex web scenarios with logi and logout capability
support for http and https
---------------------------------------------------------------------------------------
zabbix常用术语:
主机
主机组
监控项
触发器
事件:event ,发生的一个值得关注的事情,如触发器状态转变,新的agent或重新上线的agent自动注册
动作:只对于特定事件事先定义的处理方法,通常包含操作(如发送通知)和条件(合适执行操作)
报警升级:发送报警或执行远程命令的自定义方案
媒介:发送通知的手段或通道,如Email,Jabber,SMS
通知:通过选定的媒介向用户发送的有关某事件的信息
远程命令:remote command 预定义的命令可在被监控主机处于某特定条件下时自动执行
模板:用于快速定义被监控主机的预设条目集合,通常包含了item,trigger,graph,screen,application,以及low-level discovery rule,模板可以直接链接到单个主机
应用:item的集合
web场景:用于检测web站点可用性一个 或多个HTTP请求
Frontend:zabbix的web接口
item(监控项):仅负责收集数据;某指标对应的数据超出合理范围给相关人员发出警告信息
trigger(触发器):
一个触发器只能关联一个监控项,但一个监控项可以同时使用多个触发器;为一个监控项定义多个具有不同阈值的触发器,可以实现不同级别的报警功能;
一个触发器有一个表达式构成,定义了监控项所采取的数据的一个阈值;
一旦采集的数据超出了此触发器定义的阈值,触发器状态会装换为“problem”;当采集的数据再次回归至合理范围是,其状态重新返回到“OK”;
触发器表达式:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
server:主机名
function:评估采集到的数据是否在合理范围内所使用的函数:
支持的函数:avg,count(计数),change(改变的值的大小),date(时间),dayofweek(星期*),delta(计算两者间的差值),diff(比较),
iregexp(基于正则表达式去匹配),last(最后*采集到的值),max,min,nodate(没有采集到数据),now,sum等
parameter:函数参数:在数值参数前使用#作为前缀,则表示为最近几次的取值
eg:sum(300)表示300秒内所有取值之和,而sum(#10)表示最近10次取值之和
avg,count,last,min,max支持使用第二参数,用于完成时间限定:eg:max(1h,7d)表示返回一周之前的1h内的最大值
operator:操作符:/ * - +(算术运算) < > #(不等于) = &(与) |(或)
constant:常数值
示例:{www.magedu.com:system.cpu.load[all,avg1].last(0)}>3
表示主机www.magedu.com上所有cpu的过去1分钟的平均负载的最后一次取值大于3时将触发状态转换
last(0)相当于last(#1)
宏(macros):
抽象,根据一系列预定义的规则替换一定的文本模式,解释器或编译器在遇到宏是会自动进行模式替换(保存了字符型的数据的变量)
zabbix基于宏保存预设文本模式,并且在调用时将其替换为其中的文本;内置的宏,如:{HOST.NAME},{HOST.IP}
支持在全局,模板,主机级别使用用户自定义宏
宏可以应用在:item keys 和 description,trigger名称和表达式,主机接口IP/DNS以及端口,discovery 机制的SNMP协议的相关信息中
zabbix server processes:zabbix server端启动的进程
watchdog:监控所有的进程
housekeeper:定期清理数据
alerter:报警
poller:从被监控端获取数据
httppoller:监控web页面(如响应时间,下载速速...)的专用poller
discoverer:发现
pinger:通过ping探测节点是否在线
db_config_syncer:数据库的配置同步器
db_data_syncer:数据库的数据同步器
nodewatcher:监控节点
timer:计时器
escalator:报警升级
--------------------------------------------------------------------------
zabbix安装配置:
(1)安装数据库
# yum install mariadb-server
MariaDB [(none)]> create database zabbix default charset utf8;
MariaDB [(none)]> grant all on zabbix.* to zabbix@'localhost' identified by'123';
或MariaDB [(none)]> grant all on zabbix.* to zabbix@'192.168.1.%' identified by'123';
MariaDB [(none)]> flush privileges;
(2)安装zabbix
# yum install zabbix-server-mysql zabbix-web-mysql zabbix
# yum install zabbix-server zabbix-agent zabbix-web zabbix-get zabbix-sender
(3)导入数据库(按顺序导入)
# mysql zabbix < /usr/share/doc/zabbix-server-mysql-2.4.6/create/schema.sql
# mysql zabbix < /usr/share/doc/zabbix-server-mysql-2.4.6/create/images.sql
# mysql zabbix < /usr/share/doc/zabbix-server-mysql-2.4.6/create/data.sql
在centos7.3上,zabbix3.2版本
# zcat /usr/share/doc/zabbix-server-mysql-3.2.6/create.sql.gz |mysql -uzabbix -p123 zabbix
(4)修改配置文件
# vim /etc/zabbix/zabbix_server
ListenPort=10051
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=123
DBSocket=/var/lib/mysql/mysql.sock
# service zabbix-server restart
(5)配置zabbix的httpd子配置文件
# vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai
# service httpd restart
【# vim /etc/php.ini
date.timezone = "Asia/Shanghai"
(6)浏览器访问,并安装
1,welcome
2,Check of pre-requisites
3,Configure DB connection ---数据库用户名填zabbix,密码填123(前面授权过的),并test connection成功
4,Zabbix server details ---在name选项填上你zabbix服务器的IP或者主机名
5,Pre-Installation summary
6,install
登陆用户名为:admin 登陆密码为:zabbix (默认)
(7)zabbix-agent端
# yum install zabbix-agent zabbix-sender zabbix
# vim /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1 ---zabbix服务器的IP
ServerActive=127.0.0.1 ---zabbix服务器active check相关
ListenPort=10050
Hostname=node1.cluster.com ---设定被监控客户端的名称标识(agent主机名)
# service zabbix-agent restart
-----------------------------------------------------------------------------------------
查看zabbix server 已经定义好的key:(可用的监控项)
mysql> select key_,type from items;
(1) 创建监控项(item):
items有多种类型:
zabbix-agent:
工作模式:passive,active
网卡流量相关:
net.if.in[if,<mode>]
if:接口,如eth0
mode:bytes,packets,errors,dropped
net.if.out[if,<mode>]
net.if.total[if,<mode>]
端口相关:
net.tcp.listen[port]
net.tcp.port[<ip>,port]
net.tcp.service[service,<ip>,<port>]
net.udp.listen[port]
进程相关:
kernel.maxfiles 内核允许打开的最大文件数
kernel.maxproc 内核允许打开的最大进程数
cpu相关:
system.cpu.intr
system.cpu.load[<cpu>,<mode>] system.cpu.load[percpu,avg1],system.cpu.load[percpu,avg5],system.cpu.load[percpu,avg15]
system.cpu.num[<type>]
system.cpu.switches
system.cpu.util[<cpu>,<type>,<mode>
磁盘IO相关:
vfs.dev.read[<device><type><mode>]
vfs.dev.write[<device><type><mode>]
vfs.dev.inode[fs,<mode>]
示例:
cpu 中断数:
Name cpu interrupts
Type zabbix agent
Key system.cpu.intr
...
历史数据保留时长:采用生成的数据
历史趋势数据存储周期:每小时的最大值,最小值,平均值。统计
储存值:
As is 表示不做任何处理
delta(speed per second):每秒速率 (这次采集的数据值-上一次数据值)/时间
delta(simple change):改变的值 (这次采集的数据值-上一次数据值)
展示值:
(2) 创建图形(graph):
(3) 创建触发器(trigger):
一个trigger只能有一个item,一个item可以有多个trigger
报警级别:
Not classified:未知级别,灰色
Information:一般信息
Warning:警告信息
Average:一般故障
High:高级别故障
Disater:致命故障
模拟DDOS攻击:
# yum install hping3
# hping ping_IP faster
动作:
触发条件一般为事件:
trigger events:ok-->problem
Discovery events:zabbix的network discovery 工作时发现主机
Auto registration events:主动模式的agent注册时产生的事件
Internal events:item变成不再被支持时,或trigger变成未知状态
operations:
send message
remote command
配置send message:
(4) 定义报警方式
1>定义报警媒介
name:
Type:Email,
SMTP sever:localhost(发邮件的服务器)
SMTP helo:localhost
SMTP email:(发件人)
2>创建用户
-----------------------------------------------
自定义监控项:
server端----item.key值---agent端
server发送item.key给agent端,agent端接收key后再本地执行key生成的参数结果后返回给server端
在agent端通过定义某个命令或脚本获取所需的数据,并且返回给server端
在agent端定义:
UserParameter
UserParameter=<key>,<command>
UserParameter=<key>,<command1>,<command2> --command中只能返回一个值
示例:
UserParameter=mysql.ping,mysqladmin -uroot ping |grep -c alive
执行成功返回值为1,执行失败返回值为0
# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=memory.free,/usr/bin/free | awk '/Mem:/{print $4}'
UserParameter=memory.usage[*],/bin/cat /proc/meminfo | awk '/$1:/{print $$2}'
在server端测试:
# yum install zabbix-get
zabbix_get [-hV] -s agent_ip -p agent_port [-I IP address] -k key值
-s --host: 指定被监控端主机名或者IP
-p --port:客户端端口,默认10050
-I --source-address:指定源IP,写上zabbix server的ip地址即可,一般留空,服务器如果有多ip的时候,你指定一个。
-k --key:你想获取的key
# zabbix_get -s agent_ip -k "memory.free"
# zabbix_get -s 192.168.1.114 -k "memory.usage[MemTotal]"
# zabbix_get -s 192.168.1.114 -k "memory.usage[Buffers]"
# zabbix_get -s 192.168.1.114 -k "memory.usage[MemFree]"
创建监控项:
key值:memory.usage[MemTotal]
key值:memory.usage[Buffers]
key值:memory.usage[MemFree]
# zabbix_get -s 192.168.1.114 -k "net.if.out[eth0]"
---------------------------------------------------------------------------------
监控nginx
nginx status 开启状态页面方法:
server {
...
location /status {
stub_status on;
access_log off;
allow 192.168.1.112; #允许访问的IP
allow 127.0.0.1;
deny all;
}
}
状态页面各项数据的意义:
active connections ----当前nginx正在处理的活动连接数
serveraccepts handled requests ----总共处理了*个连接,成功创建*握手(证明中间没有失败的)
总共处理了*个请求(平均每次握手处理了*个请求)
reading ----nginx读取到客户端的Header信息数
writing ----nginx返回给客户端的Header信息数
waiting ----开启keep-alive的情况下,这个值等于:active-(reading+writing),
表示nginx已经处理完正在等待下一次请求指令的驻留连接
# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=Nginx.active[*],/usr/bin/curl -s "http://$1:$2/status" | awk '/^Active/ {print $NF}'
UserParameter=Nginx.reading[*],/usr/bin/curl -s "http://$1:$2/status" | grep 'Reading' | cut -d" " -f2
UserParameter=Nginx.writing[*],/usr/bin/curl -s "http://$1:$2/status" | grep 'Writing' | cut -d" " -f4
UserParameter=Nginx.waiting[*],/usr/bin/curl -s "http://$1:$2/status" | grep 'Waiting' | cut -d" " -f6
UserParameter=Nginx.accepted[*],/usr/bin/curl -s "http://$1:$2/status" | awk '/^[ ]+[0-9]+[ ]+[0-9]+[ ]+[0-9]+/ {print $$1}'
UserParameter=Nginx.handled[*],/usr/bin/curl -s "http://$1:$2/status" | awk '/^[ ]+[0-9]+[ ]+[0-9]+[ ]+[0-9]+/ {print $$2}'
UserParameter=Nginx.requests[*],/usr/bin/curl -s "http://$1:$2/status" | awk '/^[ ]+[0-9]+[ ]+[0-9]+[ ]+[0-9]+/ {print $$3}'
zabbix server端测试:
# zabbix_get -s 192.168.1.114 -k "Nginx.active[192.168.1.114.80]"
创建监控项:
key值:Nginx.accepted[192.168.1.114,80]
key值:Nginx.reading[192.168.1.114,80]
key值:Nginx.writing[192.168.1.114,80]
zabbix存放脚本的位置:(rpm -aq zabbix-server)
/usr/lib/zabbix/externalscripts
/etc/zabbix/externalscripts (zabbix-agent端)
UserParameter=nginx.access_countaccess,/usr/lib/zabbix/externalscripts/logcheck_nginx.accesslog totalaccess
UserParameter=nginx.access_countaccess,/usr/lib/zabbix/externalscripts/logcheck_nginx.accesslog 200access
UserParameter=nginx.access_countaccess,/usr/lib/zabbix/externalscripts/logcheck_nginx.accesslog 202access
UserParameter=nginx.access_countaccess,/usr/lib/zabbix/externalscripts/logcheck_nginx.accesslog 4xxaccess
UserParameter=nginx.access_countaccess,/usr/lib/zabbix/externalscripts/logcheck_nginx.accesslog 3xxaccess
UserParameter=nginx.access_countaccess,/usr/lib/zabbix/externalscripts/logcheck_nginx.accesslog 5xxaccess
基于SNMP监控:
被监控端:
# yum install net-snmp
# vim /etc/snmp/snmp.conf
....(类似于zabbix-agent的配置)
------------------------------------------------------------------------
自动发现规则(discovery)
discovery的前提:
agent
agentless
SNMP
包含两个阶段:discovery和action
网络发现:
基于发现的信息:IP 范围
服务:FTP,SSH,WEB,POP3,TCP...
zabbix agent
SNMP agent
(1)接口添加:
(2)配置发现action:
active -->discoverer:动作+条件+操作
配置agent 自动注册:(auto-resistration)
通常用于此前故障的agent重新上线
也可基于active agent的自动注册机制添加别动检测,通过active agent注册时提供的“ListenIP”和”ListenPOrt“进行
active -->自动注册:动作+操作
-------------------------------------------------------------------------------
web监控
先定义web方案:包括一个或多个http请求或步骤(step);步骤的执行过程按照预先定义的顺序进行执行
web监控可以获取到的信息:
整个web方案所有的步骤step的平均下载速度
失败的step号
失败的报错信息
web方案的具体步骤(step)中,可以按需使用 一下信息:
该step的下载速度
response时间
response状态码
创建web方案:
创建应用集application
创建web:1>方案
2>步骤step:Name(名称):
URL :http://192.168.1.114/index.html
Timeout(超时时间):5
Requried string:(获取到的[该页面内的某个]字符串)
Requried status(状态码):200
方案创建完成后,zabbix会自动在链接的application中添加如下监控项:
item:Download speed for scenario(下载速度) item key:web.test.in[Scenario,,bps]
type:Numeric(float)
Failed step of scenario <Scenario> (错误步骤) item key:web.test.fail[Scenario]
type:Numeric(unsigned)
Last error message of scenario <Scenario>(错误信息) item key:web.test.error[Scenario]
使用时需将Scenario和step替换为具体的名称(Scenario为web方案名称)
查看监控的web:monitoring-->web
创建触发器,报警
----------------------------------------------------------------------------------------
分布式监控
proxy 和 node
zabbix 三种架构
server-agent
server-node-agent
server-proxy-agent
两种方案:
使用代理(proxy):用于本区域数据收集,并将数据发送给server
使用节点(node):提供完整的zabbix server用以建立分布式监控中的层级
proxy模型:(仅负责收集数据并发送给master,不监控)
只有一个proxy的daemon进行,proxy也有自己的数据库(而且不能与master的数据库相同),但其数据库只会保留一定的时间,
与master server端通信是将一批信息打包后发送到master端,mater将这些数据存放到自己的数据库
特性:所有的配置变更修改只能在zabbix server端操作;
proxy 不会向server端同步configuration,只会接收;
proxy的数据库定时将数据传送给server,proxy本地数据只保存最近没有发送的数据;
node模型:
本身相当于一台zabbix server,有完整的web页面,完整的数据库,将数据源源不断的发送给master server端
特性:解决host过多时单台zabbix server面临的性能瓶颈问题;
使用多个instance;每个instance是独立的一套zabbix,有自己的database和frotend;
支持热插拔;
node定时给server端发送configuration,history,event;
server端定时给node发送configuration;
所有的配置变更只能在node节点操作,不能在server端操作;
支持树状结构;
两者的比较:
master-proxy相比于master-node的优点:
proxy压力小,数据库只存储一定的时间
master压力变小,数据库不是源源不断获取,减小IO压力
架构更清晰,易维护
--------------------------------------------------------------------------------------
zabbix-proxy-agent模式
(1)zabbix-proxy端
<1>安装软件:
# yum install zabbix zabbix-proxy zabbix-proxy-mysql
# yum install mysql(创建数据库,用户并授权)
导入数据:只需导入schema.sql即可
<2>修改配置文件
# vim /etc/zabbix_proxy.conf
Server=192.168.1.112 ---server端的IP
Hostname=node3.cluster.com
DBHost=localhost
DBName=zabbix_proxy ---proxy自己的数据库名
DBUser=zabbix_proxy
DBPassword=123
# service zabbix-proxy restart
# lsof -i:10051
(2)被监控端:
安装相应的软件
# yum install zabbix zabbix-agent zabbiz-sender
修改配置文件
# vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.1.115 ---Proxy服务器的IP
ServerActive=192.168.1.115 ---proxy服务器的IP
ListenPort=10050
Hostname=node5.cluster.com ---设定被监控客户端的名称标识(agent主机名)
# server zabbix_agent restart
(3)在zabbix server端监控:
添加监控主机
自动发现
手动添加
添加监控主机时:Monitored by proxy:(填写proxy的IP)