Kafka删除Topic的过程:

1. Kafka的broker在被选举成controller后,会执行下面几步
   1.1 注册DeleteTopicsListener,监听zookeeper节点/admin/delete_topics下子节点的变化,delete命令实际上就是要在该节点下创建一个节点,名字是待删除topic名,标记该topic是待删除的
   1.2 创建一个单独的线程DeleteTopicsThread,来执行topic删除的操作
2. DeleteTopicsThread线程启动时会先在awaitTopicDeletionNotification处阻塞并等待删除事件的通知,即有新的topic被添加到queue里等待被删除。
3. 当我们使用了delete命令在zookeeper上的节点/admin/delete_topics下创建子节点< topic_name >。
4. DeleteTopicsListener会收到ChildChange事件会依次判断如下逻辑:
   4.1 查询topic是否存在,若已经不存在了,则直接删除/admin/delete_topics/< topic_name >节点。
   4.2 查询topic是否为当前正在执行Preferred副本选举或分区重分配,若果是,则标记为暂时不适合被删除。
   4.3 并将该topic添加到queue中,此时会唤醒DeleteTopicsThread中doWork方法里awaitTopicDeletionNotification处的阻塞线程,让删除线程继续往下执行。
而删除线程执行删除操作的真正逻辑是:
  1. 它首先会向各broker更新原信息,使得他们不再向外提供数据服务,准备开始删除数据。
  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/< topic_name >
  4. 删除zookeeper上节点/config/topics/< topic_name >
  5. 删除zookeeper上节点/admin/delete_topics/< topic_name >
  6. 并删除内存中的topic相关信息。

猜你喜欢

转载自blog.csdn.net/qq_36381640/article/details/82556553