kafka启用SASL/PLAIN+ACL后,kafka-consumer-group.sh查看消费组报错

在Kafka启用了SASL/PLAIN和ACL后,使用kafka-consumer-group.sh查看消费组时遇到错误。问题主要出现在旧版本命令不再支持连接到Kafka Broker,而需要使用新版本命令。解决方案包括更新jaas配置文件,并确保使用ACL管理用户进行查询以获取正确数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kafka启用SASL/PLAIN+ACL后,kafka-consumer-group.sh查看消费组报错

问题

kafka启用用户认证和权限管理(SASL/PLAIN+ACL)之后,kafka-consumer-group.sh 查看消费组会报错

-bash-4.2$cd $KAFKA_HOME
-bash-4.2$bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server  192.168.15.11:9092,192.168.15.12:9092,192.168.15.13:9092 --list

Note: This will only show information about consumers that use the Java consumer API (non-ZooKeeper-based consumers).

[2020-04-02 12:37:43,272] WARN Bootstrap broker 192.168.15.11:9092 disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-02 12:37:43,275] WARN Bootstrap broker 192.168.15.12:9092 disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-02 12:37:43,276] WARN Bootstrap broker 192.168.15.13:9092 disconnected (org.apache.kafka.clients.NetworkClient)
Error: Executing consumer group command failed due to Request METADATA failed on brokers List(192.168.15.12:9092 (id: -2 rack: null), 192.168.15.13:9092 (id: -3 rack: null), 192.168.15.11:9092 (id: -1 rack: null))

命令

kafka-consumer-group.sh 命令
新版本

cd $KAFKA_HOME
bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server 192.168.15.11:9092,192.168.15.12:9092,192.168.15.13:9092 --list

旧版本

cd $KAFKA_HOME
bin/kafka-consumer-groups.sh --zookeeper 192.168.15.11:2181,192.168.15.12:2181,192.168.15.13:2181 --list

kafka启用用户认证和权限管理(SASL/PLAIN+ACL)之后,只能使用新版本,已经不支持ZK去连接kafka broker,下面以kafka 0.10.2.0版本测试,kafka新版本也适用。

改动

改动如下

cd $KAFKA/bin
cp kafka-consumer-group.sh kafka-consumer-group_jaas.sh
vi kafka-consumer-group_jaas.sh

#!/bin/bash

# 方式1:Add jaas file
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/app/software/kafka/config/kafka_client_jaas.conf"
exec $(dirname $0)/kafka-run-class.sh kafka.admin.ConsumerGroupCommand "$@"

# 方式2:Add jaas file
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=/home/app/software/kafka/config/kafka_client_jaas.conf kafka.admin.ConsumerGroupCommand "$@"

cd $KAFKA_HOME/config
vi kafka_client_jaas.conf

KafkaClient{
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="admin"
        password="admin123!@";
};

vi command_jaas.properties 

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

测试

-bash-4.2$cd $KAFKA_HOME
-bash-4.2$ bin/kafka-consumer-groups_jaas.sh --new-consumer --command-config config/command_jaas.properties  --bootstrap-server  192.168.15.11:9092,192.168.15.12:9092,192.168.15.13:9092 --list

Note: This will only show information about consumers that use the Java consumer API (non-ZooKeeper-based consumers).

test_01
test_02
test_03
test_04
test_05

测试过程中发现kafka_client_jaas.conf文件中配置ACL普通用户查询时不报错,但是没有数据。只能用ACL管理用户admin

