排障指南

最近更新时间:2020-06-12 21:39:54

新接入客户端时生产/消费错误

  • 检查 telnet 是否通(网络问题,是否 Kafka 和生产者在相同网络环境下)。
  • 访问的 vip - port 是否配置正确。
  • topic 白名单是否开启,如果开启需要配置正确的 IP 才能访问。

kafka console 客户端测试看不到数据

  • 消费者采用 latest 时候只会获取最后的数据,需要同时保持生产才可以看到相应数据。
  • 改为 earliest 方式消费数据。

生产一段时间后发现持续性错误

  • 查看是否流量流控,在监控页面上查询是否有波峰,升级实例大小解决。
  • 查看是否容量流控,在监控页面上查询实例的容量,升级实例大小或者修改数据保存时间。

流控相关说明

  • 流控是针对实例的,实例下所有 topic 都会受影响。
  • 容量满后可以消费,但是无法继续生产。
  • 流量 = 实际流量 × 副本数目
  • 堆积 = 实际堆积(副本堆积也算)

消费异常

  • 查看是否流量流控,在 barad 上查询是否有波峰,升级实例大小解决。
  • 查看消费分组是否超过数量。
  • 如果因为网络频繁 rebalance,建议调整客户端超时时间。
  • 是否拉取过期的 offset,消息过期会被删除,如果用过期 offset 拉取会失败。

数据堆积异常

开源 Kafka 支持消息中设置一个时间戳字段和时间戳类型,目前支持的时间戳类型有两种: CreateTime 和 LogAppendTime。

  • CreateTime 表示客户端本地的时间,由于客户端的时间可能和服务器时间存在偏差,请检查写入的时间是否是正确的时间。如果时间和当前北京时间相差较远,导致 CKafka 服务无法按照正常消息保存时间对数据进行及时过期删除,因此可能会存在消息异常堆积 。
  • LogAppendTime 表示消息生产到 CKafka 服务的时间,时间为 CKafka 服务器的时间,建议用户选用 LogAppendTime。

消费组列表详情缺失

问题描述

CKafka 的消费组列表有消费组名称,点击详情页后,却没有消费详情。例如下述的消费组 CR 没有展示详情:

排查思路

  1. 查看实例的消费组列表。
    ]$ bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --list
    CR
    可以看到当前的所有消费组名称,如果没有请检查消费者客户端是否正常。
  2. 查看实例特定的消费组详情。
    ]$ bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --describe --group CR
    Note: This will not show information about old Zookeeper-based consumers.
    会发现该消费组并没有详情。这表示消费者客户端没有使用 consumerGroup 机制去消费数据。即客户端没有往服务端提交消费详情,服务端没有存储消费数据,则不会正常显示。
  3. 定位是否是服务端的问题。
    通过原生自带的消费组命令,指定消费组名称 test1 进行消费,如下所示:
    ]$ bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --from-beginning --topic test --group test1
    在控制台能正常显示的消费组,通过--describe命令可以看到详情,如下所示:

原理解析

Kafka 的数据消费有两种模式,消费组模式和自定义分区消费模式。

  • 当使用消费组模式消费时,客户端会通过消费协调者进行协调消费,在消费数据完成后,会往服务端提交 offset 的存储请求,则此时服务端会存储消费的 topic、分区进度、客户端等信息。
  • 当使用自定义分区消费的模式时,客户端不会自动往服务端提交 offset 存储请求,此时如果客户端没有主动发起提交 offset 请求,则服务端是看不到消费的相关信息的。
目录