大纲 前言 本文将介绍在 Linux 系统上,手动部署 Kafka-Eagle(EFAK)的单机服务,实现对 Kafka 集群的管理和监控,适用于 CentOS/Debian/Ubuntu 等发行版。
官方资源 准备工作 部署依赖服务 在部署 Kafka Eagle(EFAK)之前,请确保已经部署好 ZooKeeper 集群、Kafka 集群、MySQL。 服务 版本 说明 ZooKeeper 3.8.4
集群(三节点) Kafka 3.9.0
集群(三节点) MySQL 8.4.2
单机
提示
从 Kafka 2.8.0
版本开始,Kafka 自身实现了 Raft
分布式一致性机制,这意味着 Kafka 集群是可以脱离 ZooKeeper 独立运行的。但是,本文使用的 Kafka 集群是依赖于 ZooKeeper 的,因此需要提前将 ZooKeeper 集群部署好。 Kafka Eagle(EFAK)集群需要一个数据库来统一存储其配置数据,如用户数据、Kafka 集群的监控指标数据等。当不使用 MySQL 来存储 Kafka 的监控指标数据时,Kafka Eagle(EFAK)默认使用的是 SQLite,而 SQLite 是存储在 EFAK 安装位置的嵌入式数据库。 初始化数据库 创建数据库,用于 Kafka Eagle(EFAK)存储 Kafka 的监控指标数据 1 2 -- 创建数据库 CREATE DATABASE efak DEFAULT CHARACTER SET utf8mb4;
创建数据库用户并授权访问,用于 Kafka Eagle(EFAK)连接 MySQL 1 2 3 4 5 6 7 8 -- 创建用户 CREATE USER 'efak' @'%' IDENTIFIED WITH mysql_native_password BY '123456' ; -- 用户授权 GRANT ALL PRIVILEGES ON efak.* TO 'efak' @'%' ; -- 刷新权限 FLUSH PRIVILEGES;
提示
在初始化 MySQL 数据库时,只需要创建数据库,而不需要手动创建数据库表。这是因为 Kafka Eagle(EFAK)会在启动的时候自动创建所需的 数据库表 ,前提是 Kafka Eagle(EFAK)用于连接 MySQL 的用户有对应的数据库操作权限。
Kafka Eagle 单机部署 本节将部署 Kafka Eagle(EFAK)单实例,以实现对 Kafka 集群的管理和监控。值得一提的是,Kafka Eagle(EFAK)的运行依赖于 JDK 1.8+,请提前安装并配置好 Java 运行环境,包括添加 JAVA_HOME
系统环境变量。
单机部署规划 服务 版本 说明 Kafka Eagle(EFAK) 3.0.1
单机
下载安装文件 浏览器访问 Kafka Eagle(EFAK)的 GitHub 项目 ,然后选择最新版本的二进制包进行下载并解压 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ wget https://github.com/smartloli/kafka-eagle-bin/archive/refs/tags/v3.0.1.tar.gz $ tar -xvf v3.0.1.tar.gz $ cd kafka-eagle-bin-3.0.1 $ tar -xvf efak-web-3.0.1-bin.tar.gz $ sudo mv efak-web-3.0.1 /opt/efak $ sudo chmod -R 777 /opt/efak $ sudo chmod +x /opt/efak/bin/ke.sh
更改配置文件 提示
Kafka Eagle(EFAK)是支持管理多个 Kafka 集群的,由于笔者只部署了一个 Kafka 集群,因此在下述配置内容中只配置了一个 Kafka 集群。
编辑 Kafka Eagle(EFAK)的配置文件 system-config.properties
1 2 3 4 5 $ cp /opt/efak/conf/system-config.properties /opt/efak/conf/system-config.properties.bak $ vi /opt/efak/conf/system-config.properties
然后更改配置文件的内容,更改后的完整配置内容如下所示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 efak.zk.cluster.alias =cluster1 cluster1.zk.list =192.168.1.102:2181,192.168.1.103:2181,192.168.1.104:2181/kafka cluster1.zk.acl.enable =false cluster1.zk.acl.schema =digest cluster1.zk.acl.username =test cluster1.zk.acl.password =test123 cluster1.efak.broker.size =20 kafka.zk.limit.size =32 efak.webui.port =8048 efak.distributed.enable =false cluster1.efak.jmx.acl =false cluster1.efak.jmx.user =keadmin cluster1.efak.jmx.password =keadmin123 cluster1.efak.jmx.ssl =false cluster1.efak.jmx.truststore.location =/data/ssl/certificates/kafka.truststore cluster1.efak.jmx.truststore.password =ke123456 cluster1.efak.offset.storage =kafka cluster1.efak.jmx.uri =service:jmx:rmi:///jndi/rmi://%s/jmxrmi efak.metrics.charts =true efak.metrics.retain =30 efak.sql.topic.records.max =5000 efak.sql.topic.preview.records.max =10 efak.topic.token =keadmin cluster1.efak.sasl.enable =false cluster1.efak.sasl.protocol =SASL_PLAINTEXT cluster1.efak.sasl.mechanism =SCRAM-SHA-256 cluster1.efak.sasl.jaas.config =org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka" password="kafka-eagle"; cluster1.efak.sasl.client.id =cluster1.efak.blacklist.topics =cluster1.efak.sasl.cgroup.enable =false cluster1.efak.sasl.cgroup.topics =cluster1.efak.ssl.enable =false cluster1.efak.ssl.protocol =SSL cluster1.efak.ssl.truststore.location =cluster1.efak.ssl.truststore.password =cluster1.efak.ssl.keystore.location =cluster1.efak.ssl.keystore.password =cluster1.efak.ssl.key.password =cluster1.efak.ssl.endpoint.identification.algorithm =https cluster1.efak.blacklist.topics =cluster1.efak.ssl.cgroup.enable =false cluster1.efak.ssl.cgroup.topics =efak.driver =com.mysql.cj.jdbc.Driver efak.url =jdbc:mysql://192.168.1.107:3306/efak?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull efak.username =efak efak.password =123456
在上述配置内容中,最重要的是以下几个配置项,其他配置项一般使用默认值即可 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 efak.zk.cluster.alias =cluster1 cluster1.zk.list =192.168.1.102:2181,192.168.1.103:2181,192.168.1.104:2181/kafka efak.distributed.enable =false cluster1.efak.offset.storage =kafka efak.metrics.charts =true efak.metrics.retain =30 efak.driver =com.mysql.cj.jdbc.Driver efak.url =jdbc:mysql://192.168.1.107:3306/efak?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull efak.username =efak efak.password =123456
重要参数说明
cluster1.zk.list
:指定 Kafka 集群一连接的 ZooKeeper 节点列表。cluster1.efak.offset.storage
:指定 Kafka 集群一存储 Offset 的位置。efak.username
:指定 Kafka Eagle(EFAK)连接数据库的用户名。efak.password
:指定 Kafka Eagle(EFAK)连接数据库的密码。efak.driver
:指定 Kafka Eagle(EFAK)连接数据库的驱动。efak.url
:指定 Kafka Eagle(EFAK)连接数据库的 URL。efak.distributed.enable
:指定 Kafka Eagle(EFAK)是否以集群(分布式)模式运行。efak.metrics.charts
:在 Kafka Eagle(EFAK)的 UI 中,是否允许实时显示 Kafka 的监控指标图表。efak.metrics.retain
:Kafka Eagle(EFAK)保留 Kafka 监控指标数据的最长时间(比如 30 天),超过设定的时间监控指标数据就会被删除。添加环境变量 1 2 3 4 5 6 7 $ sudo vi /etc/profile export KE_HOME=/opt/efakexport PATH=$PATH :$KE_HOME /bin$ sudo source /etc/profile
启动监控服务 特别注意
在启动 Kafka Eagle(EFAK)服务之前,必须保证 ZooKeeper 集群、Kafka 集群、MySQL 已经启动并正常运行。
Kafka Eagle(EFAK)服务正常启动后,终端输出的日志信息如下所示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Welcome to ______ ______ ___ __ __ / ____/ / ____/ / | / //_/ / __/ / /_ / /| | / ,< / /___ / __/ / ___ | / /| | /_____/ /_/ /_/ |_|/_/ |_| ( Eagle For Apache Kafka® ) Version v3.0.1 -- Copyright 2016-2022 ******************************************************************* * EFAK Service has started success. * Welcome, Now you can visit 'http://192.168.1.140:8048' * Account:admin ,Password:123456 ******************************************************************* * <Usage> ke.sh [start|status|stop|restart|stats] </Usage> * <Usage> https://www.kafka-eagle.org/ </Usage> *******************************************************************
若 Kafka Eagle(EFAK)服务启动失败,可以通过查看错误日志来排查问题 1 $ vi /opt/efak/logs/error.log
管理监控服务 查看 Kafka Eagle(EFAK)服务的进程信息 1 [2024-12-06 23:29:22] INFO : EFAK-fd34:dd83:8cb9::350 192.168.1.140 is running, [71079] .
查看 Kafka Eagle(EFAK)服务在 Linux 系统中的句柄数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ===================== TCP Connections Count ========================== (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) 58 71079/java ===================== ESTABLISHED/TIME_OUT Status ==================== 112 127.0.0.1 72 192.168.1.140 2 101.43.223.179 1 58.63.233.5 1 220.181.174.34 1 220.181.174.33 1 20.42.73.30 1 173.194.202.188 1 13.250.7.155 ===================== Connection Number Of Different States =========== LISTEN 72 CLOSE_WAIT 5 ESTABLISHED 192 FIN_WAIT2 1 TIME_WAIT 151 ===================== End =============================================
查看 Kafka Eagle(EFAK)服务的垃圾回收(GC)情况 1 2 3 4 5 [2024-12-06 23:40:29] INFO : EFAK Process[52129] GC. S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT 0.00 100.00 63.29 3.99 97.86 92.33 98 0.702 0 0.000 0 0.000 0.702 0.00 100.00 63.29 3.99 97.86 92.33 98 0.702 0 0.000 0 0.000 0.702 0.00 100.00 63.29 3.99 97.86 92.33 98 0.702 0 0.000 0 0.000 0.702
验证监控服务 (1) 浏览器通过 http://192.168.1.140:8048
访问 Kafka Eagle(EFAK)的控制台管理页面(如下所示),默认的登录账号和密码是 admin/123456
,请记得将 192.168.1.140
更改为你自己机器的 IP 地址。
(2) 浏览器通过 http://192.168.1.140:8048/tv
就可以访问监控数据大屏的页面(如下所示),请记得将 192.168.1.140
更改为你自己机器的 IP 地址。
(3) 浏览器通过 http://192.168.1.140:8048/cluster/kafka
就可以访问 Kafka 的监控页面(如下所示),请记得将 192.168.1.140
更改为你自己机器的 IP 地址。
(4) 浏览器通过 http://192.168.1.140:8048/cluster/zookeeper
就可以访问 ZooKeeper 的监控页面(如下所示),请记得将 192.168.1.140
更改为你自己机器的 IP 地址。
Kafka Eagle 部署问题 无法监控 Kafka 集群 在 Kafka Eagle(EFAK)的控制台中访问 Kafka 的监控页面时,发现无法正常显示 Kafka 的运行状态,如下图所示:
这通常是由于 Kafka 服务没有配置 JMX 服务或者 JMX 服务配置不正确导致的,因为 Kafka Eagle(EFAK)是基于 JMX 服务来实现 Kafka 运行状态的监控。解决办法是,为 Kafka 服务添加对应的 JMX 配置。
(1) 如果 Kafka 服务是通过手动部署的(基于二进制安装包),那么可以在执行 kafka-server-start.sh
启动脚本时,添加 JMX_PORT
环境变量来启用 JMX 服务(如下所示),详细教程请参考 这里 1 JMX_PORT=19999 ./kafka-server-start.sh -daemon ../config/server.properties
(2) 如果 Kafka 服务是通过 Docker-Compose 部署的,那么可以参考以下配置内容,详细教程请参考 这里 1 2 3 4 5 6 7 8 9 10 11 version: '3.5' services: kafka: image: bitnami/kafka:3.9.0 ports: - 9092 :9092 - 19999 :19999 environment: KAFKA_JMX_PORT: 19999 KAFKA_JMX_OPTS: '-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka -Dcom.sun.management.jmxremote.port=19999'
Kafka Eagle 无法监控自己 在 Kafka Eagle(EFAK)的控制台中访问 EfakServer 的监控页面时,发现无法正常显示 EfakServer 的运行状态,监控页面一直显示提示信息 Processing
或者节点状态显示为 Offline
,如下图所示:
这个问题可以忽略不解决,猜测(待验证)只有当 Kafka Eagle(EFAK)以集群(分布式)模式部署时,EfakServer 的监控页面才会正常显示相关监控信息,详细说明请看 这里 。如果不希望 UI 将节点状态显示为 Offline
,可参考以下配置信息:
1 2 3 4 5 6 7 efak.distributed.enable =false
内存不足导致服务启动失败 在 Kafka Eagle(EFAK)的项目源码中,有一个 ke.sh
启动脚本 ,该脚本里面有以下一行代码:
1 export KE_JAVA_OPTS="-server -Xmx2g -Xms2g -XX:MaxGCPauseMillis=20 -XX:+UseG1GC -XX:MetaspaceSize=128m -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"
其中 JVM 参数 -Xms2g
指定了初始堆内存为 2G
,因此当操作系统的空闲内存不足 2G
时,会导致 Kafka Eagle(EFAK)服务启动失败。解决办法是,更改 Shell 脚本代码,或者增加机器的物理内存(强烈推荐)。
监控大屏无法实时更新显示 在 Kafka Eagle(EFAK)的控制台中访问监控大屏页面时,发现即使有生产者正在发送消息和消费者正在消费消息,Kafka 集群的监控指标图表也无法实时更新显示或者没有任何监控数据显示(如下图所示)。这是因为 Kafka Eagle(EFAK)禁用了 Kafka 集群的监控指标图表实时更新。
解决办法是,在 Kafka Eagle(EFAK)的 system-config.properties
配置文件中,更改或添加以下配置:
1 efak.metrics.charts =true
特别注意
在 Kafka Eagle(EFAK)的控制台中,Kafka 集群监控指标图表的渲染和数据获取会消耗一定的资源。如果 Kafka 的集群规模较大或者系统资源有限,建议通过禁用 efak.metrics.charts
选项来减少系统负载。
参考教程