Kafka 分区中的时间戳序列

问题描述

我有一个带有 Kafka 集群的分布式系统。 Kafka 主题的复制因子为 2 或 3,如文档所建议的那样。一个分区的数据可以从多个类似的生产者写入。

我知道两种按时间戳标记消息的方法:生产者端和代理端 (message.timestamp.type)。但是没有办法在机器之间理想地同步系统时间(与生产者或经纪人无关)。

如果我使用 message.timestamp.type=LogAppendTime,同一分区内的数据将在任何特定代理范围内按时间戳排序,但消费者从其中的 2 或 3 个中读取。

总结:

  1. 有没有办法构建这样一个系统,其中有许多生产者且 RF > 1,单个分区内的数据(或至少单个分区键下的数据)将始终具有增加(最好说不减少)的时间戳消费者的观点?
  2. 如果第 1 页的答案是“否”,它是否至少适用于偏移量?不同broker中相同消息的副本是否具有相同的偏移值?如果消费者依赖于始终增加每个分区的偏移值,我们是否应该在消费者中明确处理“一个代理失败”的情况?还是 Kafka 为我们无缝处理?

解决方法

关于偏移

是的,它们总是单调递增。每个分区都有一个领导副本,它分配偏移量。追随者经纪人复制具有已分配偏移量的消息。 即使在领导者代理失败的情况下,消费者也会收到单调递增的抵消

Kafka 文档中对此进行了描述4.7 Replication

follower 上的日志与 leader 上的日志相同——都具有相同的偏移量和相同顺序的消息。

关于时间戳,如果是 message.timestamp.type=LogAppendTime

我在 Kafka 文档中找不到,追随者经纪人是覆盖时间戳还是使用领导者的时间戳。但是,我在 Kafka 0.10.0.0 中找到了 improvement proposal,其中 was implemented

当leader broker收到消息时,消息中的时间戳会被覆盖为当前服务器时间。当一个follower broker收到一条消息时,这条消息的时间戳会被用来建立时间索引。

所以,时间戳是由领导者分配的,在追随者上是不变的。如果broker失败,前follower开始根据本地时间分配时间戳。由于 Broker 之间的本地时间无法理想地同步,在分区领导权转移时,时间戳可能会出现负偏移