需求《Bug:Zabbix对Kafka topic积压数据监控》在本文中,我们通过监控延迟来提醒Kafka分区主题的消费。通过告警,我们发现分区主题告警的消费积压非常频繁,这无疑会引起开发和运维的重视。经过一系列的监测、探索、实践和总结,我们逐渐发现topic分区的消费积压与以下几种情况有关:consumergroup频繁rebalance,导致整个consumergroup下的topic无法消费;消费性能问题,在超时时间内无法完成消费;topic分区数量和consumer数量不均衡,一个consumer需要消费多个topic分区,消费缓慢;主题分区的数量变化;etc.从以上几种情况分析,无论是哪一种,都与消费组Rebalance有关,都是Rebalance后重新消费。所以我们要从Rebalance的角度重新开始。重新平衡再次开始。关于消费者的性能问题,大部分与客户端参数设置不当有关,这是运维难度大造成的。但是为了更全面的了解Kafka,我们运维还是有必要对它进行浅显易懂的了解。先从相关参数说起:#每次poll()消费者消费的最大消息数,默认500条max.poll.records#两次poll()之间的最大间隔,默认5分钟max.poll.interval。msmax.poll.interval.ms这个参数定义了两次poll()之间的最大间隔时间,“默认值为5分钟”。如果业务处理消息的时间过长,两次poll()的时间间隔会大于超时时间,从而触发Rebalance。因此,我们应该适当调整每次poll()的次数,保证消息在规定的时间内处理完毕,这就需要注意max.poll.records参数。参数max.poll.records定义了poll()方法最多可以返回多少条消息,“默认值为500”。poll()的次数如何定义,需要根据业务处理逻辑来决定。例如,数据需要经过多个数据源处理。一旦对某个数据源的访问超时,无疑会降低消费效率。更友好的方案是开发可以根据不同情况实时调整相关参数,应用端动态感知并自动热加载,达到快速调整消费的效果。除了对消费组划分调整Kafka参数外,我们还需要根据业务处理逻辑提前规划好消费组,避免为了方便将业务相关的主题同时划分到同一个大的消费组中,所以也就是说一旦某个消费者出现问题,整个消费者群就会重新平衡。如果rebalance时间过长,此时无法消费完所有topic,实时业务会受到很大影响。因此,我们需要合理分配话题给不同的消费群体。监控经过上面的探索和分析,我们的首要任务应该是监控Kafka消费者组是否处于Rebalance状态,然后判断:分区消费者切换是否发生,此时消费者数量保持不变;一个消费者同时消费多个分区主题;分区数量和消费者数量是1:1的关系,避免消费者数量和分区数量不一致;1、监控思路在多个消费组的情况下,我们不仅需要监控每个消费组的Rebalance状态,也考虑到未来消费组的扩大,所以我们希望能够自动发现和添加消费者以配置文件的形式进行监控。这里我们还是通过Zabbix自动发现来监控和告警各个消费者组的Rebalance状态。2、消费组自动发现由于该配置文件和Kafk主题监控复用了同一个文件,所以可以通过Zabbix并行去重自动发现具体的消费组(Group)。#自动发现vimconsumer-groups.conf#根据消费组(Group)|Topic格式,编写自动发现配置文件test-group|test#执行脚本自动发现所有消费组bashconsumer-groups-rebalance。shdiscovery{"data":[{"{#GROUP}":"test-group"}]}3.获取消费者组Rebalance状态#获取rebalance状态,0表示没有rebalance,1表示rebalance[root#~]bashconsumer-groups-rebalance.shstatustest-group04。finalscript#!/bin/bash#comment:查询消费者组状态,如果有rebalance,会发出警报#配置文件说明,分享一组配置文件与topic滞后监控#ConsumerGroup|Topic#test-group|test#加载环境变量exportJAVA_HOME=/usr/local/jdk1.8.0_261exportJRE_HOME=$JAVA_HOME/jreexportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH#group自动发现group_discovery(){printf"{\n"printf"\t\"data\":[\n"m=0num=`cat/etc/zabbix/monitor_scripts/consumer-groups.conf|awk-F'|''{print$1}'|sort|uniq|wc-l`forgroupin`cat/etc/zabbix/monitor_scripts/consumer-groups.conf|awk-F'|''{print$1}'|排序|uniq`dom=`expr$m+1`#判断最后一行if[$m-eq$num];然后printf"\t\t{\"{#GROUP}\":\"${ggroup}\"}\n"elseprintf"\t\t{\"{#GROUP}\":\"${group}\"},\n"fidoneprintf"\t]\n"printf"}\n"}if[$1=="发现"];然后group_discoveryelif[$1=="status"];然后/usr/local/kafka/bin/./kafka-consumer-groups.sh--bootstrap-server10.10.10.233:9092--describe--group$2>/tmp/$22>&1cat/tmp/$2|greprebalanc|wc-lelseecho"Usage:/etc/zabbix/monitor_scripts/consumer-group.shdiscovery|lag"fi5.zabbix自动发现并配置监控项原型,定义监控项名称与消费者组。告警信息中的名称可以帮助我们快速定位配置触发器。当触发配置告警时,可以通过告警信息快速定位到kafka消费组。过错。告警信息告警主机:Kafka_192.168.3.55主机IP:192.168.3.55主机组:Kafka告警时间:2022.11.1111:22:00恢复时间:2022.11.1111:23:02告警级别:Warning告警信息:消耗用户组test-group:Inrebalancestate告警项:group_status[test-group]问题详情:blaze-route:1其他运维问题的简单处理#1.手动消费一个主题积压的消息/usr/local/kafka/bin/kafka-consumer-groups.sh--bootstrap-server10.10.10.233:9092--topictest--grouptest-group#2.调整一个kafka主题的数据有效期,有效释放磁盘空间/usr/local/kafka/bin/kafka-topics.sh-zookeeper10.10.10.233:9092--topictest-group--alter--configretention.ms=79200000#3.调整kafka中一个topic的分区数/usr/local/kafka/bin/kafka-topics.sh-zookeeper10.10.10.233:9092--topictest-group--alter--partitions4以上是使用Kafka过程中常用的几个命令。