<think>好的,用户想了解如何在C++中使用Kafka的示例教程。首先,我需要整理相关的信息,确保回答结构清晰,符合用户的要求。 首先,用户提到了引用的内容,特别是引用[2]提到KafKa C++实战,所以需要参考这个内容。可能用户已经下载了Kafka,但需要具体的C++代码示例。 接下来,我需要确定用户可能的需求层次。用户可能刚接触Kafka,需要从安装开始,但根据引用[1],用户可能已经安装了Kafka,所以重点可能在配置和C++客户端的使用上。但为了全面,可能还是需要简要提及安装步骤,或者确认用户已经完成安装。 然后,C++使用Kafka通常需要客户端库,常用的有librdkafka。需要指导用户如何安装这个库,比如在Ubuntu下使用apt-get,或者从源码编译。这部分需要明确步骤,避免混淆。 接下来是配置Zookeeper和Kafka,引用[1]和引用[3]提到了Zookeeper配置和删除topic的命令,这可能需要在示例中涉及,比如创建topic,确保用户知道如何管理topic。 然后,代码示例是关键。需要分为生产者和消费者两部分。生产者部分要展示如何发送消息,消费者部分如何接收。代码需要简洁,并且注释清楚,使用中文解释每一步。同时,编译命令也很重要,用户可能需要知道如何链接库。 还要注意用户提到的LaTeX格式,确保行内数学公式正确,但在这个问题中可能用不到数学公式,所以可能不需要处理这部分。不过系统级指令要遵守,比如代码块使用正确的格式。 另外,用户要求生成相关问题,需要根据内容提出相关的问题,比如性能调优、错误处理、与其他语言对比等,这些能帮助用户进一步学习。 需要验证引用是否正确,比如引用[2]提到log.retention参数和ACL权限,可能在配置Kafka时相关,但在C++示例中可能涉及不多,不过可以提到生产环境中配置这些参数的重要性,尤其是在代码中如何设置。 最后,确保回答符合用户可见层的结构,步骤分明,代码正确,解释清晰,并且自然融入引用标记。同时检查是否有遗漏,比如是否需要提到CMake配置,或者依赖管理,但可能用户需要的是快速上手示例,所以保持简洁。</think>以下是在C++中使用Kafka的完整示例教程,包含关键步骤和代码实现: ### 一、环境准备 1. 安装Kafka(已完成,见引用[1]) ```bash wget https://archive.apache.org/dist/kafka/2.0.0/kafka_2.11-2.0.0.tgz tar -zxvf kafka_2.11-2.0.0.tgz ``` 2. 安装C++客户端库 ```bash sudo apt-get install librdkafka-dev # Ubuntu/Debian # 或从源码编译:https://github.com/edenhill/librdkafka ``` ### 二、创建测试Topic(引用[3]) ```bash bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic cpp_test ``` ### 三、C++生产者示例 ```cpp #include <librdkafka/rdkafkacpp.h> #include <iostream> void send_message(const std::string& brokers, const std::string& topic) { RdKafka::Conf* conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); std::string errstr; // 配置参数(引用[2]日志保留策略可在此设置) conf->set("bootstrap.servers", brokers, errstr); conf->set("message.timeout.ms", "5000", errstr); RdKafka::Producer* producer = RdKafka::Producer::create(conf, errstr); delete conf; for (int i = 0; i < 5; ++i) { std::string payload = "Message " + std::to_string(i); RdKafka::ErrorCode err = producer->produce( topic, RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, const_cast<char*>(payload.c_str()), payload.size(), nullptr, 0, 0, nullptr ); if (err != RdKafka::ERR_NO_ERROR) std::cerr << "Produce failed: " << RdKafka::err2str(err) << std::endl; else std::cout << "Sent: " << payload << std::endl; producer->poll(0); } while (producer->outq_len() > 0) { std::cout << "Waiting for " << producer->outq_len() << std::endl; producer->poll(1000); } delete producer; } int main() { send_message("localhost:9092", "cpp_test"); return 0; } ``` 编译命令:`g++ -o producer producer.cpp -lrdkafka++ -lrdkafka` ### 四、C++消费者示例 ```cpp #include <librdkafka/rdkafkacpp.h> #include <iostream> class ExampleConsumeCb : public RdKafka::ConsumeCb { public: void consume_cb(RdKafka::Message& msg, void* opaque) override { if (msg.err() == RdKafka::ERR_NO_ERROR) std::cout << "Received: " << (char*)msg.payload() << std::endl; } }; void consume_messages(const std::string& brokers, const std::string& topic) { RdKafka::Conf* conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); std::string errstr; conf->set("bootstrap.servers", brokers, errstr); conf->set("group.id", "cpp_consumer_group", errstr); conf->set("auto.offset.reset", "earliest", errstr); ExampleConsumeCb ex_consume_cb; RdKafka::KafkaConsumer* consumer = RdKafka::KafkaConsumer::create(conf, errstr); delete conf; RdKafka::TopicPartition* tp = RdKafka::TopicPartition::create(topic, 0); std::vector<RdKafka::TopicPartition*> tps = {tp}; consumer->assign(tps); while (true) { RdKafka::Message* msg = consumer->consume(1000); ex_consume_cb.consume_cb(*msg, NULL); delete msg; } delete consumer; } int main() { consume_messages("localhost:9092", "cpp_test"); return 0; } ``` 编译命令:`g++ -o consumer consumer.cpp -lrdkafka++ -lrdkafka` ### 五、关键配置说明(引用[2]) 1. 消息保留策略:可在`server.properties`配置 ```properties log.retention.hours=168 ``` 2. 生产环境建议启用ACL: ```cpp conf->set("security.protocol", "SASL_PLAINTEXT", errstr); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值