Apache kafka 卡夫卡:邮件从主题中消失,最大时间=0

Apache kafka 卡夫卡:邮件从主题中消失,最大时间=0,apache-kafka,apache-zookeeper,Apache Kafka,Apache Zookeeper,我们在ApacheKafka的2.3、2.4.0、2.4.1和2.5.0版本的主题中看到消息正在消失。当我们对集群进行滚动部署时,我们注意到了这一点,但不幸的是,这种情况并非每次都发生,因此非常不一致 有时我们会丢失一个主题内的所有消息,有时我们会丢失分区内的所有消息。发生这种情况时,以下日志为常量: [2020-04-27 10:36:40,386] INFO [Log partition=test-lost-messages-5, dir=/var/kafkadata/data01/data

我们在ApacheKafka的2.3、2.4.0、2.4.1和2.5.0版本的主题中看到消息正在消失。当我们对集群进行滚动部署时,我们注意到了这一点,但不幸的是,这种情况并非每次都发生,因此非常不一致

有时我们会丢失一个主题内的所有消息,有时我们会丢失分区内的所有消息。发生这种情况时,以下日志为常量:

[2020-04-27 10:36:40,386] INFO [Log partition=test-lost-messages-5, dir=/var/kafkadata/data01/data] Deleting segments List(LogSegment(baseOffset=6, size=728, lastModifiedTime=1587978859000, largestTime=0)) (kafka.log.Log)
还有一个以前的日志说,该段的保留时间超过了24小时。在本例中,消息是在部署前约12分钟生成的

请注意,所有错误删除的消息都有
largestTime=0
,而正确删除的消息都有一个有效的时间戳。从我们从文档和代码中所读到的内容来看,
largestTime
似乎用于计算给定段是否达到时间延迟

因为我们可以在卡夫卡的多个版本中观察到这一点,我们认为这可能与卡夫卡之外的任何东西有关。例如动物园管理员


有人知道为什么会发生这种情况吗?我们正在使用Zookeeper 3.6.0。

确保所有Kafka代理和Zookeeper节点之间的日期同步。
Bash命令:
date


比较年份、日期、小时和分钟。

确保所有卡夫卡代理和ZooKeeper节点之间的日期同步。
Bash命令:
date


比较年份、日期、小时和分钟。

我们发现原因与卡夫卡本身无关,而是与我们存储日志的数量有关。不过,以下解释可能对教育目的有用:

具体来说,这是一个权限问题,当触发日志清理器时,Kafka无法读取
.timeindex
文件这导致
largestTime
0
,并导致一些邮件在保留时间之前被删除。

每个主题分区分为几个部分,最后一个部分存储在包含实际消息的不同
.log
文件中。对于每个
.log
文件,都有一个
.timeindex
文件,其中包含偏移量和
lastModifiedTime
之间的映射

当Kafka需要检查某个段是否可删除时,它会搜索最近的偏移量
lastModifiedTime
,并将其存储为最长时间。然后,检查是否达到保留限制:
currentTime-largestTime>retentionTime

如果是,则删除该段和相应的消息


由于卡夫卡无法读取该文件,
largestTime
0
,并且检查
currentTime>retentionTime
对于我们的1天保留期始终是正确的。

我们发现原因与卡夫卡本身无关,而是与我们存储日志的卷有关。不过,以下解释可能对教育目的有用:

具体来说,这是一个权限问题,当触发日志清理器时,Kafka无法读取
.timeindex
文件这导致
largestTime
0
,并导致一些邮件在保留时间之前被删除。

每个主题分区分为几个部分,最后一个部分存储在包含实际消息的不同
.log
文件中。对于每个
.log
文件,都有一个
.timeindex
文件,其中包含偏移量和
lastModifiedTime
之间的映射

当Kafka需要检查某个段是否可删除时,它会搜索最近的偏移量
lastModifiedTime
,并将其存储为最长时间。然后,检查是否达到保留限制:
currentTime-largestTime>retentionTime

如果是,则删除该段和相应的消息

由于卡夫卡无法读取该文件,
largestTime
0
,并且检查
currentTime>retentionTime
对于我们的1天保留期始终为真