kafka监控kafka manager(CMAK)部署配置

一、准备工作

1.1、服务器信息梳理

角色IP操作系统安装服务
监控机10.45.19.20Linux CentOS 7.9CMAK3.0.0.5、ZooKeeper3.9.0、JDK11、JDK1.8
被监控机 Kafka broker.id 050.50.50.101Linux CentOS 7.9Kafka、ZooKeeper(任意版本)
被监控机 Kafka broker.id 150.50.50.101Linux CentOS 7.9Kafka、ZooKeeper(任意版本)
被监控机 Kafka broker.id 250.50.50.101Linux CentOS 7.9Kafka、ZooKeeper(任意版本)

1.2、准备以下安装包

https://www.oracle.com/java/technologies/downloads/archive
https://archive.apache.org/dist/zookeeper
https://github.com/yahoo/CMAK
jdk-11.0.26_linux-x64_bin.tar.gz
jdk-8u161-linux-x64.tar.gz
apache-zookeeper-3.9.0-bin.tar.gz
cmak-3.0.0.5.zip

1.3、创建安装目录

mkdir /usr/local/cmak

二、部署 JDK11 环境

jdk-11.0.26_linux-x64_bin.tar.gz
tar zxf jdk-11.0.26_linux-x64_bin.tar.gz -C /usr/local/cmak

三、部署 ZooKeeper 存储元数据

3.1、部署 JDK1.8 环境

tar zxf jdk-8u161-linux-x64.tar.gz -C /usr/local/cmak
vim /etc/etc/profile
export PATH=$PATH:/usr/local/cmak/jdk1.8.0_161/bin

3.2、部署 ZooKeeper

3.2.1、解压至安装目录

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.9.0/apache-zookeeper-3.9.0-bin.tar.gz
tar zxf apache-zookeeper-3.9.0-bin.tar.gz -C /usr/local/cmak
mv /usr/local/cmak/apache-zookeeper-3.9.0-bin /usr/local/cmak/zookeeper-3.9.0

3.2.2、创建存储目录

mkdir /usr/local/cmak/zookeeper-3.9.0/{data,logs}

3.2.3、编辑配置文件

cp /usr/local/cmak/zookeeper-3.9.0/conf/zoo_sample.cfg /usr/local/cmak/zookeeper-3.9.0/conf/zoo.cfg
vim /usr/local/cmak/zookeeper-3.9.0/conf/zoo.cfg
dataDir=/usr/local/cmak/zookeeper-3.9.0/data
dataLogDir=/usr/local/cmak/zookeeper-3.9.0/logs
clientPort=3281
admin.serverPort=3282
tickTime=2000
initLimit=10
syncLimit=5

3.2.4、启动

sh /usr/local/cmak/zookeeper-3.9.0/bin/zkServer.sh start

四、部署 CMAK 监控

4.1、解压至安装目录

https://github.com/yahoo/CMAK/releases/download/3.0.0.5/cmak-3.0.0.5.zip
unzip cmak-3.0.0.6.zip -d /usr/local/cmak

4.2、编写配置文件

vim /usr/local/cmak/cmak-3.0.0.6/conf/application.conf
# -------------------------------------------------------------------
# Application 基础配置
# -------------------------------------------------------------------

# 加密会话和 Cookie 的密钥(生产环境建议使用环境变量覆盖)
# 默认硬编码密钥(注意:硬编码密钥不安全,建议通过环境变量设置)
play.crypto.secret="^<csmm5Fx4d=r2HEX8pelM3iBkFVv?k[mc;IZE<_Qoq8EkX_/7@Zt6dP05Pzea3U"
# 允许通过环境变量 APPLICATION_SECRET 覆盖密钥
play.crypto.secret=${?APPLICATION_SECRET}

# 会话过期时间(1小时)
play.http.session.maxAge="1h"

# 国际化支持的语言列表(当前仅英语)
play.i18n.langs=["en"]

# HTTP 请求处理器和上下文路径
play.http.requestHandler = "play.http.DefaultHttpRequestHandler"
play.http.context = "/"

# 应用加载器类(自定义 Kafka Manager 加载逻辑)
play.application.loader=loader.KafkaManagerLoader


# -------------------------------------------------------------------
# ZooKeeper 配置
# -------------------------------------------------------------------

# ZooKeeper 连接地址(默认值)
cmak.zkhosts="10.45.19.20:3281"
# 允许通过环境变量 ZK_HOSTS 覆盖 ZooKeeper 地址
cmak.zkhosts=${?ZK_HOSTS}


