Kafka MirrorMaker1集群间切换后切回数据未同步
- kafka版本 0.10.0.1
- zookeeper版本 3.4.6
测试内容
AB两个集群,从A同步到B,从B同步到A,切回从A同步到B 使用mirrormaker做集群数据同步
步骤
A集群同步到B集群
1、配置
A集群配置
consumer.config
zookeeper.connect=127.0.0.1:2181
bootstrap.servers=192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092 #A集群地址
group.id=mirrormaker
auto.offset.reset=earliest
producer.config
bootstrap.servers=192.168.10.16:9092,192.168.10.17:9092,192.168.10.18:9092 #B集群地址
2、启动命令
./bin/kafka-mirror-maker.sh --new.consumer --consumer.config config/consumer.config --num.streams 1 --producer.config config/producer.config --whitelist 'ABTestMsg'
3、A集群使用kafka-producer-perf-test脚本模拟发送10000条消息
4、验证B集群同步成功10000条
停掉A集群mirrormaker切换B同步A
1、配置
B集群配置
consumer.config
zookeeper.connect=127.0.0.1:2181
bootstrap.servers=192.168.10.16:9092,192.168.10.17:9092,192.168.10.18:9092 #B 集群地址
group.id=mirrormaker
auto.offset.reset=latest
producer.config
bootstrap.servers=192.168.10.13:9092,192.168.10.14:9092,192.168.10.15:9092 #A集群地址
2、启动命令
./bin/kafka-mirror-maker.sh --new.consumer --consumer.config config/consumer.config --num.streams 1 --producer.config config/producer.config --whitelist 'ABTestMsg'
3、B集群使用kafka-producer-perf-test
脚本模拟发送10000条消息
4、验证A集群同步成功10000条 AB集群partition Latest offset 20000
停掉B切回A集群
1、停掉B集群
2、启动命令
./bin/kafka-mirror-maker.sh --new.consumer --consumer.config config/consumer.config --num.streams 1 --producer.config config/producer.config --whitelist 'ABTestMsg'
3、验证 A集群partition Latest offset 20000 B集群partition Latest offset 30000
问题
在切回A集群后,启动mirrormaker, B集群多出了10000条。
首先,镜像同步2个集群之间的offset完全是独立的,是不一样的,可查看镜像集群之间的数据下面的评论。
那我们来分析一下你的情况。
1、A->B,ok没问题,这个时候创建了
group.id=mirrormaker
,从此刻开始,A->B如果有新的未同步的消息,就知道了。2、B->A,ok没问题,同时创建了
group.id=mirrormaker
,从此刻开始,B->A未同步的消息,就知道了,(因为是刚创建的group.id=mirrormaker
,所以之前A发给B的消息不会在重新发给A)。3、当你启动A的时候,A因为记录了
group.id=mirrormaker
,发现新的10000条消息(重点,kafka认为这10000个消息是新的,不管来自哪里),这个时候A将这新收到的10000条消息,发送给B。A为什么还要记录group.id=mirrormaker呢?发现新的10000条消息是我B->A的吧 起A的时候然后它认为新增了10000条然后又同步过去了是这样么? 我该如何解决呢
group.id=mirrormaker
是消费者组,这kafka的基础,MirrorMaker的底层功能,也是作为消费者组,将数据传输到B的。你每次启动它的时候,换个消费者组名字就不会发了。
我想不到其他的办法了(因为本身同一时刻,只有一个kafka集群提供服务)。
你的答案