zabbix haproxy 监控
摘自:
http://www.tuicool.com/articles/JrYNNrm
写的非常好,步步紧逼,环环相扣。直到成功!
文章首发站点:OpensGalaxy
这是一个HAProxy的zabbix监控模板,HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy本身提供一个web页面可以显示haproxy的各种信息,方便管理员查看系统状态等。此次我采用socat(socat是netcat的扩展实现)这款开源软件通过haproxy的socks配合zabbix实现haproxy系统的状态监控。
一、安装socat
- [root@haproxy01 ~]# wget http://www.dest-unreach.org/socat/download/socat-1.7.3.0.tar.bz2
- [root@haproxy01 ~]# tar xzf socat-1.7.3.0.tar.gz
- [root@haproxy01 ~]# cd socat-1.7.3.0
- [root@haproxy01 ~]# ./configure
- [root@haproxy01 ~]# make
- [root@haproxy01 ~]# make install
- [root@haproxy01 ~]# which socat ###安装完自动会在/usr/local/bin 创建执行程序。
- /usr/local/bin/socat
二、开启haproxy sock
编辑haproxy配置文件在global下添加如下:
- global
- stats socket /usr/local/haproxy/haproxy.sock
- # 重启haproxy
Haproxy 信息
- [root@haproxy01 ~]# echo "show info" |socat /usr/local/haproxy/haproxy.sock stdio
- Name: HAProxy
- Version: 1.4.24
- Release_date: 2013/06/17
- Nbproc: 1
- Process_num: 1
- Pid: 3499
- Uptime: 2d 1h00m47s
- Uptime_sec: 176447
- Memmax_MB: 0
- Ulimit-n: 131102
- Maxsock: 131102
- Maxconn: 65535
- Maxpipes: 0
- CurrConns: 18
- PipesUsed: 0
- PipesFree: 0
- Tasks: 34
- Run_queue: 1
- node: HAProxy01
- description: haproxy server 01
Haproxy 状态
- [root@CMHAProxy01 ~]# echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio
- # pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,admin_stats,FRONTEND,,,0,1,2000,2918,1779980,133971311,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,1,,,,0,2918,0,0,0,0,,0,1,2918,,,
- admin_stats,BACKEND,0,0,0,0,2000,0,1779980,133971311,0,0,,0,0,0,0,UP,0,0,0,,0,176433,0,,1,1,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,
- test,FRONTEND,,,0,2,2000,5402,1267880,26563174,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,3,,,,0,5402,0,0,0,0,,0,3,5402,,,
- test,test1,0,0,0,1,,2701,632860,13110551,,0,,0,0,0,0,UP,3,1,0,1,0,176433,0,,1,2,1,,2701,,2,0,,2,L7OK,200,3,0,2701,0,0,0,0,0,,,,0,1,
- test,test2,0,0,0,1,,2701,635020,13452623,,0,,0,0,0,0,UP,3,1,0,0,0,176433,0,,1,2,2,,2700,,2,0,,2,L7OK,200,3,0,2701,0,0,0,0,0,,,,0,0,
- test,BACKEND,0,0,0,2,2000,5402,1267880,26563174,0,0,,0,0,0,0,UP,6,2,0,,0,176433,0,,1,2,0,,5401,,1,0,,3,,,,0,5402,0,0,0,0,,,,,0,1,
看到这里大家都明白了,我们可以通过“show stat”返回的信息,过滤出我们想要得到的监控字段数据。这里我们主要取qcur(queue数量)、scur(session数量)、bin(入站流量)、bout(出站流量)、status(后端服务器状态)、downtime(宕机总时长)、check_status(健康检测状态),自定义key收集这些数据制作相应的item,如果你想监控更多信息可以取更多的字段数据。
大家看到这些字段数据使用”,”分隔,非常方便我们用awk来过滤数据,具体自定义key见代码。首先,我们需要建立一个HAProxy模版,然后建立发现规则,来发现这些后端服务器,这样每次haproxy添加服务的时候,zabbix就会自动发现这些后端服务器、自动建立item、自动建立Graph、自动建立Trigger,一切全部自动完成。
三、Step by Step
1、建立一个haproxy模版
2、建立发现规则
key shell如下:(这里有一点需要注意,就是haproxy.sock这个文件的权限问题,默认是644,单纯执行这个shell没问题,但如果需要zabbix用户去获取返回值的时候就会提示权限不足,所以我直接将haproxy.sock设置成了666,也可以设置visudo,我为了方便直接修改了这个文件权限)
- [root@haproxy01 ~]# cat /usr/bin/has.discovery.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- printf '{\n'
- printf '\t"data":[\n'
- export LINE=$(echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep -v "^#"|grep -v "^admin_stats"|awk -F "," '{print $2}'|grep -v "^FRONTEND"|grep -v "^BACKEND"|grep -v "^$"|wc -l) ##(这里我过滤调admin_stats web管理台、FRONTEND前端、BACKEND后端 得到的是所有后端服务器的列表)
- export N=0
- #printf '\t\t{\n'
- for i in $(echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep -v "^#"|grep -v "^admin_stats"|awk -F "," '{print $2}'|grep -v "^FRONTEND"|grep -v "^BACKEND");
- do printf "\t\t\t{\"{#SNAME}\":\"$i\"}";
- N=$(($N+1))
- if [ $N -eq $LINE ]; ## 最后一行是不能加","的,所以需要if判断一下是否到了最后一行。
- then
- printf '\n'
- else
- printf ',\n'
- fi
- done;
- printf ']}\n'
执行结果如下:(zabbix的发现规则就是要返回json格式的数据)
- [root@haproxy01 haproxy]# sh /usr/bin/has.discovery.sh
- {
- "data":[
- {"{#SNAME}":"test1"},
- {"{#SNAME}":"test2"},
- {"{#SNAME}":"testapi1"},
- {"{#SNAME}":"test51"},
- {"{#SNAME}":"test52"},
- {"{#SNAME}":"testclient1"},
- {"{#SNAME}":"testclient2"},
- {"{#SNAME}":"testmobile1"},
- {"{#SNAME}":"testmobile2"}
- ]}
3、建立自定义key
+ Queue数量[qcur]
key shell如下:
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.queue.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $3}' ## 重点就是通过awk取哪个字段的数据
+ Session数量[scur]
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.session.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $5}'
+ 虚拟服务器入站流量[bin]
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.bin.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $9}'
+ 虚拟服务器出站流量[bout]
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.bout.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $10}'
+ 后端服务器状态[status]
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.status.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $18}'
+ 宕机总时长[downtime]
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.downtime.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $25}'
+ 健康检测状态[check_status]
- [root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.lastchk.sh
- #!/bin/bash
- export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $38}'
+ 定义key
- [root@haproxy01 haproxy]# cat /etc/zabbix/zabbix_agentd.d/HaProxy_status.conf
- UserParameter=has.discovery,/usr/bin/has.discovery.sh
- UserParameter=ckey.ha.bin[*],/usr/bin/ckey.ha.bin.sh $1
- UserParameter=ckey.ha.bout[*],/usr/bin/ckey.ha.bout.sh $1
- UserParameter=ckey.ha.downtime[*],/usr/bin/ckey.ha.downtime.sh $1
- UserParameter=ckey.ha.lastchk[*],/usr/bin/ckey.ha.lastchk.sh $1
- UserParameter=ckey.ha.queue[*],/usr/bin/ckey.ha.queue.sh $1
- UserParameter=ckey.ha.session[*],/usr/bin/ckey.ha.session.sh $1
- UserParameter=ckey.ha.status[*],/usr/bin/ckey.ha.status.sh $1
重启zabbix-agent
+ 验证一下:
- [root@zabbixproxy01 ~]# zabbix_get -s 192.168.1.100 -k has.discovery
- {
- "data":[
- {"{#SNAME}":"test1"},
- {"{#SNAME}":"test2"},
- {"{#SNAME}":"testapi1"},
- {"{#SNAME}":"test51"},
- {"{#SNAME}":"test52"},
- {"{#SNAME}":"testclient1"},
- {"{#SNAME}":"testclient2"},
- {"{#SNAME}":"testmobile1"},
- {"{#SNAME}":"testmobile2"}
- ]}
- [root@zabbixproxy01 ~]# zabbix_get -s 192.168.1.100 -k ckey.ha.status[test1]
- UP
其余的key验证效果大同小异,这里就不浪费篇幅一一列举了。
4、创建Graph prototypes
+ 网络流量图
+ Session
+ 健康检测状态
+ 宕机总时间
生成的Graphs效果图
5、创建Trigger prototypes
+ inbound网络流量最近5分钟内超过2Mbps
+ outbound网络流量最近5分钟内超过2Mbps
+ 后端服务器健康检测异常
+ 后端服务器宕机
这里设置一下依赖,因为服务器是否宕机依赖于健康检测状态
到此为止,全套的Haproxy监控模版就设置完成了,你可以根据你实际的需求做调整,总之这只是一个实现思路。
key shell和导出的模版下载地址如下:
大家也可以访问我的github https://github.com/EdisonWujr/zabbix-templates
zabbix haproxy 监控的更多相关文章
- Zabbix自定义监控8080端口的连接数
Zabbix自定义监控8080端口的连接数 一 zabbix自定义监控实现思路 实际上我们要想使用zabbix来监控一些服务的原理很简单,步骤分别是:1.写一个脚本用于获取待监控服务的一些状态信息2. ...
- 基于Zabbix IPMI监控服务器硬件状况
基于Zabbix IPMI监控服务器硬件状况 zabbix ipmi 公司有多个分部,且机房没有专业值班,机房等级不够.在这种情况下,又想实时监控机房环境,于是使用IPMI方式来达到目的.由于之前已经 ...
- LNMP+zabbix分布式监控搭建及版本升级
LNMP+zabbix分布式监控搭建需要组件:gcc gcc-c++ openssl* pcre pcre-devel gd gd-devel libjpeg-devel libpng-devel l ...
- zabbix服务器监控suse系统教程
zabbix服务器监控suse系统教程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 花了近一个星期才学会了如何监控window和linux主机的基本信息以及报价情况(我已经把笔记 ...
- zabbix如何监控WEB应用性能
HTTP服务目前最流行的互联网应用之一,如何监控服务的健康状态对系统运维来说至关重要. Zabbix本身提供了对WEB应用程序的监控,比如监控WEB程序的Download Speed,Respon ...
- 第3章Zabbix完整监控
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...
- zabbix添加自定义监控项
zabbix添加自定义监控项 author:headsen chen 2017-10-16 17:23:17 个人原创,转载请注明作者,出处,否则依法追究法律责任 主机端配置: 首先安装好za ...
- Docker部署Zabbix+Grafana监控
Docker部署Zabbix+Grafana监控 环境 centos 7 ; Docker 17.12.0-ce ; docker-compose version 1.20.1 2018-4-1 当前 ...
- 五 Zabbix全网监控
监控的作用 我们的职责 1.保障企业数据的安全可靠. 2.为客户提供7*24小时服务. 3.不断提升用户的体验.在关键时刻,提前提醒我们服务器要出问题了当出问题之后,可以便于找到问题的根源 ...
随机推荐
- 19. Spring Boot 添加JSP支持【从零开始学Spring Boot】
转:http://blog.csdn.net/linxingliang/article/details/52017140 这个部分比较复杂,所以单独创建一个工程来进行讲解: 大体步骤: (1) ...
- 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- 常用组件介绍 ---- Layout_weight
下面这些也可以算是组件 文本区 TextView 文本框 EditText layout 容器 view 千万不要把Layout_weight 与 Layout_width相混淆**** ...
- nodejs 简单的备份github代码初版
传送门:http://www.jianshu.com/p/002efed0d3af 我的代码: const https = require('https'); const fs = require(& ...
- apt-get update --> Bad header line (fresh install) Ign http://archive.ubuntu.com natty-security/multiverse Sources/DiffIndex W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/natty/Rele
apt-get update --> Bad header line (fresh install) fresh natty install i386 desktop. I get this e ...
- 把对象写入Postgresql中
工作中,遇到把大对象写入Postgresql数据库中 package com.geni_sage.gdme.cws.dic; import java.io.BufferedInputStream; i ...
- Trie树,又称单词查找树、字典
在百度或淘宝搜索时,每输入字符都会出现搜索建议,比如输入“北京”,搜索框下面会以北京为前缀,展示“北京爱情故事”.“北京公交”.“北京医院”等等搜索词.实现这类技术后台所采用的数据结构是什么?[中国某 ...
- iOS10.3 UILable中划线失效问题
iOS10.3系统的一个Bug,在UILable中含有中文时,中划线会失效 NSString *priceStr = [NSString stringWithFormat:@"%.2f元&q ...
- 子串的索引 str.index(sub) sub必须存在
ii.lstrip(' ')[0:2]=='//' ii.lstrip(' ').index('//')==0
- CSS浏览器兼容性问题解决方法总结
CSS浏览器兼容解决总结如下: 1. CSS中几种浏览器对不同关键字的支持,可进行浏览器兼容性重复定义 !important 可被FireFox和IE7识别 * 可被IE6.IE7识别 _ 可被IE6 ...