Kafka常见问题之Kafka 报错:org.apache.kafka.common.errors.TimeoutException: Topic topic not present in metadata after 60000 ms
文章目录
Topic not present in metadata
错误通常由主题不存在、网络问题或配置不当引起。通过检查主题状态、优化客户端配置以及确保网络连通性,可以有效解决该问题。建议提前创建主题,并优化客户端和 Broker 配置,以减少此类错误的发生概率。
错误描述
该错误表明 Kafka 客户端(生产者或消费者)在尝试与 Kafka Broker 通信时,未能在指定时间内(默认 60 秒)获取到指定主题的元数据。元数据包含主题的分区、Leader 等信息。如果主题元数据不可用或不存在,该请求会超时并报出 TimeoutException
。
1. 排查方向
1.1 主题不存在
- 客户端请求的主题尚未在 Kafka 集群中创建。
- 生产者尝试向未创建的主题发送消息时会遇到该错误。
1.2 主题创建延迟
- Kafka Broker 被配置为不自动创建主题,但客户端仍尝试使用未创建的主题。
1.3 Broker 配置错误
- Kafka Broker 的某些配置(如
auto.create.topics.enable
或元数据同步)可能导致主题信息未正确加载。
1.4 网络问题
- 客户端无法与 Kafka Broker 建立通信,导致无法获取元数据。
- DNS 配置错误或网络分区导致客户端无法访问 Kafka Broker。
1.5 集群负载过高
- 如果 Kafka 集群负载过高,可能导致 Broker 响应时间过长,无法及时提供元数据。
1.6 客户端配置不当
- 客户端配置的
metadata.fetch.timeout.ms
或bootstrap.servers
参数有误。
2. 具体错误场景与解决方法
场景 1:主题未创建
现象:
生产者尝试向 Kafka 主题发送消息,报错:
org.apache.kafka.common.errors.TimeoutException: Topic my_topic not present in metadata after 60000 ms
原因:
- 主题
my_topic
尚未在 Kafka 集群中创建。 - Kafka 的
auto.create.topics.enable
配置为false
,无法自动创建主题。
解决方法:
-
确认 Kafka 是否允许自动创建主题:
bin/kafka-configs.sh --bootstrap-server <broker_host>:9092 --describe --entity-type brokers
如果
auto.create.topics.enable=false
,需要手动创建主题。 -
手动创建主题:
bin/kafka-topics.sh --bootstrap-server <broker_host>:9092 --create --topic my_topic --partitions 3 --replication-factor 2
场景 2:主题元数据未同步
现象:
即使主题已创建,客户端仍然报错。
原因:
- Kafka Broker 未正确同步主题的元数据。
- 客户端在 Broker 元数据未完全加载时请求该主题的信息。
解决方法:
-
检查主题是否存在:
bin/kafka-topics.sh --bootstrap-server <broker_host>:9092 --list
如果主题存在但报错,请刷新客户端的元数据。
-
修改客户端配置,增加元数据刷新频率:
metadata.max.age.ms=30000 # 每 30 秒刷新一次元数据
-
检查 Kafka Broker 的运行状态,确保所有 Broker 正常运行。
场景 3:网络问题
现象:
客户端无法连接到 Kafka Broker,导致无法获取主题元数据。
原因:
bootstrap.servers
配置的 Broker 地址不可达。- 客户端与 Kafka Broker 的网络连接中断。
解决方法:
- 确认客户端配置的 Kafka Broker 地址是否正确:
bootstrap.servers=broker1:9092,broker2:9092
- 确保客户端可以通过网络访问 Kafka Broker:
ping broker1 telnet broker1 9092
- 如果 Kafka 部署在 Kubernetes 或 Docker 中,确保 Kafka 的
advertised.listeners
配置正确。
场景 4:Kafka 集群负载过高
现象:
Kafka 集群负载较高,导致主题元数据的响应时间过长。
原因:
- Kafka Broker 资源不足(如 CPU、内存或磁盘)。
- 过多的客户端同时请求元数据。
解决方法:
- 检查 Kafka Broker 的负载:
top iostat
- 增加 Kafka Broker 的硬件资源或节点数量。
- 限制客户端的元数据请求频率:
metadata.max.age.ms=60000 # 降低元数据请求频率
场景 5:客户端配置不当
现象:
客户端配置超时时间过短,导致元数据请求超时。
原因:
- 客户端的
metadata.fetch.timeout.ms
或request.timeout.ms
配置值过低。
解决方法:
- 增加客户端的元数据请求超时时间:
metadata.fetch.timeout.ms=60000 # 元数据获取超时设置为 60 秒 request.timeout.ms=60000 # 请求超时设置为 60 秒
- 配置
retries
和retry.backoff.ms
以增强请求的容错能力:retries=5 # 重试次数 retry.backoff.ms=2000 # 每次重试的间隔
3. 检查方法
3.1 检查主题
确保主题存在:
bin/kafka-topics.sh --bootstrap-server <broker_host>:9092 --list
3.2 查看 Broker 日志
Kafka Broker 会记录主题创建和元数据同步的相关日志。检查 Broker 日志是否有以下错误:
Topic not found
Metadata fetch timed out
3.3 查看客户端日志
客户端的错误日志可以帮助确认是网络问题还是元数据问题。
4. 案例分析
案例:生产者发送消息报错
现象:
生产者向主题 user_logs
发送消息时,报错:
org.apache.kafka.common.errors.TimeoutException: Topic user_logs not present in metadata after 60000 ms
排查与解决步骤:
-
检查主题是否已创建:
bin/kafka-topics.sh --bootstrap-server <broker_host>:9092 --list
如果主题未列出,手动创建主题:
bin/kafka-topics.sh --bootstrap-server <broker_host>:9092 --create --topic user_logs --partitions 3 --replication-factor 2
-
检查生产者配置:
- 确保
bootstrap.servers
中的 Broker 地址正确。 - 增加
metadata.fetch.timeout.ms
和request.timeout.ms
:metadata.fetch.timeout.ms=60000 request.timeout.ms=60000
- 确保
-
检查网络连接:
ping broker1 telnet broker1 9092
-
检查 Kafka Broker 的运行状态,确保所有节点正常。