几种常见的 Kafka 集群监控工具

2022-06-09 17:46:08 浏览数 (1)

本文选自电子工业出版社的新书《kafka进阶》,推荐一下

一个功能健全的kafka集群可以处理相当大的数据量,由于消息系统是很多大型应用的基石,因此broker集群在性能上的缺陷,都会引起整个应用栈的各种问题。

Kafka的度量指标主要有以下三类:

1.Kafka服务器(Kafka)指标

2.生产者指标

3.消费者指标

另外,由于Kafka的状态靠Zookeeper来维护,对于Zookeeper性能的监控也成为了整个Kafka监控计划中一个必不可少的组成部分。

Kafka的监控指标

Broker度量指标

Kafka的服务端度量指标是为了监控broker,也是整个消息系统的核心。因为所有消息都通过kafka broker传递,然后被消费,所以对于broker集群上出现的问题的监控和告警就尤为重要。broker性能指标有以下三类:

  • Kafka本身的指标
  • 主机层面的指标
  • JVM垃圾回收指标

UnderReplicatedPartitions

在一个运行健康的集群中,处于同步状态的副本数(ISR)应该与总副本数(简称AR:Assigned Repllicas)完全相等,如果分区的副本远远落后于leader,那这个follower将被ISR池删除,随之而来的是IsrShrinksPerSec(可理解为isr的缩水情况,后面会讲)的增加。由于kafka的高可用性必须通过副本来满足,所有有必要重点关注这个指标,让它长期处于大于0的状态。

IsrShrinksPerSecIsrExpandsPerSec

任意一个分区的处于同步状态的副本数(ISR)应该保持稳定,只有一种例外,就是当你扩展broker节点或者删除某个partition的时候。为了保证高可用性,健康的kafka集群必须要保证最小ISR数,以防在某个partiton的leader挂掉时它的follower可以接管。如果IsrShrinksPerSec(ISR缩水) 增加了,但并没有随之而来的IsrExpandsPerSec(ISR扩展)的增加,就将引起重视并人工介入。

ActiveControllerCount

controller的职责是维护partition leader的列表,当遇到这个值等于0且持续了一小段时间(<1秒)的时候,必须发出明确的告警。

OfflinePartitionsCount

这个指标报告了没有活跃leader的partition数。

LeaderElectionRateAndTimeMs

leader选举的频率(每秒钟多少次)和集群中无leader状态的时长(以毫秒为单位)

UncleanLeaderElectionsPerSec

这个指标如果存在的话很糟糕,这说明kafka集群在寻找partition leader节点上出现了故障

TotalTimeMs

这个指标是由4个其他指标的总和构成的:lqueue:处于请求队列中的等待时间llocal:leader节点处理的时间lremote:等待follower节点响应的时间lresponse:发送响应的时间

BytesInPerSecBytesOutPerSec

Kafka的吞吐量

生产者度量指标

Response rate

响应的速率是指数据从producer发送到broker的速率

Request rate

请求的速率是指数据从producer发送到broker的速率

Request latency avg

平均请求延迟

Outgoing byte rate

Producer的网络吞吐量

IO wait time ns avg

Producer的I/O等待的时间

消费者度量指标

ConsumerLag MaxLag

指consumer当前的日志偏移量相对生产者的日志偏移量

BytesPerSec

消费者的网络吞吐量

MessagesPerSec

消息的消费速度

ZooKeeperCommitsPerSec

当zookeeper处于高写负载的时候,将会遇到成为性能瓶颈,从而导致从kafka管道抓取数据变得缓慢。随着时间推移跟踪这个指标,可以帮助定位到zookeeper的性能问题,如果发现有大量发往zookeeper的commit请求,你需要考虑的是,要不对zookeeper集群进行扩展。

MinFetchRate

消费者最小拉取的速率

