0%

Zabbix监控Haproxy及Grafana展示

一、前言

1.1 介绍

  • HAProxy的安装及配置已在前面博客中介绍了,它原生自带的监控管理页面所展示的参数状态,此次我们结合zabbix+Grafana展示出来,帮助我们随时掌握我们服务的各种状态,更准确定位问题,最主要是提高运维效率!

  • 监控原理:HAproxy提供了一种方法——通过socket来显示HAproxy的状态。通过修改配置文件haproxy.cfg开启socket文件并开放权限为666.

1.2 重点监控项

  • Haproxy后端服务的进出流量

  • Haproxy后端服务的状态UP或者DOWN


二、Haproxy 配置

2.1 开启socket

  • vim /etc/haproxy/haproxy.cfg
1
2
3
#在global块中新增
global
stats socket /etc/haproxy/info.sock mode 666 level admin

2.2 开启多线程(可选)

  • 如果Haproxy属于多核处理器,平时负载压力很大,建议开启多线程处理,提高性能,本例服务器为8核处理器,配置如下:
1
2
3
4
5
6
global
nbproc 4
stats socket /etc/haproxy/info.sock mode 666 level admin process 1
listen status
bind :1080
bind-process 1
  • 检测配置:
1
2
/etc/haproxy/bin/haproxy -c -f /etc/haproxy/haproxy.cfg
Configuration file is valid(配置有效)
  • reload

    systemctl reload haproxy


三、监控脚本

3.1 自动发现监控脚本

案例配置,这里我只展示了一组redis集群

1
2
3
4
5
6
7
8
9
10
frontend  test_redis
bind :63799
log global
default_backend test_redis

backend test_redis
log 127.0.0.1 local0 notice
server 172.17.36.143 172.17.36.143:6379 check inter 1000 rise 3 fall 3
server 172.17.38.47 172.17.38.47:6379 check inter 1000 rise 3 fall 3
server 172.17.37.238 172.17.37.238:6379 check inter 1000 rise 3 fall 3

3.2 抓取后端server流量、服务状态脚本

  • 创建一个脚本,自动发现所有的haproxy每一个backend组的后端server集群,返回Json格式,以便zabbix读取

    vim haproxy.discovery.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/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 /etc/haproxy/info.sock stdio|grep -v "^#"|grep -v "^$" |grep -v "^admin_stats"|grep -v "^FRONTEND"|grep -v "^DB"|grep -v "^BACKEND"|grep -v BACKEND |grep -v FRONTEND|awk -F "," '{print $1,$2}'| wc -l)
export N=0
#printf '\t\t{\n'
echo "show stat" |socat /etc/haproxy/info.sock stdio | grep -v BACKEND |grep -v FRONTEND |grep -v "^#"|grep -v "^$"|grep -v "^admin_stats"| grep -v "^DB" |awk -F "," '{print $1,$2}'|while read i j
do
printf "\t\t\t{\"{#SNAME}\":\"$j\",\"{#BACKEND}\":\"$i\"}"
N=$(($N+1))
if [ $N -eq $LINE ]
then
printf '\n'
else
printf ',\n'
fi
done
printf ']}\n'
  • 脚本执行,输出格式:后端每个ip + backend组名
1
2
3
4
5
6
{
"data":[
{"{#SNAME}":"172.17.36.143","{#BACKEND}":"test_redis"},
{"{#SNAME}":"172.17.38.47","{#BACKEND}":"test_redis"},
{"{#SNAME}":"172.17.37.238","{#BACKEND}":"test_redis"}
]}
  • 传入的第一个变量$1为自动发现脚本获取的serverip,第二个$2为backend组名
  • 创建脚本获取出流量

    vim haproxy.bout.sh

1
2
3
4
#!/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 /etc/haproxy/info.sock stdio |grep "\<$1\>"| grep "\<$2\>"|awk -F ',' '{if($2=="'$1'") print $0}'| grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $10}'

  • 创建脚本获取入流量

    vim haproxy.bin.sh

1
2
3
4
5
6
#!/bin/bash
export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#set -x
IP=$1

echo "show stat" |socat /etc/haproxy/info.sock stdio |grep "\<$1\>"| grep "\<$2\>" | awk -F ',' '{if($2=="'$1'") print $0}'|grep -v "^FRONTEND"|grep -v "^BACKEND" |awk -F "," '{print $9}'

  • 创建脚本获取后端server状态,如果是UP返回1,是DOWN返回0

    vim haproxy.status.sh

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

N1=`echo "show stat" |socat /etc/haproxy/info.sock stdio |grep "\<$1\>"|grep "\<$2\>"|awk -F ',' '{if($2=="'$1'") print $0}'|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $18}'`
#echo $N1
if [ "$N1" = "UP" ]
then
echo "1"
else
echo "0"
fi

3.3 新增zabbix配置文件

  • vim /etc/zabbix/zabbix_agentd.d/HaProxy_status.conf
1
2
3
4
UserParameter=has.discovery,/etc/zabbix/haproxy.discovery.sh
UserParameter=ckey.ha.bin[*],/etc/zabbix/haproxy.bin.sh $1 $2
UserParameter=ckey.ha.bout[*],/etc/zabbix/haproxy.bout.sh $1 $2
UserParameter=ckey.ha.status[*],/etc/zabbix/haproxy.status.sh $1 $2
  • service zabbix-agent restart

四、 Zabbix监控模板

Template HaProxy-LAN_LB Service

4.1 创建自动发现规则

image.png


4.2 创建监控项原型

  • 入流量
1
2
3
名称:haproxy.bps.in $1 $2

键值:ckey.ha.bin[{#SNAME},{#BACKEND}]

image.png


  • 出流量
1
2
3
名称:haproxy.bps.in $1 $2

键值:ckey.ha.bin[{#SNAME},{#BACKEND}]

image.png


  • Server状态
1
2
名称:haproxy.status $1 $2
键值:ckey.ha.status[{#SNAME},{#BACKEND}]

image.png
image.png


4.3 创建图形原型

  • 入出流量图
1
名称:{#BACKEND}.NetWrok Flow {#SNAME}

image.png


  • 服务状态图
1
名称:{#BACKEND}.Status {#SNAME}

image.png


  • 最后把需要监控的haproxy机器应用到此模板即可,效果如下图:

image.png

image.png


五、Grafana展示

由于zabbix的数据库为influxDB,每一个监控项则是里面的一张表,通过正则匹配获取所有流量、服务状态的集合,然后通过Grafana排序效果展示。

5.1 创建流量的监控图

  • 入流量为例,出流量可以另外再照此做一个图表

image.png

image.png

image.png

  • 效果展示
    image.png

5.2 创建服务状态监控图

image.png

image.png

  • 效果展示

image.png


5.3 模拟测试

  • 现在我把后端机器172.17.37.238上的redis kill掉

image.png

  • 再恢复redis服务

image.png


本博客到此结束,后续继续完善。。。。
坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------