1. 程式人生 > >kafka清理

kafka清理

  由於專案原因,最近經常碰到Kafka訊息佇列擁堵的情況。碰到這種情況為了不影響線上系統的正常使用,需要大家手動的清理Kafka Log。但是清理Kafka Log又不能單純的去刪除中間環節產生的日誌,中間關聯的很多東西需要手動同時去清理,否則可能會導致刪除後客戶端無法消費的情況。

  在介紹手動刪除操作之前,先簡單的介紹一下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具體消費原理可以參見:http://blog.xiaoxiaomo.com/2016/05/14/Kafka-Consumer%E6%B6%88%E8%B4%B9%E8%80%85/

二、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中的訊息

1 2 ./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代表昨天