# -------------------------------------------------------------------
# 线程调度配置
# -------------------------------------------------------------------

# 固定调度器配置(确保每个 Actor 独占线程池)
pinned-dispatcher.type="PinnedDispatcher"
pinned-dispatcher.executor="thread-pool-executor"


# -------------------------------------------------------------------
# 应用功能特性开关
# -------------------------------------------------------------------
# 启用的 Kafka 管理功能列表:
# - 集群管理
# - Topic 管理
# - 首选副本选举
# - 分区重分配
# - 计划 Leader 选举
application.features=[
  "KMClusterManagerFeature",
#  "KMTopicManagerFeature",
#  "KMPreferredReplicaElectionFeature",
#  "KMReassignPartitionsFeature",
#  "KMScheduleLeaderElectionFeature"
]


# -------------------------------------------------------------------
# Akka 配置
# -------------------------------------------------------------------
akka {
  # 使用 SLF4J 作为日志记录器
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  # 日志级别(INFO | DEBUG | WARN | ERROR)
#  loglevel = "INFO"
  loglevel = "WARN"
}

# Akka 日志系统启动超时时间
akka.logger-startup-timeout = 60s


# -------------------------------------------------------------------
# 基础认证配置
# -------------------------------------------------------------------

# 是否启用基础认证(默认禁用)
basicAuthentication.enabled=true
# 允许通过环境变量 KAFKA_MANAGER_AUTH_ENABLED 覆盖
basicAuthentication.enabled=${?KAFKA_MANAGER_AUTH_ENABLED}

# LDAP 认证配置 -----------------------------------------------------
# 是否启用 LDAP 认证(默认禁用)
basicAuthentication.ldap.enabled=false
basicAuthentication.ldap.enabled=${?KAFKA_MANAGER_LDAP_ENABLED}

# LDAP 服务器地址(示例:ldap://hostname)
basicAuthentication.ldap.server=""
basicAuthentication.ldap.server=${?KAFKA_MANAGER_LDAP_SERVER}

# LDAP 端口(默认 389,SSL 通常为 636
basicAuthentication.ldap.port=389
basicAuthentication.ldap.port=${?KAFKA_MANAGER_LDAP_PORT}

# 连接 LDAP 的用户名和密码
basicAuthentication.ldap.username=""
basicAuthentication.ldap.username=${?KAFKA_MANAGER_LDAP_USERNAME}
basicAuthentication.ldap.password=""
basicAuthentication.ldap.password=${?KAFKA_MANAGER_LDAP_PASSWORD}

# LDAP 搜索配置
basicAuthentication.ldap.search-base-dn=""
basicAuthentication.ldap.search-base-dn=${?KAFKA_MANAGER_LDAP_SEARCH_BASE_DN}
basicAuthentication.ldap.search-filter="(uid=$capturedLogin$)"
basicAuthentication.ldap.search-filter=${?KAFKA_MANAGER_LDAP_SEARCH_FILTER}

# LDAP 组过滤配置
basicAuthentication.ldap.group-filter=""
basicAuthentication.ldap.group-filter=${?KAFKA_MANAGER_LDAP_GROUP_FILTER}

# 连接池配置
basicAuthentication.ldap.connection-pool-size=10
basicAuthentication.ldap.connection-pool-size=${?KAFKA_MANAGER_LDAP_CONNECTION_POOL_SIZE}

# SSL 配置
basicAuthentication.ldap.ssl=false
basicAuthentication.ldap.ssl=${?KAFKA_MANAGER_LDAP_SSL}
basicAuthentication.ldap.ssl-trust-all=false
basicAuthentication.ldap.ssl-trust-all=${?KAFKA_MANAGER_LDAP_SSL_TRUST_ALL}

# 基础认证凭据(仅在启用基础认证且未启用 LDAP 时生效)
basicAuthentication.username="admin"
basicAuthentication.username=${?KAFKA_MANAGER_USERNAME}
basicAuthentication.password="Quk@EL!4xMyj3hnD"
basicAuthentication.password=${?KAFKA_MANAGER_PASSWORD}

# 认证领域名称和免认证路径(/api/health 用于健康检查)
basicAuthentication.realm="Kafka-Manager"
basicAuthentication.excluded=["/api/health"]


# -------------------------------------------------------------------
# Kafka 消费者配置
# -------------------------------------------------------------------

