本文选自电子工业出版社的新书《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以上。 |
IsrShrinksPerSec IsrExpandsPerSec |
任何分区处于同步状态的副本数(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 |
该指标由四个其他指标的总和组成: lqueue:在请求队列中等待时间 llocal:leader节点处理时间 lremote:等待follower节点响应时间 lresponse:发送响应时间 |
BytesInPerSec BytesOutPerSec |
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-manger-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
本文选自电子工业出版社的《kafka进阶》一书,略有修改,经出版社授权刊登于此。
本书基于作者多年的教学与实践进行编写,重点介绍Kafka消息系统的核心原理与架构,内容涉及开发、运维、管理与架构。全书共11章,第1章,介绍Kafka体系架构基础,包括消息系统的基本知识、Kafka的体系架构与ZooKeeper;第2章,介绍Kafka的环境部署,以及基本的应用程序开发;第3章,介绍Kafka的生产者及其运行机制,包括生产者的创建和执行过程、生产者的消息发送模式和生产者的高级特性等;第4章,介绍Kafka的消费者及其运行机制,包括消费者的消费模式、消费者组与消费者、消费者的偏移量与提交及消费者的高级特性等;第5章,介绍Kafka服务器端的核心原理,包括主题与分区、消息的持久性与传输保障、Kafka配额与日志的管理;第6章,介绍Kafka的流处理引擎Kafka Stream;第7章,介绍使用不同的工具监控Kafka,包括Kafka Manager、Kafka Tool、KafkaOffsetMonitor和JConsole;第8章至第11章,介绍Kafka与外部系统的集成,包括集成Flink、集成Storm、集成Spark和集成Flume。