说,我们有两个数据中心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,对吗?
处理成功后,如果偏移主题镜像未完成,会发生什么?
答案 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 ”设置为“最早”