# 外部消费者配置文件路径(可选)
kafka-manager.consumer.properties.file=${?CONSUMER_PROPERTIES_FILE}
vim /usr/local/cmak/cmak-3.0.0.6/conf/logback.xml
<!-- 修改后的配置(重点关注 encoder 部分的 regex 过滤) -->
<configuration>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${application.home}/logs/application.log</file>
        <encoder>
           <!-- 添加敏感信息过滤 -->
           <pattern>%date - [%level] - from %logger in %thread %n%replace(%message){'SASL JAAS config=.*', 'SASL JAAS config=******'}%n%xException%n</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${application.home}/logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>5</maxHistory>
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 添加敏感信息过滤 -->
            <pattern>%date - [%level] %logger{15} - %replace(%message){'SASL JAAS config=.*', 'SASL JAAS config=******'}%n%xException{10}</pattern>
        </encoder>
    </appender>

    <!-- 其他部分保持不变 -->
    <appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
    </appender>

    <appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="STDOUT" />
    </appender>

    <logger name="play" level="INFO" />
    <logger name="application" level="INFO" />
    <logger name="kafka.manager" level="INFO" />

    <!-- Off these ones as they are annoying, and anyway we manage configuration ourself -->
    <logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF" />
    <logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF" />
    <logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF" />
    <logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" />
    <logger name="org.apache.zookeeper" level="INFO"/>

    <root level="WARN">
        <appender-ref ref="ASYNCFILE" />
        <appender-ref ref="ASYNCSTDOUT" />
    </root>

</configuration>

4.3、编写启停脚本

vim /usr/local/cmak/cmak-3.0.0.6/start.sh
#!/bin/bash

JDK11_PATH="/usr/local/cmak/jdk-11.0.26"
CMAK_PATH="/usr/local/cmak/cmak-3.0.0.6"
CMAK_PORT="3283"
$CMAK_PATH/bin/cmak \
  -Dconfig.file=$CMAK_PATH/conf/application.conf \
  -java-home $JDK11_PATH \
  -Dhttp.port=$CMAK_PORT > /dev/null &
vim /usr/local/cmak/cmak-3.0.0.6/stop.sh
#!/bin/bash

CMAK_PATH="/usr/local/cmak/cmak-3.0.0.6"
ps aux | grep 'java' | grep 'cmak-3.0.0.6' | awk '{print $2}' | xargs -r kill -9
[[ -f "$CMAK_PATH/RUNNING_PID" ]] && rm -f $CMAK_PATH/RUNNING_PID
chmod +x /usr/local/cmak/cmak-3.0.0.6/{start.sh,stop.sh}

4.4、启动

sh /usr/local/cmak/cmak-3.0.0.6/start.sh

五、添加集群监控

在这里插入图片描述

  • 注意!是添加 zookeeper 集群
10.73.251.66:2261,10.73.251.67:2261,10.73.251.68:2261
  • 认证配置格式
org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="2332***JA";

六、Kafka 启用 JMX

6.1、添加认证文件

vim /usr/local/kafka_2.13-2.8.2/config/jmxremote.access
monitorRole readonly
controlRole readwrite
vim /usr/local/kafka_2.13-2.8.2/config/jmxremote.password
monitorRole password123
controlRole password456
chmod 600 /usr/local/kafka_2.13-2.8.2/config/jmxremote.password

6.2、配置文件解释

6.2.1、jmxremote.access 文件

jmxremote.access 文件定义了哪些角色可以访问 JMX,及其访问级别。

每个角色对应不同的权限。

通过此文件,可以设置不同的角色及其对 JMX 连接的权限。

格式:

<role> <permission>
  • role:角色名称(如 monitorRole,controlRole)。

  • permission:该角色的权限,可以是以下值之一:

  • readonly:只读权限,允许查看监控数据,但不能进行任何操作。

  • readwrite:读写权限,允许查看监控数据并执行管理操作。

示例:

monitorRole readonly
controlRole readwrite

上面的示例表示:

  • monitorRole 角色具有只读权限,用户可以连接 JMX 进行监控,但不能进行修改或控制。

  • controlRole 角色具有读写权限,用户不仅可以进行监控,还可以修改或控制应用程序的行为(例如重启服务等)。

6.2.2、jmxremote.password 文件

jmxremote.password 文件存储了每个角色的密码。

这个文件与 jmxremote.access 文件配合使用,确保只有具有正确密码的用户才能连接到 JMX 服务。

格式:

<role> <password>
  • role:与 jmxremote.access 文件中角色匹配。

  • password:该角色对应的密码。

示例:

monitorRole password123
controlRole password456

上面的示例表示:

  • monitorRole 角色的密码是 password123。

  • controlRole 角色的密码是 password456。

