【发布时间】:2019-01-30 20:51:09
【问题描述】:
按照这里提到的解决方案kafka-mirror-maker-failing-to-replicate-consumer-offset-topic。我能够跨 DC1(Live Kafka 集群)和 DC2(Backup Kafka 集群)集群启动镜像制作器而没有任何错误。
看起来它还能够从 DC1 集群跨 DC2 集群同步 __consumer_offsets 主题。
问题
如果我关闭 DC1 的消费者并将相同的消费者(相同的 group_id)指向 DC2,即使镜像制造商能够同步此主题和分区的偏移量,它也会再次读取相同的消息。
我可以看到 LOG-END-OFFSET 显示正确,但 CURRENT-OFFSET 仍然指向导致 LAG 的旧。
示例
- Mirror Maker 仍在 DC2 中运行。
-
消费者在 DC1 中关闭之前
//DC1 __consumer_offsets topic +-----------------------------------------------------------------+ | TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG | +-----------------------------------------------------------------+ | gs.suraj.test.1 0 10626 10626 0 | | gs.suraj.test.1 2 10619 10619 0 | | gs.suraj.test.1 1 10598 10598 0 | +-----------------------------------------------------------------+ 在 DC1 中停止消费者
-
消费者在 DC2 中启动之前
//DC2 __consumer_offsets topic +-----------------------------------------------------------------+ | TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG | +-----------------------------------------------------------------+ | gs.suraj.test.1 0 9098 10614 1516 | | gs.suraj.test.1 2 9098 10614 1516 | | gs.suraj.test.1 1 9098 10615 1517 | +-----------------------------------------------------------------+
由于这种滞后,当我在 DC2 中启动相同的消费者时再次读取 4549 条消息,这不应该发生,因为它已经在 DC1 中读取了一个提交,并且镜像制造商已将 __consumer_offsets 主题从 DC1 同步到 DC2
如果我在这里遗漏了什么,请告诉我。
【问题讨论】:
-
这可能很奇怪,但也许镜像制造商使用的生产者没有填充他的 batch.size 参数,即使它调用了 producer(),该消息仍然存在他的缓冲区?
-
不这么认为,因为每当来自 DC1 的消费者提交偏移量时(在消费消息之后),我可以看到 DC2 _consumer_offset 主题的活动以及该消费者的新偏移量和元数据。
-
注意:复制偏移量主题并不是一个好主意,因为不能保证 clusterA 的偏移量在 clusterB 上是相同的。另外,MirrorMaker 没有一次性保证
-
我同意这一点,但我不知道任何其他解决方案可以在灾难恢复期间无需人工干预的情况下将消费者偏移量重置到 DC2(备份集群)上每个分区的某个时间点。因此,我认为复制 _consumer_offsets 主题将是一个很好的解决方案。
-
@cricket_007 这个问题应该由 MirrorMaker 2.0 解决,对吗? cwiki.apache.org/confluence/display/KAFKA/…mirror-maker 脚本默认在哪里开始跨集群同步消费者偏移量?
标签: apache-kafka kafka-consumer-api disaster-recovery