Kafka Beep:Kafka集群“诊断”利器

Posted 乐得技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka Beep:Kafka集群“诊断”利器相关的知识,希望对你有一定的参考价值。


导读

Kafka由于高吞吐量、可持久化、分布式、支持流数据处理等特性而被广泛应用。但是由于Kafka在早期(0.9.x及以前)版本中存在对zookeeper依赖较高、broker的controller设计不够完善、consumer client心跳线程设计有问题等原因,导致生产环境中的Kafka集群的稳定性并不令人满意,经常出现消费延迟或者消费者无法正常消费消息的现象。因此,我们设计并实现了一套针对Kafka集群的监控报警系统。


注:本文默认读者了解Kafka相关基础知识



目前解决方案

Kafka Beep:Kafka集群“诊断”利器

针对Kafka集群不稳定的问题,目前通用化的解决方案一般为以下两种。


 运维手动配置监控脚本

Kafka提供了丰富的sh脚本来实现对Kafka集群的信息查看和管理功能,运维可自行编写脚本获取到消费者的延迟信息和Topic的ISR信息。但这种方式存在诸多问题:


  • 不同版本的消费者的消费信息查询方式不同


# 查询Scala版本的消费者的消费信息

sh kafka-consumer-offset-checker.sh 

--zookeeper zookeeper:port --group consumerGroup

# 查询Java版本的消费者的消费信息

sh kafka-consumer-groups.sh 

--bootstrap-server kafka.broker:port --describe --group consumerGroup


这两种命令都指定查到各自对应版本的消费者。


  • 无法通过命令查询指定Topic的消费者


Kafka没有提供原生的sh命令来查询某个topic下有哪些consumer,只能查指定的broker上有哪些consumer,并且由于不同版本的consumer存储在不同位置,查询命令也分为不同的版本。查询指定broker上的consumer的命令如下:


# 查询指定broker上所有scala版本消费者

sh kafka-consumer-groups.sh --zookeeper zookeeper:port --list

# 查询Java版本的消费者的消费信息

sh kafka-consumer-groups.sh --bootstrap-server kafka.broker:port --list


  • 大型集群手动配置脚本工作量极大

由于大型的Kafka集群存在大量的Topic,每个Topic又存在大量的消费者。运维要针对所有的Topic和对应的消费者创建并采集监控信息,简直就是Mission Impossible。

  使用开源项目实现监控管理

Github上有许多针对Kafka集群的监控管理项目,目前仍在活跃状态而且使用广泛的主要有以下两个。


  • Kafka Manager

Kafka Beep:Kafka集群“诊断”利器

地址

https://github.com/yahoo/kafka-manager


Kafka Manager是雅虎开源使用Scala语言开发的Kafka集群管理系统。主要特性如下:

  • 直观的Web展示页面;

  • 同时管理多个集群;

  • 便捷地查看集群状态(topics, consumers, offsets, brokers, replica distribution, partition distribution);

  • 屏蔽了多种版本集群的差异,提供统一的查看方法和数据结构;

  • 查看Topic的所有不同版本的消费者信息;

  • 手动管理Topic的Partition ;

  • 通过JMX接口查看集群的工作状态(吞吐量、每秒失败消息量)。


虽然Kafka Manager管理功能十分强大,但是其监控功能只能人工查看消费者的lag、Topic的ISR信息,并无相应的报警机制。而大多数情况下无法在Kafka集群出现异常情况的第一时间将报警信息发送给相关人员。


  • Burrow

Kafka Beep:Kafka集群“诊断”利器

地址

https://github.com/linkedin/Burrow


Burrow是linkedin开源使用Golang开发的Kafka消费延迟监控系统。主要特性如下:

  • 不需要预先设置lag的阈值, 基于消费过程的动态评估来自动调整各个消费者的lag阈值;

  • 不需要预先设置lag的阈值, 基于消费过程的动态评估来自动调整各个消费者的lag阈值;

  • 同时管理多个集群;

  • 不但可以监控存在zk或是kafka上的offset信息,还可以监控storm的消费信息;

  • 提供HTTP接口获取集群的生产消费情况;

  • 提供了Docker镜像,开箱即用。


Burrow作为针对消费延迟的监控工具,由于其动态调整lag阈值的特性和丰富可定制的报警方式吸引了众多的使用者,但是其功能较为单一,无可视化Web界面,无法监控Topic的ISR信息,以致其使用场景较为局限。


Kafka Beep

Kafka Beep:Kafka集群“诊断”利器


为解决已有方案中存在的问题,我们设计实现了基于Kafka Manager和Zabbix的Kafka集群监控报警系统,将其命名为Kafka Beep该系统将Kafka Manager强大的监控管理功能和Zabbix丰富的报警、图形化展示功能结合起来,能够实时监控消费者的lag信息和Topic的ISR信息,并在发生异常的第一时间通过短信、邮件、内部系统等丰富地方式进行报警。


Kafka Beep自动在Zabbix上创建监控项(Item)、触发器(Trigger)和图表(Graph),并将Kafka Manager采集到的消费lag和Topic的ISR信息通过zabbix_sender上报到Zabbix对应的监控项上,之后就可以通过Zabbix的图表查看到消费lag和Topic的ISR信息,进一步可以配置对应的动作(Action)来触发报警。


Kafka Beep:Kafka集群“诊断”利器

消费lag的图表-示例图


消费lag反映了消费者消费消息的健康情况,在Kafka Beep的配置文件中可以根据项目需要指定消费lag触发报警的阈值,图表中会显示出指定Topic的所有消费者的消费lag曲线,可以清楚地看到在哪个时间消费出现了问题。


Kafka Beep:Kafka集群“诊断”利器

Topic的ISR图表-示例图


ISR反映了Topic的健康情况,当其值为0时,表示该Topic的所有分区的Fellower都跟上了Leader,一切正常。当其值不为0时,则说明Topic的分区备份出现了问题,需要结合Kafka broker的log进一步排查问题产生的原因。


Kafka Beep的典型拓扑如下图所示,其需要从Zookeeper注册节点来管理集群信息,从Kafka broker中消费consumer offset Topic的消息获取到消费者和消费延迟的信息,通过Zabbix RPC API来进行创建和更新监控项。触发器、图表的操作,并通过zabbix_sender上传监控项需要的数据:

Kafka Beep:Kafka集群“诊断”利器


目前Kafka Beep已在公司的不同产品线展开了推广工作,后续也会完善后对项目代码进行开源,欢迎继续关注!



Kafka Beep:Kafka集群“诊断”利器

关注更多精彩


以上是关于Kafka Beep:Kafka集群“诊断”利器的主要内容,如果未能解决你的问题,请参考以下文章

kafka集群安装

KAFKA集群搭建

zookeeper集群+kafka集群 部署

Kafka 的这些原理你知道吗

滴滴开源Kafka集群指标监控与运维管控平台

银行系统中的消息分发利器Kafka(三)