大纲 前言 本文将介绍在三台服务器上,手动部署 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
系统环境变量。
规划集群 节点 IP Web UI 端口 集群通信端口 版本 说明 Kafka Eagle(EFAK)节点一 192.168.2.127
8048
8085
3.0.1
Master 节点 Kafka Eagle(EFAK)节点二 192.168.2.150
8048
8085
3.0.1
Slave 节点 Kafka Eagle(EFAK)节点三 192.168.2.203
8048
8085
3.0.1
Slave 节点
特别注意
(1) 由于服务器资源有限,本文部署的 Kafka Eagle(EFAK)集群只包含 1 个 Master 节点和 2 个 Slave 节点。 (2) 在生产环境部署 Kafka Eagle(EFAK)集群时,强烈建议至少申请四台服务器,然后至少部署 1 个 Master 节点和 3 个 Slave 节点(即一主三从),以此保证高可用性。 安装集群 首先在三台服务器上,根据以下步骤分别安装好 Kafka Eagle(EFAK),安装完成后就形成了三个 Kafka Eagle 集群节点。
提示
为了操作方便,当安装和配置好一个集群节点后,可以使用 scp
命令将安装目录和系统配置文件直接拷贝到其他集群节点上,比如: (1) 拷贝安装文件:scp -r /opt/efak root@192.168.2.150:/opt
(2) 拷贝系统文件:scp -r /etc/profile root@192.168.2.150:/etc
下载安装文件 浏览器访问 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.2.102:2181,192.168.2.103:2181,192.168.2.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.2.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 efak.zk.cluster.alias =cluster1 cluster1.zk.list =192.168.2.102:2181,192.168.2.103:2181,192.168.2.104:2181/kafka 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.2.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.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
SSH 免秘钥登录 Kafka Eagle(EFAK)集群管理的 Shell 脚本是依赖于 SSH 免秘钥登录执行的,因此需要提前配置好各个集群节点之间的 SSH 免秘钥登录,否则执行官方的 ke.sh
脚本会出错。请分别在所有 Kafka Eagle(EFAK)集群节点上,依次执行以下操作。
1 2 3 4 5 $ sudo vi /etc/ssh/sshd_config PubkeyAuthentication yes
1 2 $ sudo systemctl restart sshd
1 2 $ ssh-keygen -t rsa -b 4096
将公钥传输到其他集群节点(比如,在节点一上进行操作,请自行更改节点的登录用户和 IP 地址) 1 2 3 $ ssh-copy-id node1-user@node1-ip $ ssh-copy-id node2-user@node2-ip $ ssh-copy-id node3-user@node3-ip
验证 SSH 免密登录(比如,在节点一上进行操作,请自行更改节点的登录用户和 IP 地址) 1 2 3 $ ssh node1-user@node1-ip $ ssh node2-user@node2-ip $ ssh node3-user@node3-ip
配置集群 配置集群节点一 更改 Kafka Eagle(EFAK)集群节点一的配置文件 /opt/efak/conf/system-config.properties
,指定其作为 Master 节点,同时指定其 IP 地址与集群通信端口(不能使用 Web UI 端口 8048
,否则端口会冲突) 1 $ vi /opt/efak/conf/system-config.properties
1 2 3 4 5 6 7 efak.distributed.enable =true efak.cluster.mode.status =master efak.worknode.master.host =192.168.2.127 efak.worknode.port =8085
更改 Kafka Eagle(EFAK)集群节点一的配置文件 /opt/efak/conf/works
,添加 Kafka Eagle(EFAK)集群的 Slave 节点列表 1 $ vi /opt/efak/conf/works
1 2 192.168.2.150 192.168.2.203
配置集群节点二 更改 Kafka Eagle(EFAK)集群节点二的配置文件 system-config.properties
,指定其作为 Slave 节点,同时指定其 IP 地址与集群通信端口(不能使用 Web UI 端口 8048
,否则端口会冲突) 1 $ vi /opt/efak/conf/system-config.properties
1 2 3 4 5 6 7 efak.distributed.enable =true efak.cluster.mode.status =slave efak.worknode.master.host =192.168.2.150 efak.worknode.port =8085
更改 Kafka Eagle(EFAK)集群节点二的配置文件 /opt/efak/conf/works
,添加 Kafka Eagle(EFAK)集群的 Slave 节点列表 1 $ vi /opt/efak/conf/works
1 2 192.168.2.150 192.168.2.203
配置集群节点三 更改 Kafka Eagle(EFAK)集群节点三的配置文件 system-config.properties
,指定其作为 Slave 节点,同时指定其 IP 地址与集群通信端口(不能使用 Web UI 端口 8048
,否则端口会冲突) 1 $ vi /opt/efak/conf/system-config.properties
1 2 3 4 5 6 7 efak.distributed.enable =true efak.cluster.mode.status =slave efak.worknode.master.host =192.168.2.203 efak.worknode.port =8085
更改 Kafka Eagle(EFAK)集群节点三的配置文件 /opt/efak/conf/works
,添加 Kafka Eagle(EFAK)集群的 Slave 节点列表 1 $ vi /opt/efak/conf/works
1 2 192.168.2.150 192.168.2.203
启动集群 特别注意
(1) 在启动 Kafka Eagle(EFAK)集群之前,必须保证 ZooKeeper 集群、Kafka 集群 和 MySQL 已经启动并正常运行。 (2) 在启动 Kafka Eagle(EFAK)集群之前,必须保证 ZooKeeper 集群、Kafka 集群 和 MySQL 的各个服务端口可以被外部正常访问;如果外部访问不了,请检查操作系统的防火墙配置。 在任意一个 Kafka Eagle(EFAK)集群节点上,执行脚本来启动集群(只需在任意一个节点上执行一次即可) Kafka Eagle(EFAK)集群正常启动后,终端输出的日志信息如下所示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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.2.127:8048' * Account:admin ,Password:123456 ******************************************************************* * <Usage> ke.sh [start|status|stop|restart|stats] </Usage> * <Usage> https://www.kafka-eagle.org/ </Usage> ******************************************************************* [2024-12-07 21:38:36] INFO: EFAK Master-192.168.2.127 WebConsole Start Success. [2024-12-07 21:38:36] INFO: EFAK Slave-192.168.2.150 WebConsole Start Success. [2024-12-07 21:38:36] INFO: EFAK Slave-192.168.2.203 WebConsole Start Success. [2024-12-07 21:38:55] INFO: EFAK Master WorkNodeServer Start Success. [2024-12-07 21:39:01] INFO: EFAK Slave WorkNodeServer-192.168.2.150 Start Success. [2024-12-07 21:39:02] INFO: EFAK Slave WorkNodeServer-192.168.2.203 Start Success.
若 Kafka Eagle(EFAK)集群启动失败,可以在各个集群节点上通过查看日志信息来排查问题 1 2 3 4 5 $ vi /opt/efak/logs/error.log $ vi /opt/efak/logs/worknode.log
管理集群 管理整个集群 查看 Kafka Eagle(EFAK)集群的状态 1 2 3 4 5 6 7 8 9 [2024-12-07 22:39:35] INFO: EFAK WebConsole Status. [2024-12-07 22:39:35] INFO : EFAK-192.168.2.127 is running, [2434] . [2024-12-07 22:39:37] INFO : EFAK-192.168.2.150 is running, [2542] . [2024-12-07 22:39:39] INFO : EFAK-192.168.2.203 is running, [2538] . [2024-12-07 22:39:35] INFO: EFAK WorkNodeServer Status. [2024-12-07 22:39:41] INFO : WorkNodeServer-192.168.2.127 is running, [2568] . [2024-12-07 22:39:42] INFO : WorkNodeServer-192.168.2.150 is running, [2457] . [2024-12-07 22:39:43] INFO : WorkNodeServer-192.168.2.203 is running, [2452] . Time taken: 2 seconds.
管理集群节点 关闭 Kafka Eagle(EFAK)集群中的某个节点 重启 Kafka Eagle(EFAK)集群中的某个节点 查看 Kafka Eagle(EFAK)集群中某个节点的进程信息 1 [2024-12-07 22:11:50] INFO : EFAK-fd34:dd83:8cb9::b3e 192.168.2.127 is running, [3346] .
查看 Kafka Eagle(EFAK)集群中某个节点在 Linux 操作系统中的句柄数 1 2 3 4 5 6 7 8 9 10 ===================== 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.) 39 2434/java ===================== ESTABLISHED/TIME_OUT Status ==================== 1 192.168.2.203 1 192.168.2.150 ===================== Connection Number Of Different States =========== LISTEN 13 ESTABLISHED 71
查看 Kafka Eagle(EFAK)集群中某个节点的垃圾回收(GC)情况 1 2 3 4 5 [2024-12-07 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
管理命令汇总 命令 描述 ke.sh start 启动 EFAK 服务器。 ke.sh status 查看 EFAK 运行状态。 ke.sh stop 停止 EFAK 服务器。 ke.sh restart 重新启动 EFAK 服务器。 ke.sh stats 查看 Linux 操作系统中的 EFAK 句柄数。 ke.sh find [ClassName] 在 Jar 中找到类名的位置。 ke.sh gc 查看 EFAK 进程的 GC 情况。 ke.sh version 查看 EFAK 版本。 ke.sh jdk 查看 EFAK 安装的 JDK 详细信息。 ke.sh sdate 查看 EFAK 启动日期。 ke.sh cluster start 启动 EFAK 集群。 ke.sh cluster stop 停止 EFAK 集群。 ke.sh cluster restart 重启 EFAK 集群。 ke.sh cluster status 查看 EFAK 集群的状态。
验证集群 (1) 浏览器通过 http://192.168.2.127:8048
访问 Kafka Eagle(EFAK)的控制台管理页面(如下所示),默认的登录账号和密码是 admin/123456
,请记得将 192.168.2.127
更改为你自己服务器的 IP 地址。
(2) 浏览器通过 http://192.168.2.127:8048/tv
就可以访问监控数据大屏的页面(如下所示),请记得将 192.168.2.127
更改为你自己服务器的 IP 地址。
(3) 浏览器通过 http://192.168.2.127:8048/cluster/kafka
就可以访问 Kafka 的监控页面(如下所示),请记得将 192.168.2.127
更改为你自己服务器的 IP 地址。
(4) 浏览器通过 http://192.168.2.127:8048/cluster/zookeeper
就可以访问 ZooKeeper 的监控页面(如下所示),请记得将 192.168.2.127
更改为你自己服务器的 IP 地址。
(5) 浏览器通过 http://192.168.2.127:8048/cluster/efakserver
就可以访问 EfakServer 的监控页面(如下所示),请记得将 192.168.2.127
更改为你自己服务器的 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)没有启用集群模式或者集群模式配置不正确导致的,请检查各个集群节点的配置,其中的 8085
端口是 EFAK 集群的通信端口(不能使用 Web UI 端口 8048
,否则端口会冲突),如下所示:
Master 节点的 /opt/efak/conf/system-config.properties
配置文件 1 2 3 4 5 6 7 efak.distributed.enable =true efak.cluster.mode.status =master efak.worknode.master.host =192.168.2.127 efak.worknode.port =8085
Slave 节点一的 /opt/efak/conf/system-config.properties
配置文件 1 2 3 4 5 6 7 efak.distributed.enable =true efak.cluster.mode.status =slave efak.worknode.master.host =192.168.2.150 efak.worknode.port =8085
Slave 节点二的 /opt/efak/conf/system-config.properties
配置文件 1 2 3 4 5 6 7 efak.distributed.enable =true efak.cluster.mode.status =slave efak.worknode.master.host =192.168.2.203 efak.worknode.port =8085
Master 节点与 Slave 节点的 /opt/efak/conf/works
配置文件 1 2 192.168.2.150 192.168.2.203
内存不足导致服务启动失败 在 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
选项来减少系统负载。
Kafka Eagle 工作原理 Kafka Eagle 集群整体架构 当 Kafka Eagle(EFAK)以集群(分布式)模式部署,并且一共有 5 个节点(包括 1 个 Master 和 4 个 Slave)时,各个节点的角色如下图所示:
Kafka Eagle 数据采集原理 Kafka Eagle(EFAK)针对 Kafka 可以采集以下数据:
Kafka Broker 常用机器加载信息:内存、CPU、IP、版本信息等 应用程序监控:消费者组、消费者、生产者、主题等 服务监控数据:TPS、QPS、RT 等
参考教程