全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
消息队列 MQ

Kafka 常见问题及排查

更新时间:2017-09-29 10:34:12   分享:   

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)的权限。

Topic 和 Consumer ID 的权限规则如下:

  • Topic 必须由主账号创建;使用时,Topic 可以由主账号自己使用,也可以由主账号授权给子账号使用。
  • Consumer ID 的使用权只属于创建者;主账号创建的 Consumer ID 不能给子账号使用,反之亦然。

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

4. Java 客户端(包括 Spring 框架)报错“Failed to send SSL close message”

该错误后面通常还会跟“connection reset by peer”或“broken pipe”。该错误主要是因为,服务端是VIP网络环境,会主动掐掉空闲连接。建议在遇到此类错误时,重试发送一次。Java客户端内部有重试机制,可以参考 Producer 最佳实践 进行配置。其它语言客户端,请参考相关文档。你可以通过修改日志级别来避免该错误,以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. ONS控制台左侧点击发布订阅管理-订阅管理
  2. 在搜索框中输入topic 或者 Cosumer ID,点击搜索,查找你想查看消费进度的 Consumer ID。
  3. 找到该 Consumer ID后,点击操作列中的消费者状态,在跳出的页面中可查看堆积总量

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

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

9. 消息堆积了怎么办

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

注意: Java 进程可以用 jstack。

本文导读目录
本文导读目录
以上内容是否对您有帮助?