天天看點

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是怎麼執行删除操作的呢? 總的流程如下圖所示:

Kafka0.8.2.1删除topic邏輯

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相關資訊移除出去