前言:

1、线上业务使用了几十上百台haproxy服务,需要针对这些服务做监控(包含haproxy端口对应的TCP连接数监控,haproxy服务监控等)。

2、普通的在zabbix_agentd.conf里面配置"UserParameter"的方式太繁琐,这里使用建表(收集数据,汇总数据)的方式。

3、将数据汇总到表里面,通过第三方脚本对数据做一个处理,拿到处理结果并监控。

一、创建数据表(收集haproxy服务的信息)

1.1、在zabbix_DB上创建表:t_3party_server

create table t_3party_server(
app varchar(64) NOT NULL,
server varchar(64) NOT NULL,
division varchar(64) NOT NULL,
node varchar(64) NOT NULL,
port varchar(64) NOT NULL,
remark int(10) unsigned NOT NULL,
PRIMARY KEY (app,server,division,node,port)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注释:

app          #这里写的是项目名称(MOBA项目)
server       #服务名称(haproxy服务)
division     #由于起了多个haproxy实例,名称也不一样,所以这里做了区分
node         #haproxy服务IP地址
port         #haproxy服务端口,多个实例端口不同
remark       #备注作用(由于线上某些haproxy服务安装路径不一致,所以此处用来区分路径,也可以区分其他)
PRIMARY KEY (app,server,division,node,port)  #添加主键

1.2、创建完毕后效果

mysql> desc t_3party_server;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| app      | varchar(64) | NO   | PRI | NULL    |       |
| server   | varchar(64) | NO   | PRI | NULL    |       |
| division | varchar(64) | NO   | PRI | NULL    |       |
| node     | varchar(64) | NO   | PRI | NULL    |       |
| port     | varchar(64) | NO   | PRI | NULL    |       |
| remark   | text        | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

  1.3、然后往数据表里面插入数据:

    1.3.1、在Navicat上添加

insert into t_3party_server(app,server,division,node,port,status) values('MOBA','haproxy','haproxy-login','10.117.16.242','30021','0');

insert into t_3party_server(app,server,division,node,port,status) values('MOBA','haproxy','haproxy-match','10.117.16.242','30032','0');

insert into t_3party_server(app,server,division,node,port,status) values('MOBA','haproxy','haproxy-test','10.117.16.242','30035','0');

    1.3.2、在MySQL数据库客户端上添加:

INSERT INTO `zabbix`.`t_3party_server` (`app`, `server`, `division`, `node`, `port`, `remark`) VALUES ('MOBA', 'haproxy', 'haproxy-test', '10.117.16.242', '30035', '0');

  1.4、最终数据生成图

二、针对生成的数据表做监控

2.1、监控脚本:放在zabbix_server下 "/install_path/zabbix_server/share/zabbix/externalscripts"

#!/usr/bin/php
<?phpif ($_SERVER["argc"] != 2) {echo "Usage: " . $_SERVER["argv"][0] . " host\n";return;
}$host = $_SERVER["argv"][1];$mysqlconn = new mysqli("10.116.207.188", "moba", "moba2016", "zabbix", 3306);
if (mysqli_connect_errno()) {echo "fail to connect mysql: " . mysqli_connect_error() . "\n";return;
}$result = $mysqlconn->query("SELECT * FROM t_3party_server WHERE node=\"" . $mysqlconn->real_escape_string($host) . "\"");$hostvalue = array("data" => array()
);
while ($row = $result->fetch_assoc()) {$app = $row["app"];$server = $row["server"];$division = $row["division"];$node = $row["node"];$port = $row["port"];$remark = $row["remark"];if ($remark == "/usr/local"){$hostvalue["data"][] = array("{#APP}" => $app,"{#SERVER}" => $server,"{#DIVISION}" => $division,"{#PORT}" => $port,"{#PATH}" => "/usr/local/" . $division . "/sbin",);continue;}$server = substr($server, 0, 15);$hostvalue["data"][] = array("{#APP}" => $app,"{#SERVER}" => $server,"{#DIVISION}" => $division,"{#PORT}" => $port,"{#PATH}" => "/data/app/" . $division . "/sbin",#"{#MFW_PATH}" => "/data/app/" . $division . "/" . ($division ? $division . "/" : "") . $server,);
}echo json_encode($hostvalue);
echo "\n";

2.1.1、脚本生成的数据:

./mfw_discovery_haproxy.php 10.117.16.222
{"data":[{"{#APP}":"MOBA","{#SERVER}":"haproxy","{#DIVISION}":"haproxy-login","{#PORT}":"30021","{#PATH}":"\/data\/app\/haproxy-login\/sbin"}]}

2.1.2、转换为Json格式如下:

{"data":[{"{#APP}":"MOBA","{#SERVER}":"haproxy","{#DIVISION}":"haproxy-login","{#PORT}":"30021","{#PATH}":"/data/app/haproxy-login/sbin"}]
}

2.2、在haproxy服务机器上配置

1、配置:zabbix_agentd.conf

vim /data/app/zabbix_agent/etc/zabbix_agentd.confLogRemoteCommands=1
LogFileSize=1
DebugLevel=3#Haproxy    #用来监控TCP连接数
UserParameter=haproxy.tcp.[*],/usr/sbin/ss -ant sport eq :"$1" | awk 'NR>1{++s[$$1]} END {for(k in s){print k,s[k]}}' |grep -w "ESTAB" |awk '{print $$2}'

2、配置:haproxy服务守护脚本     #此处可不配(根据业务选择)

    启动脚本:

#!/bin/bashold_path=`pwd`
cd `dirname $0`
path=`pwd`
server=sbin/haproxyif [ -n "`ps -ef|grep "$path/$server"|grep -v "grep"`" ]
thenecho -e "\033[32m $path/$server was running!.... \033[0m"ps -ef|grep "$path/$server"|grep -v "grep"
elseecho -e "\033[32m start $path/$server .... \033[0m"$path/$server -f $path/conf/haproxy.cfg -p /tmp/$RANDOM-haproxy.pid  -n 20000 -N 20000if [ -n "`ps -ef|grep "$path/$server"|grep -v "grep"`" ]thenecho -e "\033[32m start $path/$server ok .... \033[0m"ps -ef|grep "$path/$server"|grep -v "grep"elseecho -e "\033[31m start $path/$server faild .... \033[0m"fi
fi

  关闭脚本:

#!/bin/bashold_path=`pwd`
cd `dirname $0`
path=`pwd`
server=sbin/haproxyif [ "$(ps -ef|grep "$path/$server"|grep -v "grep" | awk '{print $2}')" == "" ];thenecho -e "\033[32m can not find $path/$server process .... \033[0m"elsekillall $path/$server 2>/dev/nulluntil [ -z "`ps -ef|grep "$path/$server"|grep -v "grep"`" ]
dosleep 1
doneps -ef|grep "$path/$server"|grep -v "grep"
echo -e "\033[31m stop $path/$server ok .... \033[0m"fips -ef|grep "$path/$server"|grep -v "grep"killall $path/$server 2>/dev/null

   重载脚本:

#!/bin/bashold_path=`pwd`
cd `dirname $0`
path=`pwd`
server=sbin/haproxy
hpid=`ps -ef|grep "$path/$server"|grep -v "grep" |awk '{print $ 12}'`if [ -n "`ps -ef|grep "$path/$server"|grep -v "grep"`" ]
thenecho -e "\033[32m $path/$server is running!.... \033[0m"$path/$server -f $path/conf/haproxy.cfg -p $hpid  -n 20000 -N 20000 -sf $(cat $hpid)ps -ef|grep "$path/$server"|grep -v "grep"
elseecho -e "\033[31m $path/$server was not running.... \033[0m"echo -e "\033[32m start $path/$server process.... \033[0m"$path/$server -f $path/conf/haproxy.cfg -p /tmp/$RANDOM-haproxy.pid  -n 20000 -N 20000if [ -n "`ps -ef|grep "$path/$server"|grep -v "grep"`" ]thenecho -e "\033[32m start $path/$server ok .... \033[0m"ps -ef|grep "$path/$server"|grep -v "grep"elseecho -e "\033[31m start $path/$server faild .... \033[0m"fi
fi

   守护进程脚本:

#!/bin/sh#chkconfig: 2345 59 81
#description: The Haproxy service daemon script.if [ -d /usr/local/haproxy/ ];then
SCRIPT=`/bin/find /usr/local/*haproxy*  -name 'start.sh'`
else
SCRIPT=`/bin/find /data/app/*haproxy* -name 'start.sh'`
fiPROC_NAME=haproxy
PID=0function proc_num()
{  NUM=`ps -ef | grep ${PROC_NAME} | grep -v grep |wc -l`  return $NUM
}  function proc_id()
{  PID=`ps -ef | grep ${PROC_NAME} | grep -v grep | awk '{print $2}'`  return $PID
} function shell(){echo "${SCRIPT}" | /bin/sed -n '1p' | xargs /bin/sh  >>/dev/nullsleep 0.3echo "${SCRIPT}" | /bin/sed -n '2p' | xargs /bin/sh  >>/dev/nullsleep 0.3echo "${SCRIPT}" | /bin/sed -n '3p' | xargs /bin/sh  >>/dev/null
}function main(){proc_num#proc_id#if [ ${NUM} -eq 0 ] || [ ${PID} -eq 0 ];then
if [ ${NUM} -eq 0 ];thenshell
fi
}main

   创建定时任务:

*/2 * * * * /data/tools/script/daemon_Haproxy.sh > /dev/null 2>&1

2.3、在zabbix上添加监控

  2.3.1、创建模板-->自动发现规则

定义宏变量:宏的值为json导出后的值

         2.3.2、添加item和trigger

Item1:检查haproxy进程是否存在

Key:proc.num["{#SERVER}",,,"{#PATH}"]

Trigger1:对应Item1

{Template moba server:proc.num["{#SERVER}",,,"{#PATH}"].last()} < 1

Item2:检查haproxy端口对应的TCP连接数   

Key:haproxy.tcp.[{#PORT}] 这个key需要在haproxy机器上的zabbix_agent.conf手动配置UserParameter (前面有介绍)

Trigger2:对应Item2

{Template moba server:haproxy.tcp.[{#PORT}].last()}>40000

三、之后新增haproxy服务添加到监控的流程如下

1、在zabbixDB上的t_3party_server表里添加数据:
INSERT INTO `zabbix`.`t_3party_server` (`app`, `server`, `division`, `node`, `port`, `remark`) VALUES ('MOBA', 'haproxy', 'haproxy', '10.111.152.15', '30032', '0');2、在zabbix上 Host groups-->Haproxy_Group 组内添加IP   #自定义(可不要)3、在机器上添加配置参数:
vim /data/app/zabbix_agent/etc/zabbix_agentd.confLogRemoteCommands=1
LogFileSize=1
DebugLevel=3#Haproxy
UserParameter=haproxy.tcp.[*],/usr/sbin/ss -ant sport eq :"$1" | awk 'NR>1{++s[$$1]} END {for(k in s){print k,s[k]}}' |grep -w "ESTAB" |awk '{print $$2}'4、在机器上添加守护脚本:
/data/tools/script/daemon_Haproxy.sh5、添加定时任务
*/2 * * * * /data/tools/script/daemon_Haproxy.sh > /dev/null 2>&16、把守护进程脚本放到  /data/app/zabbix_agent/share/zabbix/externalscripts/ 这个目录内:   #这一步主要是给zabbix上执行远程命令使用的【Configuration--》Actions--》WeChat--》Operations--》--》2  Run remote commands on host groups: Haproxy_Group】  #自定义(可不要)cp -ap /data/tools/script/daemon_Haproxy.sh /data/app/zabbix_agent/share/zabbix/externalscripts/7、配置完毕后重启 zabbix_agentd
pkill zabbix_agentd
/data/app/zabbix_agent/sbin/zabbix_agentd8、到zabbix上监控haproxy服务是否被监控

Haproxy服务监控相关推荐

  1. haproxy服务启动命令_HaProxy安装和常用命令

    安装haproxy 对于 haproxy 安装,网上有大量的资源可以参考,最常见的是使用 yum 和 编译安装两种方式. yum 安装 haproxy CentOS自带了haproxy,但可能版本比较 ...

  2. 聊聊Spring Boot服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!...

    来自:https://juejin.im/post/5e2179def265da3e152d2561 前言 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要 ...

  3. 揭秘百度微服务监控:百度游戏服务监控的演进

    导读:臣闻防患于未然者易,除患于已然者难 -- 明·马文升<添风宪以抚流民疏> 作为一个程序员,是否有留意到每逢节假日在各大景区时有程序员打开电脑紧急处理线上问题?如果线上出现大量的报警, ...

  4. Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...

    作者:Richard_Yi 来源:http://39sd.cn/B2A0B 去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上.这不,最近我就被分配了要将我们核心的微服务应用全部监控起 ...

  5. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝 ...

  6. 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计

    目录 文章目录 目录 日志与审计 监控与告警 配置中心 文档中心 日志与审计 日志分析组件应该在微服务兴起之前就被广泛使用了.即使单体应用架构,当访问数变大.或服务器规模增多时,日志文件的大小会膨胀到 ...

  7. 如何做自己的服务监控?spring boot 2.x服务监控揭秘

    Actuator是spring boot项目中非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...

  8. 如何做自己的服务监控?spring boot 1.x服务监控揭秘

    1.准备 下载可运行程序:http://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/ 2.添加服务监控依赖 <d ...

  9. Dubbo环境搭建-管理控制台dubbo-admin实现服务监控

    场景 Dubbo环境搭建-ZooKeeper注册中心: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555470 在上面搭 ...

  10. 直播技术:从性能参数到业务大数据,浅谈直播CDN服务监控

    线上服务的有效监控和数据收集,一直是后端服务离不开的话题.直播作为一种经典的分布式系统,监控以及数据收集更是必不可少的工作.如何对海量的服务集群有效的监控和保活,又如何抓取集群中的碎片数据中来优化服务 ...

最新文章

  1. javascript 利用 - 枚举思想 - 添加地名的一个小例子
  2. 浅谈jsp的7个动作
  3. [Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses
  4. Python技巧:不要在for与while循环后写else块
  5. 长庆企业信息化管理课件_详解:企业信息化管理系统,不能马虎对待
  6. Java基础day19
  7. 【报错笔记】pom.xml第一行报错,显示红色叉号
  8. 一定要好好学习C语言
  9. python爬取豆瓣电影并分析_Python爬取豆瓣电影的短评数据并进行词云分析处理
  10. VUE v-bind绑定class和style
  11. uva 10003——Cutting Sticks
  12. 内向的人能做管理吗?
  13. linux驱动访问内存,linux驱动笔记八(内存与IO访问)
  14. 原生Js通过form表单提交后的跳转问题
  15. 为什么C语言执行效率高,运行快?
  16. 浅谈嵌入式技术的发展
  17. 三人表决器实验报告总结_三人表决器实验报告..doc
  18. 抓取taobao的IP库
  19. pdf加密文件怎么加密
  20. word文档转pdf并在任意浏览器预览打印一体化方案

热门文章

  1. Excel表格中无法中间插入新行列! 提示:在当前工作表的最后一行或列中,存在非空单元格,解决方案
  2. 组策略 计算机配置 安全设置,使用组策略配置 Windows 防火墙设置
  3. php中empty检测非空,php empty() 检查一个变量是否为空
  4. 视频码率与分辨率的参考表
  5. 香港服务器的数据泄露是什么?怎样预防?
  6. 第54课作业实战成功:用phpMyAdmin等数据库可视化软件操作MySQL,并且通过远程操作MySQL;
  7. stm32学习(一)STM32简单介绍(初步了解单片机与STM32)
  8. html背景图片在文字下面,背景图片加文字的HTML怎么写
  9. sql 自定义排序 顺序
  10. 你好,李焕英;再见,唐探3?