原文鏈接: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相關信息移除出去