【问题标题】:Kafka : How delete topic worksKafka:删除主题的工作原理
【发布时间】:2023-03-17 12:10:01
【问题描述】:

我正在使用 kafka 2.10-0.9.0.1 当我通过命令删除主题时,主题被标记为删除。

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic T.AB_KAFF

但是,当我向该主题发布消息并且再次订阅该主题时,主题描述说它的滞后是当前偏移量(最后提交的偏移量)的 -ve

bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server localhost:9092 --describe --group G.AB_KAFF

主题的最后状态:

组、主题、分区、当前偏移量、日志结束偏移量、滞后、所有者 G.AB_KAFF, T.AB_KAFF, 0, 5, 5, 0, 消费者-2_/127.0.0.1 G.AB_KAFF, T.AB_KAFF, 1, 5, 5, 0, consumer-2_/127.0.0.1

现在我删除主题。 并将消息发布到该主题

再次订阅后的话题状态:

组、主题、分区、当前偏移量、日志结束偏移量、滞后、所有者 G.AB_KAFF, T.AB_KAFF, 0, 5, 1, -4, consumer-3_/127.0.0.1 G.AB_KAFF, T.AB_KAFF, 1, 5, 0, -5, consumer-3_/127.0.0.1

那么为什么 kafka 将滞后设置为 -ve 数。 这不是导致问题的可能性吗?

假设我再次订阅已删除的主题,所以在 -ve lag 为 0 之前我不会收到任何消息

其他信息:
- 我在本地运行 3 个 kafka 节点
- 我添加了属性:delete.topic.enable=true
- 这个主题是使用 partitions=2, replication-factor=2 创建的

【问题讨论】:

  • broker 配置文件中添加delete.topic.enable 后,您是否尝试删除该主题。 ?
  • 是的,我在 server.properties 文件中添加了这个属性
  • -ve lag 是什么意思?那么你的话题被删除了吗?

标签: java apache-kafka kafka-consumer-api kafka-producer-api


【解决方案1】:

一旦您删除了一个主题,它存储在 Kafka 中的记录就会丢失。因此,对最新偏移量的查询返回 0

组中的消费者实例会定期提交特殊主题__consumer-offset-{0..49} 中的最后读取记录偏移量。在延迟计算期间,它会执行latestOffset-lastReadRecordOffset,因此在删除主题后,kafka-consumers-groups 命令中会显示负延迟。

[kamal@tcltest1 bin]$ sh kafka-run-class.sh kafka.tools.GetOffsetShell --topic test --time -1 --broker-list localhost:9092 # Query to get latest offset
test:0:1000
[kamal@tcltest1 bin]$ sh kafka-topics.sh --topic test --zookeeper localhost:2181 --delete
Topic test is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
[kamal@tcltest1 bin]$ sh kafka-run-class.sh kafka.tools.GetOffsetShell --topic test --time -1 --broker-list localhost:9092 # After deletion
[kamal@tcltest1 bin]$ 

存储在 Zookeeper 中的元数据将被异步删除。 (如果我错了,请纠正我)

[kamal@tcltest1 bin]$ sh zookeeper-shell.sh localhost:2181
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is disabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
get /brokers/topics/test/partitions/0/state
{"controller_epoch":1,"leader":0,"version":1,"leader_epoch":0,"isr":[0]}
cZxid = 0x13c
ctime = Thu Jun 09 09:56:05 IST 2016
mZxid = 0x13c
mtime = Thu Jun 09 09:56:05 IST 2016
pZxid = 0x13c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 72
numChildren = 0

【讨论】:

  • 那么有什么办法可以删除主题,这样就根本不接收消息了?
  • 在代理中禁用 auto.create.topics.enable 属性。注意:默认情况下启用此属性。生产者/消费者对不存在的主题的请求会自动创建。如果要禁用它,请确保在启动客户端应用程序之前创建所需的主题。
  • 谢谢@kamal。我想知道如何在运行时通过消费者组或主题工具删除主题。这在重新启动我的应用程序时会很有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2017-05-18
  • 2017-10-17
  • 2014-08-08
  • 2019-07-07
  • 1970-01-01
  • 2022-11-03
  • 2017-11-17
相关资源
最近更新 更多