Zabbix对Kafka topic积压数据监控的解决方案


Posted in Servers onJuly 07, 2022

Kafka

Apache Kafka是一个分布式发布-订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。

Kafka适合离线和在线消息消费。

Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。Kafka构建在ZooKeeper同步服务之上。它与Apache Storm和Spark非常好地集成,用于实时流式数据分析。

需求

虽然我们在生产环境中可以使用Kafka对业务进行解耦,但这并不意味着业务系统就高枕无忧了。消费者的消费速度是否能够匹配生产速度、过多的消息积压这些都可能影响业务系统的正常运行。

关于业务系统运行状态,虽然我们可以通过业务监控来确定,但是业务监控一般是要对数据进行聚合分析并达到一定的阈值才能触发告警。因此业务监控告警通知时,业务实际已经有问题一段时间了。为应对这种情况,我们一般需要和系统监控进行互补。系统监控会周期性的对硬件、网络、服务器、应用等不同维度进行监控告警,一旦某个组件的状态有问题,那么系统监控会先预警,然后业务系统才可能进一步预警。经过不同监控系统的告警升级,才更能准确的反映业务系统的运行状态。

话说回来,对于上线后的Kafka集群,我们除了要对服务的可用性进行监控外,还要对Topic的消费情况进一步监控。

解决方案

1.监控分析

Lag作为监控指标,它直接反映了一个消费者的运行情况。一个正常工作的消费者,它的Lag值应该很小,甚至是接近于0的,这表示该消费者能够及时地消费生产者生产出来的消息,滞后程度很小。

因此我们将Topic作为我们的监控项,当相关的Topic Lag达到某一阈值时进行多渠道告警。

另经过Kafka运行机制的我们知道:

  • 每个Topic内部需要按照Partition进行再次分区
  • 同一个topic的partition只能由同一个消费者组(group)内的一个consumer来消费,分区数决定了同组消费者个数的上限

Zabbix对Kafka topic积压数据监控的解决方案

通过以上“Topic-Partition-消费者组(group)”之间的关系,为了便于我们通过告警信息更快的定位故障点:

  • 监控项命名规则:消费者组(Group)/Topic/Partition,三者组成唯一的监控项;
  • 监控项Lag值:获取业务系统中某个消费者组的特定Topic所有分区的Lag值进行告警;

2.监控思路

(1) 消费者组管理

通过Kafka自带的kafka-consumer-groups.sh脚本,我们可以轻松获取查看指定消费组 消费的所有Topic、及所在分区、最新消费offset、Log最新数据offset、Lag还未消费数量、消费者ID等等信息

# 查看消费者组的topic 消费状态
bash kafka-consumer-groups.sh --bootstrap-server 192.168.3.55:9090 --describe --group test2_consumer_group
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test 0 1000000 1000000 0 consumer-1-8688633a-2f88-4c41-89ca-fd0cd6d19ec7 /127.0.0.1 consumer-1
test 1 1000000 1000000 0 consumer-1-8688633a-2f88-4c41-89ca-fd0cd6d19ec7 /127.0.0.1 consumer-1
test 2 1000000 1000000 0 consumer-1-8688633a-2f88-4c41-89ca-fd0cd6d19ec7 /127.0.0.1 consumer-1
test 3 1000000 1000000 0 consumer-1-8688633a-2f88-4c41-89ca-fd0cd6d19ec7 /127.0.0.1 consumer-1

(2)分区自动发现

对于Kafka topic的监控我们使用Zabbix监控平台,考虑到后续业务系统的持续性接入,我们通过Zabbix自动发现实现对特定消费者组(Group)和Topic下所有分区自动发现:

# 自动发现
vim consumer-groups.conf
#按消费者组(Group)|Topic格式,写入自动发现配置文件
test-group|test
# 执行脚本自动发现指定消费者和topic的分区
bash consumer-groups.sh discovery
{
    "data": [
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"0" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"1" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"3" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"2" }
    ]
}

自动发现中的GROUP、TOPIC、PARTITION 这三个信息可以用于进一步过滤不同的分区的Lag值和监控系统中的监控项名称:

  • test-group/test/分区0
  • test-group/test/分区1
  • test-group/test/分区2
  • test-group/test/分区3
  • 等其他 test-group/test相关的所有分区

(3)获取监控项“test-group/test/分区X”的Lag

# 获取分区0 lag
bash consumer-groups.sh lag 0
# 获取分区1 lag
bash consumer-groups.sh lag 1
# 获取分区2 lag
bash consumer-groups.sh lag 2
# 获取分区3 lag
bash consumer-groups.sh lag 3

