KAFKA и SSL: java.lang.OutOfMemoryError: пространство кучи Java при использовании команды kafka-themes в кластере KAFKASSL

Это мой первый пост в Stackru, надеюсь, я не выбрал неправильный раздел.

Контекст:

Размер Kafka HEAP настраивается в следующем файле:

/etc/systemd/system/kafka.service

Со следующим параметром:

Environment="KAFKA_HEAP_OPTS=-Xms6g -Xmx6g"

ОС - "CentOS Linux, выпуск 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

Несколько дней назад я активировал SSL на кластере KAFKA с тремя машинами, и внезапно перестала работать следующая команда:

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-themes":

/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 в кластере. Вот конфигурация, которую я использую. Все функции работают исправно (потребители, производители...) кроме "кафка-топиков":

# 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

Нет проблем с сертификатом (который подписан внутренним ЦС, внутренним ЦС, который я добавил в хранилище доверенных сертификатов, указанное в конфигурации). 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-themes нужен тот же параметр, что и для kafka-console-consumer, он же "-consumer.config"...

Спросите, нужна ли дополнительная точность.

Большое спасибо, надеюсь, мой вопрос ясен и читаем.

Блыын

4 ответа

Решение

Я наконец нашел способ справиться с этой ошибкой SSL. Ключ в том, чтобы использовать следующие настройки:

--command-config client-ssl.properties

Это работает с большей частью команд KAFKA, таких как kafka-consumer-groups и, конечно же, kafka-themes. См. Примеры ниже:

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", см. содержание в исходной публикации. Остерегайтесь, используя IP-адрес, вы получите ошибку, если сертификат машины не имеет альтернативного имени с этим IP-адресом. Постарайтесь иметь правильное разрешение DNS и, если возможно, используйте полное доменное имя.

Надеюсь, это решение поможет, ура!

Блыын

Остановите своих брокеров и запустите ниже (при условии, что на вашем сервере больше 1,5 ГБ ОЗУ)

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

затем запустите своих брокеров на всех трех узлах и попробуйте.

Исключение OOM Java-кучи может быть вызвано несколькими причинами. В моем случае (AWS MSK kafka — защищенная аутентификация IAM) это произошло из-за ограничения доступа. Мне пришлось упомянуть файл client.properties при запуске скрипта kafka-topics.sh.--command-config /path/to/client.properties. см. здесь youtube.com/watch?v=r12HYxWAJLo&t=477s

Обратите внимание, что для клиентов-потребителей и производителей вам необходимо указать префикс security.protocol соответственно внутри вашего client-ssl.properties.


Для потребителей Kafka:

consumer.security.protocol=SASL_SSL

Для производителей Kafka:

producer.security.protocol=SASL_SSL
Другие вопросы по тегам