6.2.3、配置与权限的关系

这两个文件的配合使得 JMX 访问可以进行基于角色的控制和认证:

jmxremote.access 文件用于定义权限:哪些角色能做什么操作。

jmxremote.password 文件用于定义认证:哪些角色有权访问,并提供密码来验证身份。

6.3、修改启动脚本

vim /usr/local/kafka_2.13-2.8.2/kafka_start.sh
#!/bin/bash
kafka_path="/usr/local/kafka_2.13-2.8.2"
export KAFKA_OPTS=" -Djava.security.auth.login.config=$kafka_path/config/kafka_server_jaas.conf "
$kafka_path/bin/kafka-server-start.sh $kafka_path/config/server.properties > $kafka_path/kafka_nohup.out &

改为:

  • 注意!!!注意!!!环境变量中参数前后的空格是必须的!!!
#!/bin/bash
kafka_path="/usr/local/kafka_2.13-2.8.2"

# 设置 JMX 端口和认证
export JMX_PORT=9999
export KAFKA_JMX_OPTS=" -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=$JMX_PORT \
  -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \
  -Dcom.sun.management.jmxremote.authenticate=true \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Djava.rmi.server.hostname=127.0.0.1 \
  -Dcom.sun.management.jmxremote.access.file=$kafka_path/config/jmxremote.access \
  -Dcom.sun.management.jmxremote.password.file=$kafka_path/config/jmxremote.password "

export KAFKA_OPTS=" $KAFKA_JMX_OPTS -Djava.security.auth.login.config=$kafka_path/config/kafka_server_jaas.conf "

# 启动 Kafka 并将日志重定向
$kafka_path/bin/kafka-server-start.sh $kafka_path/config/server.properties >> $kafka_path/kafka_nohup.out &

6.4、重启 Kafka

netstat -lntpu | grep java | grep 9002 | awk -F '[ /]+' '{print $7}' | xargs -r kill -9
netstat -lntpu | grep java | grep 9999

七、集群监控启用 JMX

在这里插入图片描述

### 关于 KafkaCMake 的关系 Kafka 是一种分布式流处理平台,用于构建实时数据管道和流应用。而 CMake 则是一种跨平台的自动化构建系统工具,主要用于管理和编译复杂的软件项目。通常情况下,CMake 并不直接与 Kafka 集成,而是通过支持 Kafka 客户端库(如 `librdkafka` 或其他语言绑定)来间接参与 Kafka 应用程序的开发。 #### 使用 CMake 构建 Kafka 客户端应用程序 当开发者希望使用 C++ 编写 Kafka 生产者或消费者时,可以借助 `librdkafka` 提供的功能[^1]。为了简化项目的依赖管理以及构建过程,可以选择 CMake 来定义和执行构建脚本。以下是基于 CMake 的 Kafka 客户端集成的关键点: - **引入外部库**:在 CMake 中可以通过 `find_package()` 函数查找并链接 `librdkafka` 库。 - **配置文件路径**:确保 CMake 能够找到 Kafka 库头文件及其动态/静态库的位置。 - **示例代码片段**: ```cmake cmake_minimum_required(VERSION 3.10) project(KafkaExample LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # 查找 librdkafka find_package(RdKafka REQUIRED) add_executable(kafka_producer main.cpp) target_link_libraries(kafka_producer RdKafka::RdKafka) ``` 此代码展示了如何利用 CMake 将 `librdkafka` 添加到一个简单的 Kafka 生产者项目中[^3]。 #### CMak(Cluster Manager for Apache Kafka) 需要注意的是,“CMak” 实际上是指 Cluster Manager for Apache Kafka (CMAK),这是一个用于管理和监控 Kafka 集群的图形化界面工具[^2]。尽管其名称可能让人联想到 CMake,但实际上两者并无关联。CMAK 主要功能包括但不限于集群状态查看、主题管理、消费者组偏移量调整等高级操作。 对于某些特定场景下遇到的问题,比如因 ZooKeeper 版本兼容性引发错误,则可通过手动初始化必要节点的方式解决[^4]: ```bash ./zkCli.sh -server zkhost:port create /kafka-manager/mutex "" create /kafka-manager/mutex/locks "" create /kafka-manager/mutex/leases "" ``` 综上所述,虽然 Kafka 不会直接涉及 CMake 工具本身,但在实际工程实践中,确实存在将二者结合起来优化工作流程的可能性;与此同时,所谓的“CMak”,更多时候指的是专门针对 Kafka 设计的操作面板——即 CMAK。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值