卡夫卡的留存率没有用卡夫卡0.10.2强制执行?

时间:2017-04-17 23:17:06

标签: apache-kafka kafka-consumer-api

#!/bin/zsh
zk_servers=('10.138.0.8' '10.138.0.9' '10.138.0.16')
kafka_servers=('10.138.0.13:9092' '10.138.0.14:9092')
topics=('t1' 't2' 't1_failed' 't2_failed')


NORMAL=$(tput sgr0)
GREEN=$(tput setaf 2; tput bold)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)

function red() {
    echo -e "$RED$*$NORMAL"
}

function green() {
    echo -e "$GREEN$*$NORMAL"
}

function yellow() {
    echo -e "$YELLOW$*$NORMAL"
}



for topic in $topics; do
   yellow "Cleaning up messages in topic @ " $topic
   yellow "=============================================================="
   $KAFKA/kafka-topics.sh --zookeeper $zk_servers --alter --topic $topic --config retention.ms=100
   $KAFKA/kafka-topics.sh --zookeeper $zk_servers --describe --topic $topic
done

red "Waiting 120 seconds for messages to expire"
sleep 120

for topic in $topics; do 
   green "Restoring config of topic @ " $topic                                                                  
   green "=============================================================="
   $KAFKA/kafka-topics.sh --zookeeper $zk_servers --alter --topic $topic --delete-config retention.ms                
   $KAFKA/kafka-topics.sh --zookeeper $zk_servers --describe --topic $topic
   $KAFKA/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list $kafka_servers --topic $topic
done

当我运行此脚本时 - 我可以看到config.retention.ms已更改为100毫秒,但延迟120秒后 - 我仍然在所有kafka主题中看到相同的消息。

那么如何清除邮件?

感谢, 梅德

2 个答案:

答案 0 :(得分:7)

您必须等待log.retention.check.interval.ms,默认为5分钟。

答案 1 :(得分:7)

它比接受的答案还要多一点。 Kafka将消息存储在文件系统上的日志文件中。这些文件具有翻转(按时间或大小配置)。一旦文件不再是当前文件,Kafka将不再附加到该文件。

现在有趣的部分:Kafka不会过期个人消息。一旦该文件中消息的最高时间戳早于retention.ms,它(对于非压缩主题)将删除整个日志文件。保留时间告诉您消息至少至少,但它可能可用的时间更长(取决于翻转配置和消息量)。

在较旧的Kafka版本中,这不是基于消息时间戳,而是基于对日志文件的写访问权。感谢@dawsaw指出这一点。