(4)最终脚本

vim consumer-groups.sh
#!/bin/bash
#comment: 根据消费者组监控topic lag,进行监控告警
#配置文件说明
#消费者组|Topic
#test-group|test
#获取topic 信息
cal_topic() {
    if [ $# -ne 2 ]; then
        echo "parameter num error, 读取topic信息失败"
        exit 1
    else
        /usr/local/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.3.55:9092 --describe --group $1 |grep -w $2
    fi
}
#topic+分区自动发现
topic_discovery() {
    printf "{\n"
    printf "\t\"data\": [\n"
    for line in `cat /data/scripts/consumer-groups.conf`
    do
        group=`echo ${line} | awk -F'|' '{print $1}'`
        topic=`echo ${line} | awk -F'|' '{print $2}'`
        cal_topic $group $topic > /tmp/consumer-group-tmp
        count=`cat /tmp/consumer-group-tmp|wc -l`
        n=0
        while read line
        do
             n=`expr  $n + 1`
             #判断最后一行
             if [ $n -eq $count ]; then
                 topicp=`echo $line | awk '{print $1}'`
                 partition=`echo $line  | awk '{print $2}'`
                 printf "\t\t{ \"{#GROUP}\":\"${group}\", \"{#TOPICP}\":\"${topicp}\", \"{#PARTITION}\":\"${partition}\" }\n"
             else
                 topicp=`echo $line | awk '{print $1}'`
                 partition=`echo $line  | awk '{print $2}'`
                 printf "\t\t{ \"{#GROUP}\":\"${group}\", \"{#TOPICP}\":\"${topicp}\", \"{#PARTITION}\":\"${partition}\" },\n"
             fi
        done < /tmp/consumer-group-tmp
    done
    printf "\t]\n"
    printf "}\n"
}


if [ $1 == "discovery" ]; then
    topic_discovery
elif [ $1 == "lag" ];then
    cat /tmp/consumer-group-tmp |awk -v p=$2 '{if($2==p){print $5}}'
else
    echo "Usage: /data/scripts/consumer-group.sh discovery | lag"
fi

3.Zabbix 自动发现配置

1.自动发现配置

Zabbix对Kafka topic积压数据监控的解决方案

2.监控项原型 通过消费者组、Topic、Partition 组成监控项名称,告警信息中的名称能够帮助我们快定位故障点。

Zabbix对Kafka topic积压数据监控的解决方案

3.触发器 我们lag的初始阈值设置为50,可根据时间情况进行调整。

Zabbix对Kafka topic积压数据监控的解决方案

4.告警信息

告警主机:Kafka_192.168.3.55
主机IP:192.168.3.55
主机组:Kafka
告警时间:2022.03.21 00:23:10
告警等级:Average
告警信息:test-group/test/分区1:数据积压62
告警项目:topic_lag[test,1]
问题详情:
test-group/test/1: 62

到此这篇关于Zabbix对Kafka topic积压数据监控的文章就介绍到这了,更多相关Zabbix Kafka 监控内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
为什么 Nginx 比 Apache 更牛逼
Mar 31 Servers
基于Nginx实现限制某IP短时间访问次数
Mar 31 Servers
Nginx开启Brotli压缩算法实现过程详解
Mar 31 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
利用Nginx代理如何解决前端跨域问题详析
Apr 02 Servers
Apache Calcite 实现方言转换的代码
Apr 24 Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 Servers
nginx负载功能+nfs服务器功能解析
Feb 28 Servers
Apache Hudi 加速传统的批处理模式
Apr 24 Servers
Windows Server 2012 R2 磁盘分区教程
Apr 29 Servers
利用nginx搭建RTMP视频点播、直播、HLS服务器
May 25 Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 Servers
Zabbix对Kafka topic积压数据监控的问题(bug优化)
nginx静态资源的服务器配置方法
Jul 07 #Servers
Nginx配置使用详解
nginx代理实现静态资源访问的示例代码
Jul 07 #Servers
使用 DataAnt 监控 Apache APISIX的原理解析
设置IIS Express并发数
Linux中sftp常用命令整理
Jun 28 #Servers
You might like
微信公众平台DEMO(PHP)
2016/05/04 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
Python魔法方法功能与用法简介
2019/04/04 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
房地产项目建议书
2014/03/12 职场文书
团干部培训方案
2014/06/03 职场文书
欢度春节标语
2014/07/01 职场文书
乐山大佛导游词
2015/02/02 职场文书
团委工作总结2015
2015/04/02 职场文书
入队仪式主持词
2015/07/04 职场文书
python中的None与NULL用法说明
2021/05/25 Python
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL