Kafka0.8.2.1删除topic逻辑

来源:互联网 发布:淘宝售后退款要多久 编辑:程序博客网 时间:2024/06/09 13:50

原文链接: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(假设你的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开关(在server.properties中添加),否则删除动作是不会执行的。如果之前运行时没有设置,那么设置后需要重新运行,然后才能删除
 
那么,我们通过命令标记了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. 监听器捕获到该变更,立刻触发删除逻辑
    6.1 查询test-topic是否存在,不存在的话直接删除/admin/delete_topics/test-topic节点——随便删除一个不存在的 topic,删除命令也只是创建/admin/delete_topics/[topicName]的节点,它不负责做存在性校验
    6.2 查询一下test-topic是不是当前正在执行Preferred副本选举或分区重分配,如果是的话,肯定是不适合进行删除掉的。Controller 本地会缓存当前无法进行删除的topic集合,待分区重分配完成或preferred副本选举后单独处理该集合中的topic
    6.3 如何两者都不是的话说明现在可以进行删除操作,那么就恢复挂起的删除线程执行删除操作
 
删除线程执行删除操作的真正逻辑是:
1. 它首先会给当前所有broker发送更新元数据信息的请求,告诉这些broker说这个topic要删除了,你们可以把它的信息从缓存中删掉了
2. 开始删除这个topic的所有分区
    2.1 给所有broker发请求,告诉它们这些分区要被删除。broker收到后就不再接受任何在这些分区上的客户端请求了
    2.2 把每个分区下的所有副本都置于OfflineReplica状态,这样ISR就不断缩小,当leader副本最后也被置于OfflineReplica状态时leader信息将被更新为-1
    2.3 将所有副本置于ReplicaDeletionStarted状态
    2.4 副本状态机捕获状态变更,然后发起StopReplicaRequest给broker,broker接到请求后停止所有fetcher线程、移除缓存,然后删除底层log文件
    2.5 关闭所有空闲的Fetcher线程
3. 删除zookeeper下/brokers/topics/test-topic节点
4. 删除zookeeper下/config/topics/test-topic节点
5. 删除zookeeper下/admin/delete_topics/test-topic节点
6. 更新各种缓存,把test-topic相关信息移除出去



kafka0.8.1.1以及之前版本都无法使用类似一条命令就彻底删除topic,以前看过网上一些删除命令不过只是在zookeeper注销信息而已,但是实际的日志内容还是保存在kafka log中,因为个人需要所以慢慢琢磨了方法彻底清除topic(ps:kafka0.8.2好像直接支持直接删除,不过现在还是beta版 )。

本人机器环境如下:

Kafka目录:/usr/local/kafka_2.10-0.8.1.1

日志保存目录log.dirs:/data1/kafka/log/

删除的topic名字:zitest2

(1) 从zookeerer删除信息:

/usr/local/kafka_2.10-0.8.1.1/bin/kafka-run-class.shkafka.admin.DeleteTopicCommand --zookeeper 10.12.0.91:2181,10.12.0.92:2181,10.12.0.93:2181/kafka--topic zitest2

成功后返回信息:deletion succeeded!

(2) JPS查看kill掉QuorumPeerMain和Kafka进程

(3)从log.dirs目录删除文件,可以看到多个子目录名字如zitest2-0,zitest2-1…zitest2-n(就是你topic的partition个数)

rm  –fr  zitest2-0……zitest2-n

(4)  修改日志目录的recovery-point-offset-checkpoint和replication-offset-checkpoint文件(要小心删除,否则待会kafka不能正常启动起来)

replication-offset-checkpoint格式如下:

  0

  4(partition总数)

  zitest2 0 0

  zitest2  3 0

  hehe 0 0

  hehe 1 0

修改后如下:

  0

  2(partition总数)

  hehe 0 0

  hehe 1 0

把含有zitest2行全部去掉,并且把partition总数修改为减去zitest2的partition的剩余数目,同理recovery-point-offset-checkpoint也是这样修改。

完成后就可以正常启动zookeeper和kafka。



1、删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录

2、Kafka 删除topic的命令是:

   ./bin/kafka-topics  --delete --zookeeper 【zookeeper server】  --topic 【topic name】

   如果kafaka启动时加载的配置文件中server.properties没有配置delete.topic.enable=true,那么此时的删除并不是真正的删除,而是把topic标记为:marked for deletion

   你可以通过命令:./bin/kafka-topics --zookeeper 【zookeeper server】 --list 来查看所有topic

  此时你若想真正删除它,可以登录zookeeper客户端:

  命令:./bin/zookeeper-client

  找到topic所在的目录:ls /brokers/topics

  找到要删除的topic,执行命令:rmr /brokers/topics/【topic name】即可,此时topic被彻底删除。

 另外被标记为marked for deletion的topic你可以在zookeeper客户端中通过命令获得:ls /admin/delete_topics/【topic name】,如果你删除了此处的topic,那么marked for deletion 标记消失

zookeeper 的config中也有有关topic的信息: ls /config/topics/【topic name】暂时不知道有什么用


总结:

彻底删除topic:

  1、如果配置中不允许删topic,尽量不要删除

  2、不到万不得已,尽量不要手工修改zookeeper里的配置信息

  3、老的broker重启后leader会自动分配的,新的则不会

  


0 0
原创粉丝点击