本文依然是以kafka0.8.2.2为例讲解
一,如何删除一个topic
删除一个topic有两个关键点:
1,配置删除参数
delete.topic.enable这个Broker参数配置为True。
2,执行
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name
假如不配置删除参数为true的话,topic其实并没有被清除,只是被标记为删除。此时,估计一般人的做法是删除topic在Zookeeper的信息和日志,其实这个操作并不会清除kafkaBroker内存的topic数据。所以,此时最佳的策略是配置删除参数为true然后,重启kafka。
二,重要的类介绍
1,PartitionStateMachine
该类代表分区的状态机。决定者分区的当前状态,和状态转移。四种状态
NonExistentPartition
NewPartition
OnlinePartition
OfflinePartition
2,ReplicaManager
负责管理当前机器的所有副本,处理读写、删除等具体动作。
读写:写获取partition对象,再获取Replica对象,再获取Log对象,采用其管理的Segment对象将数据写入、读出。
3,ReplicaStateMachine
副本的状态机。决定者副本的当前状态和状态之间的转移。一个副本总共可以处于一下几种状态的一种
NewReplica:Crontroller在分区重分配的时候可以创建一个新的副本。只能接受变为follower的请求。前状态可以是NonExistentReplica
OnlineReplica:新启动的分区,能接受变为leader或者follower请求。前状态可以是NewReplica, OnlineReplica or OfflineReplica
OfflineReplica:死亡的副本处于这种状态。前状态可以是NewReplica, OnlineReplica
ReplicaDeletionStarted:分本删除开始的时候处于这种状态,前状态是OfflineReplica
ReplicaDeletionSuccessful:副本删除成功。前状态是ReplicaDeletionStarted
ReplicaDeletionIneligible:删除失败的时候处于这种状态。前状态是ReplicaDeletionStarted
NonExistentReplica:副本成功删除之后处于这种状态,前状态是ReplicaDeletionSuccessful
4,TopicDeletionManager
该类管理着topic删除的状态机
1),TopicCommand通过创建/admin/delete_topics/,来发布topic删除命令。
2),Controller监听/admin/delete_topic子节点变动,开始分别删除topic。想学习交流HashMap,nginx、dubbo、Spring MVC,分布式、高性能高可用、MySQL,redis、jvm、多线程、netty、kafka、的加尉xin(同英):1253431195 扩列获取资料学习,无工作经验不要加哦!
3),Controller有个后台线程负责删除Topic
三,源码彻底解析topic的删除过程
此处会分四个部分:
A),客户端执行删除命令作用
B),不配置delete.topic.enable整个流水的源码
C),配置了delete.topic.enable整个流水的源码
D),手动删除zk上topic信息和磁盘数据
1,客户端执行删除命令
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name
进入kafka-topics.sh我们会看到
exec $(dirname $0)/kafka-run-class.sh kafka.admin.TopicCommand $@
进入TopicCommand里面,main方法里面
else if(opts.options.has(opts.deleteOpt))
deleteTopic(zkClient, opts)
实际内容是