我想知道有人可以解释实际上__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.ms
到60s
,并且在杀戮之间等了几分钟。但这似乎没有帮助。由于__consumer_offsets
包含更多的commiteed值,为什么在不干净的关闭后将偏移量设置为264458
答案 0 :(得分:0)
显然这是kafka 0.11.0.0和0.11.0.1修复的问题。
更多信息[KAFKA-5600] - Group loading regression causing stale metadata/offsets cache