全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
消息队列 MQ

Kafka 常见问题及排查

更新时间:2017-12-15 20:40:00

1. 报错“TimeoutException(Java)” 或“run out of brokers(Go)” 或 “Authentication failed for user(Python)”

首先,请确保 servers 配置正确,然后通过 ping 以及 telnet 排除网络问题。假设网络运行正常,云上 Kafka 在建立连接时,会对客户端进行鉴权。鉴权方式(sasl_mechanism)有两种:

  • ONS: 仅限 Java 语言使用;需要配置自己的 AccessKey,SecretKey。
  • PLAIN: 所有语言可用;需要配置 AccessKey,SecretKey 的后 10 位。

如果鉴权失败,云上 Kafka 会掐掉连接。

另外,请仔细参考各个 demo 的 readme 以配置正确。

2. 报错“leader is not available”或“leader is in election”

首先,检查 Topic 是否有创建;其次,检查 Topic 类型是否为“Kafka 消息”。

3. 报错“TOPIC_AUTHORIZATION_FAILED”或“Topic or group not authorized” 的类似字眼

此类报错通常代表权限不对,即您的 AccessKey 没有访问对应 Topic 或者 Consumer ID(又称 group 或 consumer group)的权限。

权限问题通常与授权策略相关,主子账号建议使用RAM 授权策略。 需要注意的是,受 Kafka 协议所限,Kafka 的 Topic 与 CID 需要 PUB 和 SUB 两种授权才能正常访问,一般可以考虑直接授予 MQFullAccess 权限。更多信息,请参考消息队列资源授权

注意:请仔细检查 AccessKey、SecretKey 来自哪个账号,避免用错。

4. 报错“Failed to send SSL close message”或者“connection reset by peer“

首先请确认发送以及接收消息是否正常。此外,服务端是 VIP 网络环境,会主动掐掉空闲连接,也会造成这类报错。建议在遇到此类错误时,重试发送一次。很多客户端(比如 Java)内部有重试机制,详情可以参考 Producer 最佳实践 进行配置。

Java 客户端可以通过修改日志级别来避免该错误,以 log4j 为例,可以加上下面这行配置: log4j.logger.org.apache.kafka.common.network.SslTransportLayer=ERROR

5. Spring Cloud Stream 消费信息时报错“arrayindexoutofboundexception”

该错误的产生是因为 Spring Cloud 会按自己的格式解析消息内容。如果您同时使用 Spring Cloud 发送和消费,则不会有问题,这也是推荐的使用方式。

如果您使用其他方式发送,例如,调用 Kafka 原生的 Java 客户端发送,那么用 Spring Cloud 消费时,则需要设置 headerMode 为 raw,即禁用解析消息内容。 具体信息参见 Spring Cloud 官网

6. 报错“No worthy mechs found”

C++客户端或者包装 C++的客户端会报这个错。这个错说明缺少一个系统库:cyrus-sasl-plain。针对 yum 管理的系统的安装方法为:yum install cyrus-sasl{,-plain}

7. 什么是 CID, Consumer ID, Consumer Group 和 Group ID

这几个名称指代的都是同一个概念:Kafka 的消费组 (Consumer Group)。CID 是 Consumer ID 的缩写,也等同于 Group ID (Consumer Group ID 的简称,指代一个特定的消费组)。每个消费组可以包含多个消费实例,一起负载均衡消费订阅的 topic,所以 CID 与 topic 的关系可以总结为:每个 CID 可以订阅多个 topic,每个 topic 也可以被多个 CID 订阅;各个 CID 之间相对独立,互不影响。

假设 CID 1 订阅了 Topic 1,则 Topic 1 的每条消息会发给 CID 1 的某个实例,且只会发给其中一个实例。如果 CID 2 也订阅了 Topic 1,Topic 1 的每条消息也会发给 CID 2 里的某个实例,且只发给其中一个实例。

注意:控制台里看到的 Producer ID 是 Aliware MQ 里的概念,Kafka 不会用到, 后续会改进优化。

8. 如何查看消费进度

如需查看某个特定订阅消费者的消费进度,请按照如下步骤操作:

  1. MQ 控制台左侧点击发布订阅管理-订阅管理
  2. 在搜索框中输入 topic 或者 Cosumer ID,点击搜索,查找你想查看消费进度的 Consumer ID。
  3. 找到该 Consumer ID 后,点击操作列中的消费者状态,在跳出的页面中可查看堆积总量

堆积总量 = 所有的消息数 - 已经消费的消息数

注意:目前消费者状态都会显示不在线,未来会进行优化。除了堆积总量,其它信息仅供参考。

9. 消息堆积了怎么办

消息堆积,一般都是消费速度过慢或者消费线程阻塞造成的。建议打印出消费线程的堆栈情况查看线程执行情况。

注意: Java 进程可以用 jstack。

10. Java 客户端“No KafkaClient Entry”

首先准备好 kafka_client_jaas.conf,放在任意目录下,这里假设为/home/admin。

Java 的安全登录设置是系统性的;有两种办法:

一是设置系统变量,通过-Djava.security.auth.login.config=/home/admin/kafka_client_jaas.conf 或者代码中System.setProperty("java.security.auth.login.config","/home/admin/kafka_client_jaas.conf"); 注意,如果是代码中设置,一定要保证代码在启动 Kafka 客户端之前执行;

二是配置系统文件${JAVA_HOME}/jre/lib/java.security;增加一行login.config.url.1=file:/home/admin/kafka_client_jaas.conf;

更多资料可以参考官网说明

本文导读目录