Linux 部署 Kafka-Eagle(EFAK)单机

大纲

前言

本文将介绍在 Linux 系统上,手动部署 Kafka-Eagle(EFAK)的单机服务,实现对 Kafka 集群的管理和监控,适用于 CentOS/Debian/Ubuntu 等发行版。

官方资源

准备工作

部署依赖服务

  • 在部署 Kafka Eagle(EFAK)之前,请确保已经部署好 ZooKeeper 集群、Kafka 集群、MySQL。
服务版本说明
ZooKeeper3.8.4集群(三节点)
Kafka3.9.0集群(三节点)
MySQL8.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
######################################
# multi zookeeper & kafka cluster list
# Settings prefixed with 'kafka.eagle.' will be deprecated, use 'efak.' instead
######################################
efak.zk.cluster.alias=cluster1
cluster1.zk.list=192.168.1.102:2181,192.168.1.103:2181,192.168.1.104:2181/kafka

######################################
# zookeeper enable acl
######################################
cluster1.zk.acl.enable=false
cluster1.zk.acl.schema=digest
cluster1.zk.acl.username=test
cluster1.zk.acl.password=test123

######################################
# broker size online list
######################################
cluster1.efak.broker.size=20

######################################
# zk client thread limit
######################################
kafka.zk.limit.size=32

######################################
# EFAK webui port
######################################
efak.webui.port=8048

######################################
# EFAK enable distributed
######################################
efak.distributed.enable=false
# efak.cluster.mode.status=master
# efak.worknode.master.host=localhost
# efak.worknode.port=8085

######################################
# kafka jmx acl and ssl authenticate
######################################
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

######################################
# kafka offset storage
######################################
cluster1.efak.offset.storage=kafka

######################################
# kafka jmx uri
######################################
cluster1.efak.jmx.uri=service:jmx:rmi:///jndi/rmi://%s/jmxrmi

######################################
# kafka metrics, 15 days by default
######################################
efak.metrics.charts=true
efak.metrics.retain=30

######################################
# kafka sql topic records max
######################################
efak.sql.topic.records.max=5000
efak.sql.topic.preview.records.max=10

######################################
# delete kafka topic token
######################################
efak.topic.token=keadmin

######################################
# kafka sasl authenticate
######################################
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=

######################################
# kafka ssl authenticate
######################################
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=

######################################
# kafka sqlite jdbc driver address
######################################
# efak.driver=org.sqlite.JDBC
# It is important to note that the '/opt/efak/db' path must exist.
# efak.url=jdbc:sqlite:/opt/efak/db/ke.db
# efak.username=root
# efak.password=smartloli

######################################
# kafka mysql jdbc driver address
######################################
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
######################################
# multi zookeeper & kafka cluster list
# Settings prefixed with 'kafka.eagle.' will be deprecated, use 'efak.' instead
######################################
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 enable distributed
######################################
efak.distributed.enable=false
# efak.cluster.mode.status=master
# efak.worknode.master.host=localhost
# efak.worknode.port=8085

######################################
# kafka offset storage
######################################
cluster1.efak.offset.storage=kafka

######################################
# kafka metrics, 15 days by default
######################################
efak.metrics.charts=true
efak.metrics.retain=30

######################################
# kafka jdbc driver address
######################################
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/efak
export PATH=$PATH:$KE_HOME/bin

# 使改系统配置文件的更改生效
$ sudo source /etc/profile

启动监控服务

特别注意

在启动 Kafka Eagle(EFAK)服务之前,必须保证 ZooKeeper 集群、Kafka 集群、MySQL 已经启动并正常运行。

  • 启动 Kafka Eagle(EFAK)服务
1
$ ke.sh start
  • 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
$ ke.sh stop
  • 重启 Kafka Eagle(EFAK)服务
1
$ ke.sh restart
  • 查看 Kafka Eagle(EFAK)服务的进程信息
1
$ ke.sh status
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
$ ke.sh stats
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
$ ke.sh 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 # 映射 JMX 端口
environment:
KAFKA_JMX_PORT: 19999 # 指定 JMX 端口
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 enable distributed
######################################
efak.distributed.enable=false
# efak.cluster.mode.status=master
# efak.worknode.master.host=localhost
# efak.worknode.port=8085

内存不足导致服务启动失败

在 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 选项来减少系统负载。

参考教程