通过官方网站的说明(http://kafka.apache.org/documentation/#monitoring),可以查看Kafka提供的所有的监控指标参数。在这里只是列出了部分主要的参数指标。

使用Kafka客户端监控工具

Kafka常用的客户端管理、监控工具,主要有以下几种:

  • Kafka Manager
  • Kafka Tool
  • KafkaOffsetMonitor
  • JConsole

其中,前三个工具都是专门用于Kafka集群的管理与监控;而JConsole(Java Monitoring and Management Console),是一种基于JMX的可视化监视、管理工具,安装好了JDK以后,Java就为我们提供了JConsole的客户端工具。利用它我们也可以监控Kafka的各项指标。

这里我们简单介绍一下JMX。JMX的全称为Java Management Extensions。可以管理、监控正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。而Kafka底层也是基于Java的,所以我们也就可以使用JMX的标准来管理和监控运行中的Kafka了。

下面我们分别介绍它们的使用方法。

Kafka Manager

Kafka Manager的Github地址是https://github.com/yahoo/kafka-manager。这款监控框架的好处在于监控内容相对丰富,既能够实现broker级常见的JMX监控(比如出入站流量监控),也能对consumer消费进度进行监控(比如lag等)。另外用户还能在页面上直接对集群进行管理,比如分区重分配或创建topic——当然这是一把双刃剑,好在kafka manager自己提供了只读机制,允许用户禁掉这些管理功能。

这里我们使用的版本是:kafka-manager-2.0.0.2.zip。安装和配置非常简单,按照下面的步骤配置Kafka Manager:

(1)首先,需要在启动Kafka集群的命令脚本中,增加JMX的相关参数。否则无法使用客户端工具管理和监控Kafka集群。这里我们以kafka101主机上运行的broker 0和broker 1为例,来为大家演示。进入kafka安装目录下的bin目录

cd /root/training/kafka_2.11-2.4.0/bin/

(2)修改kafka-run-class.sh文件,找到“JMX setting”的位置(第176行)。增加JMX Server的配置信息。如图7.1所示。

-Djava.rmi.server.hostname=kafka101

图7.1 修改Kafka Manager的JMX Setting

注意:

由于在kafka101主机上将会启动两个broker,为了方便可以在命令终端中使用export命令设置JMX的端口地址;也可以像下面这样把JMX的端口写到kafka-server-start.sh脚本中,如图7.2所示,修改第30行。

export JMX_PORT="9999"

图7.2 设置JMX的端口

(3)启动Kafka Broker 0

export JMX_PORT="9990"

bin/kafka-server-start.sh config/server.properties &

(4)重新开启一个命令行终端,启动Kafka Broker 1

export JMX_PORT="9991"

bin/kafka-server-start.sh config/server1.properties &

(5)将Kafka Manager的压缩包解压至/root/training目录

unzip kafka-manager-2.0.0.2.zip -d ~/training/

(6)进入Kafka Manager的conf目录,并修改application.conf文件

#这里我们指定ZooKeeper集群的地址

kafka-manager.zkhosts="kafka101:2181,kafka102:2181,kafka103:2181"

#将下面的这一行注释掉

#kafka-manager.zkhosts=${?ZK_HOSTS}

(7)采用nohup的方式启动Kafka Manager

nohup bin/kafka-manager &

也可以像下面这样启动Kafka Manager的时候,指定相关参数:

nohup bin/kafka-manager -Dconfig.file=conf/application.conf -Dhttp.port=8080 &

(8)启动成功后,将输出如下的日志信息,如图7.3所示:

图7.3 启动Kafka Manager

可以看到,Kafka Manager将运行在9000端口上。

(9)通过浏览器访问9000端口,可以打开Kafka Manager的Web控制台,如图7.4所示:

图7.4 Kafka Manager的Web控制台

(10)选择“Cluster”-->“Add Cluster”,添加一个新的Kafka集群。勾选“Enable JMX Polling”,并点击“Save”。如图7.5所示:

图7.5 添加Kafka集群

(11)添加成功后,点击“Go to Cluster View”,跳转到Kafka 集群的首页,如图7.6所示:

图7.6 Kafka集群首页

在这里,可以看到当前的Kafka集群中共存在2个Broker,即:broker 0和broker 1;还有3个Topics。

(12)点击Brokers的数字“2”,跳转到Broker的监控页面上。在这里就可以实时监控Kafka集群Broker的相关信息了。如Kafka集群的吞吐量(Bytes in /sec、Bytes out /sec)等等,如图7.7所示:

图7.7 监控Kafka Broker

(13)图7.8所示,展示了Kafka集群Topic的监控信息。

图7.8 监控Kafka Topic

Kafka Tool

Kafka Tool是用于管理和使用Apache Kafka集群的图形应用程序。它提供了一种直观的界面风格,可让用户快速查看Kafka集群中的对象以及集群主题中存储的消息。它包含面向开发人员和管理员的功能,一些关键功能如下:

快速查看所有Kafka集群,包括其broker,主题和消费者

  • 查看分区中消息的内容并添加新消息
  • 查看消费者的偏移量,包括Apache Storm中的spout消费者
  • 以良好的格式显示JSON和XML消息
  • 添加和删除主题以及其他管理功能
  • 将单个消息从您的分区保存到本地硬盘驱动器
  • 编写自己的插件,使您可以查看自定义数据格式
  • Kafka工具可在Windows,Linux和Mac OS上运行

从Kafka Tool的官方网站(https://www.kafkatool.com/download.html)上,直接下载Kafka Tool。这里我们直接下载Kafka Tool 2.0.8的版本。如下图7.9所示:

图7.9 下载Kafka Tool

下载完成后,直接安装启动即可。图7.10展示了启动的初始界面。

图7.10 Kafka Tool的启动界面

添加一个Kafka Cluster集群,并测试。如图7.11所示:

图7.11 添加Kafka集群

点击“是”,进入Kafka集群的首界面。如图7.12所示:

图7.12 Kafka集群的首界面

在这里可以看到Kafka集群中的Broker信息、Topics的信息以及Consumers消费者的信息。

现在我们使用Kafka Tool来创建一个新的Topic。

(1)选择“Browsers”中集群的“Topics”节点,并在右边的界面上点击

按钮,添加一个新的Topic。

(2)输入Topic的名字、分区数、以及每个分区的副本数。这里我们新创建的Topic名称是mytopic2,它由两个分区组成,并且每个分区的副本数为。如图7.13所示。

图7.13 Add Topic

(3)点击“Add”,将成功创建Topic,如图7.14所示。

图7.14 成功创建Topic

(4)现在我们使用Kafka Tool来接收mytopic2上的消息数据。选择刚刚创建好的mytopic2的主题,并在右边的窗口中选择“Data”的页面,如图7.15所示。

图7.15 通过Kakfa Tool接收数据

(5)启动一个Kafka Producer的命令行终端,并发送一些消息。如图7.16所示:

bin/kafka-console-producer.sh --broker-list kafka101:9092 --topic mytopic2

图7.16 通过命令行发送数据

(6)在Kafka Tool上,点击

接收消息。这里就可以看到刚才我们在Kafka Producer命令行上发送的消息。如图7.17所示:

图7.17 在Kafka Tool上接收数据

(7)这里的数据格式默认是“Byte Array”,我们可以在Properties的设置里面将其修改为String,并点击“Update”,如图7.18所示:

图7.18 修改Topic的数据格式

(8)回到Data页面,这时候数据将按照正确的格式显示,如图7.19所示:

图7.19 显示正确的数据

KafkaOffsetMonitor

KafkaOffsetMonitor是一个基于Web界面的管理平台,可以用来实时监控Kafka服务的Consumer以及它们所在的Partition中的Offset,我们可以浏览当前的消费者组,并且每个Topic的所有Partition的消费情况都可以进行实时的监控。KafkaOffsetMonitor可以从github上下载,地址是:https://github.com/quantifind/KafkaOffsetMonitor 。这里我们使用的是KafkaOffsetMonitor-assembly-0.2.0.jar

KafkaOffsetMonitor的安装启动比较简单。我们可以直接在kafka101的主机上执行下面的指令:

java -cp KafkaOffsetMonitor-assembly-0.2.0.jar

com.quantifind.kafka.offsetapp.OffsetGetterWeb

--zk kafka101:2181

--port 8089

--refresh 10.seconds

--retain 1.days

其中:

lcom.quantifind.kafka.offsetapp.OffsetGetterWeb是运行Web监控的类

  • --zk用于指定ZooKeeper的地址
  • --port是Web运行端口
  • --refresh和--retain用于指定页面数据刷新的时间以及保留数据的时间值

打开浏览器访问8089端口,就可以打开KafkaOffsetMonitor的首页面,如图7.20所示。

图7.20 KafkaOffsetMonitor首页

选择“Topic List”,就可以监控某个具体的Topic信息了,如图7.21所示。

图7.21 通过KafkaOffsetMonitor监控Topic

JConsole

JConsole(Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具,从Java 5开始引入。JConsole是用Java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,就可以直接启动了。

这里我们方便,我们直接在Window上启动JConsole。在CMD创建中直接输入JConsole,如图7.22所示。

图7.22 启动JConsole

JConsole的启动界面如图7.23所示。

图7.23 JConsole的启动界面

由于在前面配置Kafka Manager的时候,我们已经启用了broker 0和broker 1的JMX配置,所以这里可以直接通过JConsole连接到broker 0或者broker 1上。我们以broker 0 为例。选择“远程进程”,并输入broker 0的JMX地址,点击“连接”,如图7.24所示。

kafka101:9990

图7.24 通过JConsole连接broker 0

选择“不安全的连接”,进入JConsole监控的主界面,如图7.25和图7.26所示。

图7.25 不安全的连接

图7.26 JConsole的主页面

JConsole提供六个选项卡显示应用信息:

(1)概览选项卡:提供内存使用的概述、运行的线程数量、创建的对象数量以及CPU使用情况。

(2)内存选项卡:显示使用的内存数量。可以选择要监视的内存类型(堆、非堆或池)组合。

(3)线程选项卡:显示线程数量和每个线程的详细信息。

(4)类选项卡:显示加载的对象数量的信息。

(5)VM 概要选项卡:提供运行应用的JVM概要。

(6)MBean选项卡:显示有关应用的托管bean的信息。

这里我们选择“MBean选项卡”,就可以看到Kakfa相关的MBean信息,如图7.27所示。

图7.27 通过JConsole监控Kafka

以上图监控的参数“MessagesInPerSec”为例,它表示的是Kafka集群消息的速率。关于所有的Kafka监控的MBean信息,可以参考官方网站上的说明,地址是:http://kafka.apache.org/documentation/#monitoring

监控ZooKeeper

前面提到,整个Kafka的状态靠Zookeeper来维护,对于Zookeeper性能的监控也成为了整个Kafka监控计划中一个必不可少的组成部分。在典型的Kafka集群中, Kafka通过Zookeeper管理集群配置,例如:选举Leader,以及在Consumer Group发生变化时进行Rebalance;生产者Producer将消息发布到broker,Consumer从broker订阅并消费消息。这些操作都离不开ZooKeeper。所以在Kafka集群的管理监控中,ZooKeeper的监控也就成为了非常重要的一部分。

由于ZooKeeper本身也是由Java开发的应用程序,我们当然也可以前面提到的JMX的方式进行监控,例如使用JConsole。图7.28展示了通过JConsole监控ZooKeeper MBean的监控信息。

图7.28 通过JConsole监控ZooKeeper

这里我们也可以使用另一个客户端工具ZooInspector监控ZooKeeper。图7.29展示了它的主界面。

图7.29 通过ZooInspector监控ZooKeeper

0 人点赞