在介紹手動刪除操作之前,先簡單的介紹一下kafka消費offset原理。
一、kafka消費offset
在通過client端消費kafka中的訊息時,消費的訊息會同時在zookeeper和kafka log中儲存,如上圖紅線所示。
當手動刪除kafka某一分片上的訊息日誌時,如上圖藍線所示,此是只是將kafka log中的資訊清0了,但是zookeeper中的partition和offset資料依然會記錄。當重新啟動kafka後,我們會發現如下二種情況:
a、客戶端無法正常用消費;
b、在使用kafka consumer offset monitor工具進行kafka監控時會發現lag(還有多少訊息數未讀取(lag=logsize-offset))為負數;其中此種情況的刪除操作需要我們重點關注,後面我們也會詳細介紹其對應的操作步驟。
一般正常情況,如果想讓kafka客戶端正常消費,那麼需要zookeeper和kafka log中的記錄保持如上圖黃色所示。
kafka具體消費原理可以參見:
二、kafka訊息日誌清除
操作步驟主要包括:
1、停止kafka執行;
2、刪除kafka訊息日誌;
3、修改zk的偏移量;
4、重啟kafka;
上述步驟重點介紹其中的關鍵步驟。
在進行第2步:刪除kafka訊息日誌時,進入kafka訊息日誌路徑下,使用du -sh * 檢查磁碟占用比較大的目錄,然後刪除此目錄;
在進行第3步:修改zk的偏移量時,進入zk的安裝目錄下,執行./zkcli.sh -server (中間以,分割),如果不帶server預設修改的為本機。
示例如下:
a.執行./zkcli.sh -server aaa:2181,bbb:2181,ccc:2181
b.在zk上執行ls /consumers/對應的分組/offset/對應的topic,就可以看到此topic下的所有分割槽了;
通過get /consumers/對應的分組/offset/對應的topic/對應的分割槽號,可以查詢到該分割槽上記錄的offset;
通過set /consumers/對應的分組/offset/對應的topic/對應的分割槽號 修改後的值(一般為0),即可完成對offset的修改;
三、重建topic
操作步驟主要包括如下:
1、刪除topic;
2、刪除log日誌;
3、刪除zk中的topic記錄
第一步:刪除topic
執行./kafka-topics.sh -delete -zookeeper [zookeeper server] -topic [topic name];如果kafka啟動時載入的配置檔案server.properties沒有配置delete.topic.enable = true,那麼此時的刪除並不是真正的刪除。而只是把topic標記為:marked for deletion,此時就需要執行第3步的操作;
第三步:刪除zk中的topic記錄
示例如下:
a.執行./zkcli.sh -server aaa:2181,bbb:2181,ccc:2181
b.進入/admin/delete_topics目錄下,找到刪除的topic,刪除對應的資訊。
四、常用命令
a.檢視kafka中的訊息
./kafka-run-
class
.sh kafka.tools.dumplogsegments -print-data-log -files /data01/middle/kafka-logs/00000002154.log >>aa.txt
find /dataa01 -mtime 0 -name *.log |xargs /kafka-run-
class
.sh kafka.tools.dumplogsegments -print-data-log -files /data01/middle/kafka-logs/00000002154.log >>aa.txt
0代表當天;-1代表昨天
分類: 17.訊息中介軟體
刪除kafka topic及其資料,嚴格來說並不是很難的操作。但是,往往給kafka 使用者帶來諸多問題。專案組之前接觸過多個開發者,發現都會偶然出現無法徹底刪除kafka的情況。本文總結多個刪除kafka topic的應用場景,總結一套刪除kafka topic的標準操作方法。
step1:
如果需要被刪除topic 此時正在被程式 produce和consume,則這些生產和消費程式需要停止。
因為如果有程式正在生產或者消費該topic,則該topic的offset資訊一致會在broker更新。呼叫kafka delete命令則無法刪除該topic。
同時,需要設定 auto.create.topics.enable = false,預設設定為true。如果設定為true,則produce或者fetch 不存在的topic也會自動建立這個topic。這樣會給刪除topic帶來很多意向不到的問題。
所以,這一步很重要,必須設定auto.create.topics.enable = false,並認真把生產和消費程式徹底全部停止。
step2:
server.properties設定 delete.topic.enable=true
如果沒有設定 delete.topic.enable=true,則呼叫kafka 的delete命令無法真正將topic刪除,而是顯示(marked for deletion)
step3:
呼叫命令刪除topic:
./bin/kafka-topics --delete --zookeeper 【zookeeper server:port】 --topic 【topic name】
step4:
刪除kafka儲存目錄(server.properties檔案log.dirs配置,預設為"/data/kafka-logs")相關topic的資料目錄。
注意:如果kafka 有多個 broker,且每個broker 配置了多個資料盤(比如 /data/kafka-logs,/data1/kafka-logs ...),且topic也有多個分割槽和replica,則需要對所有broker的所有資料盤進行掃瞄,刪除該topic的所有分割槽資料。
一般而言,經過上面4步就可以正常刪除掉topic和topic的資料。但是,如果經過上面四步,還是無法正常刪除topic,則需要對kafka在zookeeer的儲存資訊進行刪除。具體操作如下:
(注意:以下步驟裡面,kafka在zk裡面的節點資訊是採用預設值,如果你的系統修改過kafka在zk裡面的節點資訊,則需要根據系統的實際情況找到準確位置進行操作)
step5:
找一台部署了zk的伺服器,使用命令:
bin/zkcli.sh -server 【zookeeper server:port】
登入到zk shell,然後找到topic所在的目錄:ls /brokers/topics,找到要刪除的topic,然後執行命令:
rmr /brokers/topics/【topic name】
即可,此時topic被徹底刪除。
如果topic 是被標記為 marked for deletion,則通過命令 ls /admin/delete_topics,找到要刪除的topic,然後執行命令:
rmr /admin/delete_topics/【topic name】
備註:
rmr /consumers/【consumer-group】
rmr /config/topics/【topic name】
其實正常情況是不需要進行這兩個操作的,如果需要,那都是由於操作不當導致的。比如step1停止生產和消費程式沒有做,step2沒有正確配置。也就是說,正常情況下嚴格按照step1 -- step5 的步驟,是一定能夠正常刪除topic的。
step6:
完成之後,呼叫命令:
./bin/kafka-topics.sh --list --zookeeper 【zookeeper server:port】
檢視現在kafka的topic資訊。正常情況下刪除的topic就不會再顯示。
但是,如果還能夠查詢到刪除的topic,則重啟zk和kafka即可。
Kafka日誌及Topic資料清理
在介紹手動刪除操作之前,先簡單的介紹一下kafka消費offset原理。一 kafka消費offset 在通過client端消費kafka中的訊息時,消費的訊息會同時在zookeeper和kafka log中儲存,如上圖紅線所示。當手動刪除kafka某一分片上的訊息日誌時,如上圖藍線所示,此是只是將...
kafka 徹底刪除 topic 及資料
預設情況,當我們刪除 topic 並不會真正刪除,只是把佇列標記為 marked for deletion 如果我們要徹底刪除 topic 及資料,可採用一下方法 方法一 修改 kafka conf server.properties,增加 delete.topic.enable true,然後重啟...
kafka的Topic和日誌
kafka中所有訊息是通過topic為單位進行管理,每個kafak的topic通常會有多個訂閱者,負責訂閱傳送到該topic的資料。kakfa負責管理集群中每個topic的一組日誌分割槽資料 生產者將資料傳送到相應的topic。負責定址將哪個分割槽傳送到topic的哪個partion?例如 roun...