2017-04-14 16 views
1

私はそれぞれに割り当てられた48GBのディスクを持つ2ノードカフカクラスターを持っています。 server.propertiesは、ログを最大48時間まで、またはログセグメントを最大1GBまで保持するように設定されています。ここにあります:なぜカフカはデータを削除しないのですか?

log.retention.hours=48 
log.retention.bytes=1073741824 
log.segment.bytes=1073741824 

私はトピックに対して30パートタイトを持っています。これらのパーティションのディスク使用状況は次のとおりです。

-rw-r--r-- 1 root root 1.9M Apr 14 00:06 00000000000000000000.index 
-rw-r--r-- 1 root root 1.0G Apr 14 00:06 00000000000000000000.log 
-rw-r--r-- 1 root root 0 Apr 14 00:06 00000000000000000000.timeindex 
-rw-r--r-- 1 root root 10M Apr 14 12:43 00000000000001486744.index 
-rw-r--r-- 1 root root 73M Apr 14 12:43 00000000000001486744.log 
-rw-r--r-- 1 root root 10M Apr 14 00:06 00000000000001486744.timeindex 

明らかにわかるように、ログセグメントは1GBです。しかし、私の理解によると、それはすでに削除されているはずです。また、これらのログがKafkaによって展開されてから48時間以上も経っています。思考?

答えて

3

log.retention.byteslog.segment.bytesを同じ値に設定します。つまり、削除可能なセグメントは常に存在しないため、削除は行われません。

アルゴリズムである:

  1. まず差を計算します。あなたのケースでは、差は73MB(73MB + 1GB - 1GB)です
  2. イテレータすべての非アクティブなログセグメント、そのサイズをdiffと比較します
  3. diff>ログセグメントサイズの場合、このセグメントを削除可能とマークしますsize
  4. それ以外の場合は、このセグメントを削除不能にして、次のログセグメントを試してみてください。

    のはが値24時間log.retention.byteslog.segment.bytesが両方とも1 GBに設定されているとしましょう:自分の質問に答える

+0

古いログセグメントを手動で削除してから、サーバーを再起動しても問題ありませんか?我々のディスクはほぼ80%です。壊滅的なエラーに遭遇したくない。 – Ankush92

+0

個人的には、カフカはセグメントファイルやインデックスなどのログファイルを削除してサーバーを再起動するとサーバーのメタデータを更新することができますが、包括的なテストを強くお勧めします。 – amethystic

+0

確かに。私はカフカが私が手動でやってほしいと言ったことと同じことをすると思います。しかし、生産においてそのようなことを行うことはかなり大胆であろう。 – Ankush92

0

。ログの値が1GBに達すると(この古いログを呼び出す)、新しいログセグメントが作成されます(この新しいログを呼び出します)。古いログは、新しいログが作成されてから24時間後に削除されます。

私の場合、この質問を投稿する約25時間前に新しいログが作成されました。私はトピック(Zookeeperによって管理され、Kafkaクラスタではなく、したがってKafkaの再起動は必要ない)のretention.ms値を24時間に動的に変更しました。私の古いログは直ちに削除されました。

関連する問題