为什么根据时间戳获取topic的offset为空呢

浩客2年前技术文章850

一、前言

最近有一个需求,要查询某一时间戳对应的offset值,于是就想到了使用 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --time <timestamp> ,但是我在测试的时候,发现有的时间戳会获取不到offset,是空。但是明明指定的时间戳有上报数据,肯定有对应的 offset 的。

11111111.png

2222222222.png


二、解惑

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list message-1:9092 -topic test --time 后面的参数可以是 -1、-2、时间戳,其中 -1 会输出最新的 offset ;-2 会输出未过期最小的 offset ;时间戳这里具有迷惑性,它不能根据时间戳获取到精准匹配的 offset 。

Kafka 将数据存储在 “log segments” 里面,log segments 文件的大小受 log.segment.bytes 影响,默认为 1073741824 字节,也就是 1G 。当数据文件累积到 log.segment.bytes 的值以后,就会创建出新的日志文件,文件名称以分段时的那个 offset 命名,如下图所示:

3333.png


每一个 xxx.log 文件都算作一个 segment,kafka.tools.GetOffsetShell --time 参数匹配的是 xxx.log 文件本身最后的修改时间,而不是偏移量本身的时间戳。

根据上面图片,举几个例子:

  • 当 time 为 2020-09-16 11:59:20 时,获取的 offset 值为空。

  • 当 time 大于等于 2020-09-16 12:00:20 并且 time 小于 2020-09-16 14:09:24 时,获取的 offset 值为 0,匹配的是 xxx.log 文件名称的那个 offset 。

  • 当 time 大于等于 2020-09-16 14:09:24 时,获取的 offset 值为 1049942,匹配的是 xxx.log 文件名称的那个 offset 。

  • 当 time 远大于 2020-09-16 14:09:24 时,获取的 offset 值为最新的 offset 值。

根据以上实践结果得知,一组时间戳均对应着同一个 offset 。所以这个命令 --time <timestamp> 只能匹配个大概的 offset 而已,无法精确。


相关文章

RBAC

RBAC

API 对象在学习 RBAC 之前,我们还需要再去理解下 Kubernetes 集群中的对象,我们知道,在 Kubernetes 集群中,Kubernetes 对象是我们持久化的实体,就是最终存入 e...

MySQL 8.0 新特性:Clone Plugin

MySQL 8.0 新特性:Clone Plugin

一、前言MySQL 在 8.0.17 加入了克隆插件,可以从本地或者远程克隆数据,比如需要创建主从关系,我们一般都是通过物理备份来做,那如果你使用的是 MySQL 8.0.17 及以上的版本那么就可以...

Pod终止-preStop

由于 Pod 所代表的是在集群中节点上运行的进程,当不再需要这些进程时允许其体面地 终止一般不应武断地使用 KILL 信号终止它们设计的目标是令你能够请求删除进程,并且知道进程何时被终止,同时也能够确...

如何用 mysqldump 备份数据

前言mysqldump 是 MySQL 官方提供的一款逻辑备份工具,它将生成一组可以导入数据 库中以重现原始数据库中的数据和数据库对象的SQL语句。可用于备份恢复、表结构导出、备份上云。本 SOP 介...

K8s Pod无法访问SLB地址

K8s Pod无法访问SLB地址

一、问题现象客户反馈172.16.11.220 telnet 47.99.87.129 80 不通,另一台172.16.11.219可以通。二、排查思路172.16.11.220,172.16.11....

Nginx实现数据库端口转发

一、需求客户想要将IDC服务器的数据库端口暴漏在公网上,然后其他业务来调数据库接口。为了保证安全,只开放指定的公网ip访问。二、逻辑设计由于客户的IDC服务器与云ECS服务器通过专线打通,所以只需要在...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。