「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者|北京宝兰德公司解决方案总监徐清康

01

前言

当我们使用一个软件的时候,经常都会问这个软件怎么监控、监控他的哪些指标?Kafka 的监控挺长时间都是一个老大难的问题,社区在监控方面一直没有投入太大的精力。如果要实现一个全面的 Kafka 监控框架,至少应该囊括 Kafka 所在主机资源、JVM(毕竟 Kafka 的 Broker 就是一个 Java 进程)、Kafka 集群本身等的监控,监控 Kafka 集群时还需要关注其客户端程序的性能。本文关注的重点在于 Kafka 和 AutoMQ 集群的监控,对于主机监控和 JVM 监控大家应该已经非常熟悉了。为了更好的说明,先对所涉及的验证环境进行简要介绍,其中包含依赖组件 ZooKeeper、Kafka/AutoMQ 集群自身、CMAK 监控服务。

02

Kafka 监控

为了简单起见,ZooKeeper 只采用了单实例运行。Kafka Broker 则使用了 3 台主机搭建了真实的集群。CMAK 全称为 Cluster Manager for Apache Kafka,也就是以前的 Kafka Manager 改名而来,由 Yahoo 奉献的管理 Kafka 的开源软件。笔者最开始看到这个 CMAK 时老联想起跨平台编译工具“CMake”~_~。

1. 给 Kafka 开启 JMX 监控

Kafka 的官方文档中提到了可以通过 JMX 方式获取 Kafka 的 metrics 信息,可参照 https://kafka.apache.org/documentation/#monitoring。聊到 JMX,其全称为“Java Management Extensions”,它是一种用于监控和管理 Java 应用程序的框架。曾经非常流行,包含著名的 WebLogic 在内的众多 JavaEE 应用服务器中间件,其管理和监控端都可以通过 JMX 技术进行中间件配置管理和监控。很多使用 Zabbix 监控软件对应用服务器中间件监控的场景,也是通过 JMX 方式进行的。JMX 技术的几个核心要点:

  1. 在 JVM 体系里边,需要被管理或者监控的对象,最后都叫做一个 MBean(也就是 Managed Bean),我们不需要去管 MBean 有标准 MBean、动态 MBean、模型 MBean,只需要知道本质其实就是一个普通的 Java 对象即可。

  2. 每个 MBean 通过一个 ObjectName 进行标识,ObjectName 通常是多个键值对组合而成。

  3. 需要管理和监控的项,则以 Attribute 进行暴露。

以 Kafka 为例,如果需要获取一个主题中入队的消息数量统计,则需要查看 ObjecyName 为“kafka.server:type=BrokerTopicMetrics,name= MessagesInPerSec,topic=mainTopic1”的 MBean,该 MBean 会有“Count”、“OneMinuteRate”、“FiveMinuteRate”、“FifteenMinuteRate”等属性分别表示“消息总数”、“过去 1 分钟入队消息速率”、“过去 5 分钟入队消息速率”、““过去 15 分钟入队消息速率”。Kafka 默认是不开启 JMX 的,因此需要在启动之前通过设置 JMX_PORT 环境变量让 Kafka 开启 JMX。

#!/bin/sh
KAFKA_HOME=/home/xuqingkang/kafka-3.7.0
export KAFKA_HEAP_OPTS=" -Xms6g -Xmx6g"
export JMX_PORT="19009"
export KAFKA_JVM_PERFORMANCE_OPTS=" -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true"$KAFKA_HOME/bin/kafka-server-start.sh -daemon 
$KAFKA_HOME/config/server.properties

环境变量中包含 JMX_PORT 时,Kafka 启动脚本通过-D 设置 JMX 相关的几个属性,如"-Dcom.sun.management.jmxremote",便开启了 JMX 支持。

>cat kafka-run-class.sh
# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
  KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false "
fi
# JMX port to use
if [  $JMX_PORT ]; then
   KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
   if ! echo "$KAFKA_JMX_OPTS" | grep -qF -- '-Dcom.sun.management.jmxremote.rmi.port=' ; then
    # If unset, set the RMI port to address issues with monitoring Kafka running in containers
    KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
  fi
fi

当 Kafka 的 Broker 开启了 JMX,使用 JDK 自带的 JConsole 工具就可以连接。打开 jconsole,通过远程的方式指定 ip 地址和端口即可。

JConsole 上正常连接后就可以在 MBean Tab 页,查看 Kafka 众多暴露的 MBean 从而查看到监控数据。如下为获取 Kafka Broker 状态的 MBean。

2. 基于 JMX 自实现 Java 客户端获取 Kafka 监控数据

在某些环境上,可能无法使用 jconsole 可视化界面,那么可以自实现 Java 类,获取 Kafka 监控信息,自实现的 Java 类不需要依赖任何 JDK 之外的 jar 包就可以运行,还是非常的方便。Java 代码的主要逻辑为获取MBeanServer 连接,通过 MBeanServer 连接进行 MBean 的查询以及属性获取。如下代码样例主要是查询 Kafka Broker 之上的所有 LogEndOffset MBean,获取各主题(Topic)分区的 LogEndOffset。

import javax.management.*;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created by qingkang.xu on 2024/6/2.
 */
 public class KafkaJMXMonitor {

     private static MBeanServerConnection conn;
     
     //设置Kafka Broker的JMX连接信息,包括主机ip和JMX_PORT
     private static String ipAndPort = "192.168.32.170:19009";
    
     public static void main(String[] args) {
         // 1、初始化,获取Kafka JMX MbeanServer连接
         if(!init()){
              return;
         }                
         
         // 2、通过正则表达式,获取Kafka下所有主题分区的LogEndOffse
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值