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(假設你的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相關信息移除出去


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM