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搭建图片服务器的过程详解(root和alias的区别)
Mar 31 Servers
Nginx域名转发https访问的实现
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
解析在浏览器地址栏输入一个URL后发生了什么
Jun 21 Servers
Windows下用Nginx配置https服务器及反向代理的问题
Sep 25 Servers
nginx内存池源码解析
Nov 20 Servers
使用 Apache Dubbo 实现远程通信(微服务架构)
Feb 12 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
Docker下安装Oracle19c
Apr 13 Servers
解决IIS7下无法绑定https主机的问题
Apr 29 Servers
Nginx本地配置SSL访问的实例教程
May 30 Servers
如何让你的Nginx支持分布式追踪详解
Jul 07 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
PHP递归实现层级树状展开
2016/04/01 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
小程序实现留言板
2018/11/02 Javascript
小程序云开发获取不到数据库记录的解决方法
2019/05/18 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
numpy数组广播的机制
2019/07/12 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
英国现代绅士品牌:Hackett
2017/12/17 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
文秘自荐信
2013/10/20 职场文书
编辑求职信样本
2013/12/16 职场文书
开办化妆品公司创业计划书
2013/12/26 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js