首页 / 平台管理 / 应用商店管理 / Operators / 使用 Operator / Kafka / 常见问题

常见问题

使用 Kafka 过程中遇到的常见问题及对应的解决办法。

更多 Kafka 常见问题请 前往 Strimzi 官网 查看,或 [下载官方文档至本地](/zh/img/ds/Kafka faq.doc) (右键单击该链接,选择 链接存储为…)。

遇到 “NoBrokersAvailable” 报错,如何处理?

问题描述

报错信息如下图所示。

解决办法

客户端版本错误,导致无法连接到 Kafka 集群。推荐用 Kafka 集群自带的客户端(Kafka 运行目录下的 bin 目录下的执行脚本)。

KafkaUser 资源的 Status 为空,如何处理?

问题描述

KafkaUser 资源的 Status 为空。

解决办法

请按照以下两个思路去排查和解决问题:

如何判断设置是否已经生效?

Kafka 部署中包含了较多的组件,任何一个针对实例的改动都可能会需要十几秒到几分钟的生效时间。您可以查看 Kafka.Status.conditions[0].lastTransitionTime 字段的值是否等于您最后一次修改配置的时间,来判断设置是否已经生效。Kafka 会在配置全部生效之后,更新这个时间为最后一次修改配置的时间。

TLS 连接中 SSL 握手失败,如何处理?

问题描述

在调用 producer 或者 consumer 的命令行过程中,偶尔会因为证书内置域名问题导致 SSL 握手失败,提示信息如下:

[root@mw-m1 kafka_verify]# ./bin/kafka-console-producer.sh --topic t1 --producer.config producer.config --broker-list my-cluster-kafka-external-bootstrap:9094
>[2020-09-24 11:28:52,634] ERROR [Producer clientId=console-producer] Connection to node -1 (my-cluster-kafka-external-bootstrap/10.109.110.231:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)
[2020-09-24 11:28:52,634] WARN [Producer clientId=console-producer] Bootstrap broker my-cluster-kafka-external-bootstrap:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

解决办法

需要通过 SSL debug 日志来辅助定位问题,可以在 cli 脚本中加入-Djavax.net.debug=ssl 来启用 ssl debug 日志。示例如下:

缺少 Clusterrole 导致 Kafka 集群创建失败,如何处理?

问题描述

由于缺少 Clusterrole,导致 Kafka 集群创建失败。

解决办法

在部署集群之后创建资源之前,需要手工创建两个 clusterrole(strimzi-entity-operator 和 strimzi-kafka-broker),用于被 Operator 绑定。

KafkaConnect 和 KafkaMirrorMaker/KafkaMirrorMaker2 因为连接不上 Kafka 导致启动失败,如何处理?

问题描述

通过检查发现因为无法链接 Kafka 集群,导致 KafkaConnect 和 KafkaMirrorMaker 启动失败,错误日志如下:

2020-09-27 03:02:31,641 ERROR Stopping due to error (org.apache.kafka.connect.cli.ConnectDistributed) [main]
org.apache.kafka.connect.errors.ConnectException: Failed to connect to and describe Kafka cluster. Check worker's broker connection and security properties.
at org.apache.kafka.connect.util.ConnectUtils.lookupKafkaClusterId(ConnectUtils.java:64)
at org.apache.kafka.connect.util.ConnectUtils.lookupKafkaClusterId(ConnectUtils.java:45)
at org.apache.kafka.connect.cli.ConnectDistributed.startConnect(ConnectDistributed.java:95)
at org.apache.kafka.connect.cli.ConnectDistributed.main(ConnectDistributed.java:78)
Caused by: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Call(callName=listNodes, deadlineMs=1601175751636) timed out at 1601175751637 after 1 attempt(s)
at org.apache.kafka.common.internals.KafkaFutureImpl.wrapAndThrow(KafkaFutureImpl.java:45)
at org.apache.kafka.common.internals.KafkaFutureImpl.access$000(KafkaFutureImpl.java:32)
at org.apache.kafka.common.internals.KafkaFutureImpl$SingleWaiter.await(KafkaFutureImpl.java:89)
at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:260)
at org.apache.kafka.connect.util.ConnectUtils.lookupKafkaClusterId(ConnectUtils.java:58)
... 3 more

解决办法

这个错误可能是因为网络策略不允许通信导致,可以在当前的命名空间下创建对应的网络策略来允许通信。

如下示例中的网络策略允许访问同一命名空间内的网络,参照示例在 Kafka 集群所在的命名空间中创建网络策略即可解决以上无法连通的问题。

提示:网络策略创建方式有很多种,用户可以根据使用场景来创建适合的网络策略。

命名空间允许网络策略示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-other-namespaces
spec:
  ingress:
    - from:
        - podSelector: {}
  podSelector: {}
  policyTypes:
    - Ingress

Kafka User Operator/Topic Operator 反复重启,如何处理?

问题描述

Kafka User Operator/Topic Operator 反复重启。

解决办法

Kafka 对资源需求比较高,如果所在命名空间的 CPU request/limit 小于 1000mi,经常会导致部分组件因为启动超时而被反复重启。建议设置 Kafka 所在命名空间的 CPU request/limit 大于等于 1000mi。

如何设置 jvm 垃圾回收的必要参数?

参数设置示例如下:

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec

创建 KafkaRebalance 后提示 InvalidResourceException,如何处理?

KafkaRebalance 简介

KafkaRebalance 的主要功能如下:

KafkaRebalance 要完成以上功能,需要从集群收集 Kafka 的度量指标和每个分区的资源度量指标,通过这些指标和相关的目标规定生成集群工作负载模型,所谓的集群工作负载模型就是集群处于平衡状态时的分区情况。

Cruise Control 就是负责从集群收集 Kafka 的度量指标和每个分区的资源度量指标,通过这些指标和相关的目标规定生成集群工作负载模型。

KafkaRebalance 根据生成的模型执行相关的操作使集群达到平衡状态。

部署 kafka 集群时会根据相关配置生成相应的度量指标和相关端口,Cruise Control 通过这个端口获取生成的度量指标。

创建 Topic 时会根据 Topic 所在的 kafka 集群配置也生成相关度量指标和端口,Cruise Control 也通过这个端口获取生成的度量指标。

所以,要想使用 KafkaRebalance 的功能,需要在 kafka 集群部署时配置 cruiseControl 属性,说明与 cruiseControl 相关的一些配置,这个时候部署的 kafka 的集群就会生成相关的度量指标和相应的 service,用于获取度量指标。

在此基础上创建的 Topic 也会生成相关的度量指标和相应的 service。

问题描述

根据以上描述导致 InvalidResourceException 异常的原因是在部署 kafka 集群时没有设置 cruiseControl 相关属性,也就是 kafka 集群无法生成相关的度量指标和相应的 service,cruiseControl 不能生成模型,KafkaRebalance 获取不到模型导致无法正常工作。

解决办法

先更新 Kafka 集群的 cruiseControl 属性,然后删除已创建的 Topic 的相关资源,重新创建 Topic 实例。