Kafka和SSL:java.lang.OutOfMemoryError:在KAFKA SSL集群上使用kafka-topics命令时的Java堆空间

cl25kdpy  于 2023-08-02  发布在  Apache
关注(0)|答案(4)|浏览(119)

这是我在Stackoverflow上的第一篇文章,希望我没有选错部分。
背景:
Kafka HEAP大小在以下文件中配置:

/etc/systemd/system/kafka.service

字符串
参数如下:

Environment="KAFKA_HEAP_OPTS=-Xms6g -Xmx6g"


操作系统为**“CentOS Linux release 7.7.1908”
Kafka是
“confluent-kafka-2.12-5.3.1-1.noarch”**,安装自以下仓库:

# Confluent REPO
[Confluent.dist]
name=Confluent repository (dist)
baseurl=http://packages.confluent.io/rpm/5.3/7
gpgcheck=1
gpgkey=http://packages.confluent.io/rpm/5.3/archive.key
enabled=1

[Confluent]
name=Confluent repository
baseurl=http://packages.confluent.io/rpm/5.3
gpgcheck=1
gpgkey=http://packages.confluent.io/rpm/5.3/archive.key
enabled=1


几天前我在一个3机Kafka集群上激活了SSL,突然,下面的命令停止工作:

kafka-topics --bootstrap-server <the.fqdn.of.server>:9093 --describe --topic <TOPIC-NAME>


返回以下错误:

[2019-10-03 11:38:52,790] ERROR Uncaught exception in thread 'kafka-admin-client-thread | adminclient-1':(org.apache.kafka.common.utils.KafkaThread) 
java.lang.OutOfMemoryError: Java heap space
    at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
    at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)
    at org.apache.kafka.common.memory.MemoryPool$1.tryAllocate(MemoryPool.java:30)
    at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:112)
    at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:424)
    at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:385)
    at org.apache.kafka.common.network.Selector.attemptRead(Selector.java:651)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:572)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:483)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:539)
    at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.run(KafkaAdminClient.java:1152)
    at java.lang.Thread.run(Thread.java:748)


在服务器的日志中,当我试图通过“kafka-topics”请求它时,会出现以下行:

/var/log/kafka/server.log :
[2019-10-03 11:41:11,913] INFO [SocketServer brokerId=<ID>] Failed authentication with /<ip.of.the.server> (SSL handshake failed) (org.apache.kafka.common.network.Selector)


在群集上实现SSL之前,我能够正确使用此命令。这是我正在使用的配置。所有功能正常工作(消费者,生产者...),除了“kafka-topics”:

# SSL Configuration
ssl.truststore.location=<truststore-path>
ssl.truststore.password=<truststore-password>
ssl.keystore.type=<keystore-type>
ssl.keystore.location=<keystore-path>
ssl.keystore.password=<keystore-password>

# Enable SSL between brokers
security.inter.broker.protocol=SSL

# Listeners
listeners=SSL://<fqdn.of.the.server>:9093
advertised.listeners=SSL://<fqdn.of.the.server>:9093


证书(由内部CA签名,内部CA是我添加到配置中指定的信任存储库中的)没有问题。OpenSSL显示没有错误:

openssl s_client -connect <fqdn.of.the.server>:9093 -tls1
>> Verify return code: 0 (ok)


下面的命令在SSL上运行得很好,这要归功于参数“-consumer.config client-ssl.properties”

kafka-console-consumer --bootstrap-server <fqdn.of.the.server>:9093 --topic <TOPIC-NAME> -consumer.config client-ssl.properties


“client-ssl.properties”内容为:

security.protocol=SSL
ssl.truststore.location=<truststore-path>
ssl.truststore.password=<truststore-password>


现在,我被迫使用“--zookeeper”,根据文档,它已被弃用:

--zookeeper <String: hosts>              DEPRECATED, The connection string for  
                                       the zookeeper connection in the form 
                                       host:port. Multiple hosts can be     
                                       given to allow fail-over.


当然,它运行得很好:

kafka-topics --zookeeper <fqdn.of.the.server>:2181 --describe --topic <TOPIC-NAME>
Topic:<TOPIC-NAME>  PartitionCount:3    ReplicationFactor:2 
Configs:
Topic: <TOPIC-NAME> Partition: 0    Leader: <ID-3>      Replicas: <ID-3>,<ID-1> Tsr: <ID-1>,<ID-3>
Topic: <TOPIC-NAME> Partition: 1    Leader: <ID-1>      Replicas: <ID-1>,<ID-2> Isr: <ID-2>,<ID-1>
Topic: <TOPIC-NAME> Partition: 2    Leader: <ID-2>      Replicas: <ID-2>,<ID-3> Isr: <ID-2>,<ID-3>


所以我的问题是为什么我不能使用“--bootstrap-server”自动柜员机?由于“zookeeper”的弃用,我担心不能咨询我的主题,和他们的细节。。
我相信kafka-topics需要与kafka-console-consumer相同的选项,也就是“-consumer.config”...
询问是否需要额外的精度。
非常感谢,希望我的问题清晰易懂。
布莱因

gorkyyrv

gorkyyrv1#

我终于找到了解决这个SSL错误的方法。关键是使用以下设置:

--command-config client-ssl.properties

字符串
这是使用Kafka命令的大部分,如 kafka-consumer-groups,当然还有 kafka-topics。参见以下示例:

kafka-consumer-groups --bootstrap-server <kafka-hostname>:<kafka-port> --group <consumer-group> --topic <topic> --reset-offsets --to-offset <offset> --execute --command-config <ssl-config>

kafka-topics --list --bootstrap-server <kafka-hostname>:<kafka-port> --command-config client-ssl.properties

  • ssl-config* was“client-ssl.properties“,see initial post for content.请注意,通过使用IP地址,如果机器证书没有该IP地址的替代名称,则会出现错误。尝试使用正确的DNS解析,并尽可能使用FQDN。

希望这个解决方案会有帮助,干杯!
布莱因

8ftvxx2r

8ftvxx2r2#

停止您的经纪人并运行以下(假设您的服务器上有超过1.5GB的RAM)

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

字符串
然后在所有3个节点上启动您的经纪人,然后尝试它。

r1wp621o

r1wp621o3#

请注意,对于消费者和生产者客户端,您需要在client-ssl.properties中相应地添加security.protocol前缀。
对于Kafka消费者:

consumer.security.protocol=SASL_SSL

字符串
对于Kafka制作人:

producer.security.protocol=SASL_SSL

1zmg4dgp

1zmg4dgp4#

OOM java堆空间异常可能是由于多种原因。在我的情况下(AWS MSK Kafka - IAM auth protected),这是由于权限访问限制。在client.properties运行www.example.com脚本时,我不得kafka-topics.sh。见这里youtube.com/watch?v=r12HYxWAJLo&t=477s

相关问题