kafka __consumer_offsets和不干净关机?

时间:2017-10-12 13:42:08

标签: apache-kafka

我想知道有人可以解释实际上__consumer_offsets是如何工作的吗? 出于测试目的,我有kafka 0.11.0.0的单个实例使用这些被覆盖的设置:

offsets.topic.replication.factor=1
broker.id=0
offsets.retention.minutes=43200
log.flush.scheduler.interval.ms=60000
log.retention.hours=720 
log.flush.interval.ms=60000
log.retention.check.interval.ms=300000
log.segment.bytes=1073741824

我有一个名为pigeon的消费者。

一切正常,直到我在kafka服务器上执行kill -9(不干净关机)。之后,客户似乎失去了抵消。

kill -9

之前

从客户端登录(使用kafka-reactive):

2017-10-12 13:08:32.960 [DEBUG] o.a.k.c.c.i.ConsumerCoordinator - Group pigeon committed offset 275620 for partition ClusterEvents-0

查看ConsumerGroupCommand

# ./kafka-run-class.sh kafka.admin.ConsumerGroupCommand --bootstrap-server localhost:9092  --group pigeon --new-consumer --describe`
TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG        CONSUMER-ID                                       HOST                           CLIENT-ID
ClusterEvents                  0          275620          275620          0          pigeon-1507813552573-b3c74e75-04c1-48d0-bf5a-b66c203861aa/10.84.2.238                   pigeon-1507813552573

并查看__consumer_offsets

#./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic __consumer_offsets --from-beginning --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" | grep pigeon
[pigeon,ClusterEvents,0]::[OffsetMetadata[264458,NO_METADATA],CommitTime 1507285596838,ExpirationTime 1509877596838]
<.....>
[pigeon,ClusterEvents,0]::[OffsetMetadata[275620,NO_METADATA],CommitTime 1507813712886,ExpirationTime 1510405712886]

因此__consumer_offsets第一个偏移量为264458,我们可以看到275620偏移量已提交

kill -9之后:

现在让我们对kafka进程执行kill -9,而kafka停止运行,停止使用者,在kafka重启之后让我们看看相同的数据:

# ./kafka-run-class.sh kafka.admin.ConsumerGroupCommand --bootstrap-server localhost:9092  --group pigeon --new-consumer --describe`
TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG        CONSUMER-ID                                       HOST                           CLIENT-ID
ClusterEvents                  0          264458          275645          11187      -                                                 -                              -


#./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic __consumer_offsets --from-beginning --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" | grep pigeon
[pigeon,ClusterEvents,0]::[OffsetMetadata[264458,NO_METADATA],CommitTime 1507285596838,ExpirationTime 1509877596838]
<.....>
[pigeon,ClusterEvents,0]::[OffsetMetadata[275620,NO_METADATA],CommitTime 1507813712886,ExpirationTime 1510405712886]

因此虽然__consumer_offsets包含相同的信息,但提交的偏移量为275620,但ConsumerGroupCommand报告当前偏移量为264458。为什么?

__consumer_offsets如何实际运作?

如果我重新启动使用者,它将从偏移264458开始消耗,提交最新的偏移量,我可以再次对kafka执行kill -9,它将从264458 <开始消耗/ p>

我是否误解了这应该如何运作?起初,我认为这是由于日志更改没有被磁盘化,所以我减少了 log.flush.interval.ms60s,并且在杀戮之间等了几分钟。但这似乎没有帮助。由于__consumer_offsets包含更多的commiteed值,为什么在不干净的关闭后将偏移量设置为264458

1 个答案:

答案 0 :(得分:0)

显然这是kafka 0.11.0.0和0.11.0.1修复的问题。

更多信息[KAFKA-5600] - Group loading regression causing stale metadata/offsets cache