Kafka如何删除topic?

Kafka如何删除topic?

今天为大家带来“Kafka删除topic原理解析”,希望可以帮到那些苦于无法删除topic的朋友们。

前提条件: 在启动broker时候开启删除topic的开关,即在server.properties中添加:  delete.topic.enable=true

命令: bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name

这条命令其实就是在zookeeper(假设你的chroot就是/)的/admin/delete_topics下创建一个临时节点,名字就是topic名称,比如如果执行命令:

bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic test-topic

那么,命令返回后,zookeeper的/admin/delete_topics目录下会新创建一个临时节点test-topic

这条命令返回打印在控制台上的消息也说明了这点:

Topic test-topic is marked for deletion.

Note: This will have no impact if delete.topic.enable is not set to true.

这就是说,这条命令其实并不执行删除动作,仅仅是在zookeeper上标记该topic要被删除而已,同时也提醒用户一定要提前打开delete.topic.enable开关,否则删除动作是不会执行的。

那么,我们通过命令标记了test-topic要被删除之后Kafka是怎么执行删除操作的呢? 总的流程如下图所示:

  1. Kafka controller在启动的时候会注册对于Zookeeper节点/admin/delete_topics的子节点变更监听器——上面的分析已经告诉我们,delete命令实际上就是要在该节点下创建一个临时节点,名字是待删除topic名,标记该topic是待删除的
  2. Kafka controller在启动时创建一个单独的线程,执行topic删除的操作 (由DeleteTopicsThread类实现)
  3. 线程启动时查看是否有需要进行删除的topic——假设我们是在controller启动之后执行的topic删除命令,那么该线程刚启动的时候待删除的topic集合应该就是空的
  4. 一旦发现待删除topic集合是空,topic删除线程会被挂起
  5. 这时,我们执行delete操作,删除topic: test-topic,delete命令会在/admin/delete_topics节点下创建子节点test-topic
  6. 监听器捕获到该变更,立刻触发删除逻辑
    1. 查询test-topic是否存在,不存在的话直接删除/admin/delete_topics/test-topic节点——随便删除一个不存在的topic,删除命令也只是创建/admin/delete_topics/[topicName]的节点,它不负责做存在性校验
    2. 查询一下test-topic是不是当前正在执行Preferred副本选举或分区重分配,如果是的话,肯定是不适合进行删除掉的。Controller本地会缓存当前无法进行删除的topic集合,待分区重分配完成或preferred副本选举后单独处理该集合中的topic
    3. 如何两者都不是的话说明现在可以进行删除操作,那么就恢复挂起的删除线程执行删除操作

而删除线程执行删除操作的真正逻辑是:

  1. 它首先会给当前所有broker发送更新元数据信息的请求,告诉这些broker说这个topic要删除了,你们可以把它的信息从缓存中删掉了
  2. 开始删除这个topic的所有分区
    1. 给所有broker发请求,告诉它们这些分区要被删除。broker收到后就不再接受任何在这些分区上的客户端请求了
    2. 把每个分区下的所有副本都置于OfflineReplica状态,这样ISR就不断缩小,当leader副本最后也被置于OfflineReplica状态时leader信息将被更新为-1
    3. 将所有副本置于ReplicaDeletionStarted状态
    4. 副本状态机捕获状态变更,然后发起StopReplicaRequest给broker,broker接到请求后停止所有fetcher线程、移除缓存,然后删除底层log文件
    5. 关闭所有空闲的Fetcher线程
  3. 删除zookeeper下/brokers/topics/test-topic节点
  4. 删除zookeeper下/config/topics/test-topic节点
  5. 删除zookeeper下/admin/delete_topics/test-topic节点
  6. 更新各种缓存,把test-topic相关信息移除出去

okay,一个topic就这么被干净得删除了~~

版权声明:本文版权由木秀林网所有,转载请保留链接:Kafka如何删除topic?

时间: 2024-07-30 05:10:42

Kafka如何删除topic?的相关文章

kafka彻底删除topic

