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
這條命令其實就是在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開關,不然刪除動做是不會執行的。
 
那麼,咱們經過命令標記了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相關信息移除出去
相關文章
相關標籤/搜索