KAFKA and SSL : java.lang.OutOfMemoryError: Java heap space when using kafka-topics command on KAFKA SSL cluster
KAFKA and SSL : java.lang.OutOfMemoryError: Java heap space when using kafka-topics command on KAFKA SSL cluster
这是我在 Whosebug 上的第一个 post,希望我没有选错部分。
上下文:
Kafka HEAP 大小在以下文件中配置:
/etc/systemd/system/kafka.service
使用以下参数:
Environment="KAFKA_HEAP_OPTS=-Xms6g -Xmx6g"
OS 是 "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
几天前我在一个三机KAFKA集群上激活了SSL,突然,下面的命令停止工作了:
kafka-topics --bootstrap-server <the.fqdn.of.server>:9093 --describe --topic <TOPIC-NAME>
哪个return我报了以下错误:
[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.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)
由于参数“-consumer.config client-ssl.properties”
,以下命令在 SSL 上运行良好
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”atm?由于 "zookeeper" 弃用,我担心无法查阅我的主题及其详细信息...
我相信 kafka-topics 需要与 kafka-console-consumer 相同的选项,又名“-consumer.config”...
询问是否需要额外的精度。
非常感谢,希望我的问题清晰易读。
布莱恩
停止您的经纪人并 运行 下面(假设您的服务器上有超过 1.5GB 的内存)
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
然后在所有 3 个节点上启动您的 Brokers,然后尝试一下。
我终于找到了处理这个 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 原为 "client-ssl.properties",内容见开头 post。
请注意,通过在 上使用 IP 地址,如果机器证书没有具有该 IP 地址的替代名称,您将遇到错误。尽可能使用正确的 DNS 解析并使用 FQDN。
希望这个解决方案能有所帮助,干杯!
布莱恩
请注意,对于消费者和生产者客户端,您需要在 client-ssl.properties
中相应地添加前缀 security.protocol
。
对于 Kafka 消费者:
consumer.security.protocol=SASL_SSL
对于 Kafka 生产者:
producer.security.protocol=SASL_SSL
这是我在 Whosebug 上的第一个 post,希望我没有选错部分。
上下文:
Kafka HEAP 大小在以下文件中配置:
/etc/systemd/system/kafka.service
使用以下参数:
Environment="KAFKA_HEAP_OPTS=-Xms6g -Xmx6g"
OS 是 "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
几天前我在一个三机KAFKA集群上激活了SSL,突然,下面的命令停止工作了:
kafka-topics --bootstrap-server <the.fqdn.of.server>:9093 --describe --topic <TOPIC-NAME>
哪个return我报了以下错误:
[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.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)
由于参数“-consumer.config client-ssl.properties”
,以下命令在 SSL 上运行良好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”atm?由于 "zookeeper" 弃用,我担心无法查阅我的主题及其详细信息...
我相信 kafka-topics 需要与 kafka-console-consumer 相同的选项,又名“-consumer.config”...
询问是否需要额外的精度。
非常感谢,希望我的问题清晰易读。
布莱恩
停止您的经纪人并 运行 下面(假设您的服务器上有超过 1.5GB 的内存)
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
然后在所有 3 个节点上启动您的 Brokers,然后尝试一下。
我终于找到了处理这个 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 原为 "client-ssl.properties",内容见开头 post。 请注意,通过在 上使用 IP 地址,如果机器证书没有具有该 IP 地址的替代名称,您将遇到错误。尽可能使用正确的 DNS 解析并使用 FQDN。
希望这个解决方案能有所帮助,干杯!
布莱恩
请注意,对于消费者和生产者客户端,您需要在 client-ssl.properties
中相应地添加前缀 security.protocol
。
对于 Kafka 消费者:
consumer.security.protocol=SASL_SSL
对于 Kafka 生产者:
producer.security.protocol=SASL_SSL