如果只是用kafka-topics.sh的delete命令删除topic,会有两种情况: 如果当前topic没有使用过即没有传输过信息:可以彻底删除 如果当前topic有使用过即有过传输过信息:并没有真正删除topic只是把这个topic标记为删除(marked for deletion). 要彻底把情况2中的topic删除必须把kafka中与当前topic相关的数据目录和zookeeper与当前topic相关的路径一并删除. 相关组件的版本 zookeeper: 3.4.6 kafka: 0.

kafka实战 - 删除topic

概述 在平时对kafka的运维工作中,我们经常会由于某些原因去删除一个topic,比如这个topic是测试用的,生产环境中需要删除.或者我想扩容topic的同时,这个topic中的数据我不想要了,这时候删除topic,增加broker,再重新创建topic就会是比较简单的方法.但是kafka删除topic时,有很多关键的点必须清楚,否则在删除topic的时候就会出现各种各样的问题. 我测试环境使用的kafka版本是0.10.2.0,不同版本的kafka默认配置和bin目录下脚本使用的方式略有不同

kafka删除topic的方法

0.8的官方文档提供了一个删除topic的命令: kafka-topics.sh --delete 但是在运行时会报错找不到这个方法. kafka-topics.sh最终是运行了kafka.admin.TopicCommand这个类,在0.8的源码中这个类中没有找到有delete topic相关的代码. 在kafka的admin包下,提供了一个DeleteTopicCommand的类,可以实现删除topic的功能. kafka.admin.DeleteTopicCommand 其中删除topic

使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)

使用Kafka的同学都知道,我们每次创建Kafka主题(Topic)的时候可以指定分区数和副本数等信息,如果将这些属性配置到server.properties文件中,以后调用Java API生成的主题将使用默认值,先改变需要使用命令bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my-topic --config max.message.bytes=128000显示的修改,我们也希望将此过程在Producer调用之前通

kafka删除topic

手动: 删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录 删除zookeeper "/brokers/topics/"目录下相关topic节点 命令+手动: bin/kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic mrtopic --zookeeper cmcc1:2181,cmcc2:2181,cmcc

如何彻底删除Kafka中的topic (marked for deletion)

工作中因为各种原因, 例如topic中消息堆积的太多,或者kafka所在磁盘空间满了等等,可能需要彻底清理一下kafka topic,那么如何彻底删除topic?方法一(配置delete.topic.enable=true)  修改kafaka配置文件server.properties, 添加delete.topic.enable=true,重启kafka,之后通过kafka命令行就可以直接删除topic  通过命令行删除topic:     ./bin/kafka-topics.sh --de

Kafka管理与监控——彻底删除topic

一.配置 server.properties 设置 delete.topic.enable=true 如果没有设置 delete.topic.enable=true,则调用kafka 的delete命令无法真正将topic删除,而是显示(marked for deletion) 二.停止消费 如果需要被删除topic 此时正在被程序 produce和consume,则这些生产和消费程序需要停止. 因为如果有程序正在生产或者消费该topic,则该topic的offset信息一致会在broker更新

Kafka日志及Topic数据清理

由于项目原因,最近经常碰到Kafka消息队列拥堵的情况.碰到这种情况为了不影响在线系统的正常使用,需要大家手动的清理Kafka Log.但是清理Kafka Log又不能单纯的去删除中间环节产生的日志,中间关联的很多东西需要手动同时去清理,否则可能会导致删除后客户端无法消费的情况. 在介绍手动删除操作之前,先简单的介绍一下Kafka消费Offset原理. 一.Kafka消费Offset 在通过Client端消费Kafka中的消息时,消费的消息会同时在Zookeeper和Kafka Log中保存,如

Kafka0.8.2删除topic逻辑(转)

原文链接:Kafka0.8.2.1删除topic逻辑 前提条件: 在启动broker时候开启删除topic的开关,即在server.properties中添加:  delete.topic.enable=true 命令: bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name           注:chroot如果没有设置就空过去 这条命令其实就是在zookeeper(假设你的chro