Kafka 0.10.2版本中,Kafka的retention.ms未被执行?

3
#!/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已更改为100ms,但在延迟120秒后,我仍然在所有kafka主题中看到相同的消息。

那么我该如何清除这些消息呢?

谢谢, Dmitry

2个回答

11
比接受答案所说的更有点儿复杂。Kafka将消息存储在文件系统上的日志文件中。这些文件有一个翻转(由时间或大小配置)。一旦文件不再是当前文件,Kafka就不会再向该文件追加内容。
现在来说有趣的部分:Kafka不会过期单个消息。对于非压缩主题,它会删除整个日志文件,一旦该文件中的消息的最高时间戳早于retention.ms。保留时间告诉您消息将至少可用这么长时间,但它可能会可用更长的时间(取决于翻转配置和消息量)。
在较旧的Kafka版本中,这不是基于消息时间戳而是基于对日志文件的写访问权限。感谢@dawsaw指出这一点。

这里描述的行为适用于0.10.2之前的版本。最后修改时间不再使用,而是使用时间索引。 - dawsaw
您是否有相关链接或者KIP吗?当前的文档还是如下所述:“数据会一段一段地被删除。日志管理器提供可插拔的删除策略,以选择哪些文件可以被删除。当前的策略是删除修改时间超过N天的所有日志,但是一个保留最近N GB 的策略也可能非常有用。”(https://kafka.apache.org/documentation/#impl_deletes) - ftr
这是0.10.1中值得注意的变化 https://kafka.apache.org/documentation/#upgrade_10_1_breaking - dawsaw
1
我没有意识到这一点。我会调整我的答案,但是在我看来,总体观点仍然相关。 - ftr

10

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接