卡夫卡镜子制造商的行为

时间:2018-09-19 10:47:41

标签: apache-kafka

说,我们有两个数据中心DC1和DC2。我正在使用Kafka mirror maker将kafka数据从DC1镜像到DC2。只有DC1处于活动状态,一旦DC1断开,DC2将变为活动状态。

据我所知,kafka主题和偏移量主题都将镜像到DC2。

例如,我在DC1中产生了100 msgs到T1,并且已经将大约80 msgs镜像到了DC2。在DC1中,我已经消耗了大约90毫秒。现在DC1掉线了,我正在从DC2消耗电。我的消费者请求是获取第91条消息。但是只有80消息已被镜像。在这种情况下会发生什么?由于所需的偏移量不可用,因此该偏移量是否会与auto.offset.reset值保持一致。

在另一种情况下,假设我从DC1消耗了90 msg,但所有100 msg已被镜像到DC2。在这种情况下,如果我开始从DC2消耗能量,那么将重复10 msgs,对吗?

处理成功后,如果偏移主题镜像未完成,会发生什么?

1 个答案:

答案 0 :(得分:2)

镜像制作者不复制偏移量。源和目标都可以具有不同数量的分区和不同的偏移量。

如果要确保在DC2上交付一次即可且没有数据丢失,则需要正确配置producer和consumer.properties。

在某些有效情况下,当使用者使用源中的某些记录但生产者无法写入目标时,则可以使用。在这种情况下,如果将“ enable.auto.commit”设置为true,则即使事件未写入目的地,它也会定期提交偏移量。因此,为避免这种情况,应将其设置为false。

确保没有数据丢失:

在Consumer.properties中:已设置enable.auto.commit=false

在生产者中,添加以下属性:

max.in.flight.requests.per.connection=1
retries=Int.MaxValue
acks=-1
block.on.buffer.full=true

对于mirrorMaker,设置--abortOnSendFail

以下是镜子制造商的一些最佳做法。

https://community.hortonworks.com/articles/79891/kafka-mirror-maker-best-practices.html

关于在目标群集上运行的使用者,他们不在乎从源群集消耗了多少记录。他们有自己的consumer_offsets。因此,在第一次运行时,它从0偏移开始,然后从您消耗的最后一个偏移中读取下一次运行。

如果要从偏移量0读取,则始终可以将“ auto.offset.reset ”设置为“最早”