Kafka MirrorMaker 2双活配置下如何避免主题加集群前缀且防止循环复制
MirrorMaker 2无主题前缀双活同步防循环复制方案
循环复制的根本原因是去掉前缀后,双向同步的MM2实例会把对方同步过来的同主题消息再次回传,形成无限循环。无需前缀的前提下,有三种成熟的落地方案:
方案1:使用官方原生IdentityReplicationPolicy(Kafka 2.8+ 推荐)
Kafka 2.8及以上版本的MM2自带了专门的无前缀复制策略,内置循环检测逻辑,无需自定义开发:
- 替换默认复制策略为
IdentityReplicationPolicy,这个策略原生不会给同步主题加任何集群前缀 - 保留两个集群的别名配置,内置的循环防护逻辑会用别名做消息标记,识别已经被同步过的消息
- 参考配置:
replication.policy.class=org.apache.kafka.connect.mirror.IdentityReplicationPolicy clusters=clusterA,clusterB clusterA.alias=clusterA clusterB.alias=clusterB # 开启主题配置同步,确保策略生效 sync.topic.configs.enabled=true
方案2:按主题主写规则配置同步白/黑名单
如果你的双活架构是按主题划分主写集群的(比如topic1只在集群A生产,topic2只在集群B生产),可以直接通过排除规则阻断双向同步:
- 集群A到集群B的同步任务,排除所有集群B主写的主题
- 集群B到集群A的同步任务,排除所有集群A主写的主题
- 参考配置:
# 集群A→B同步配置 clusterA->clusterB.enabled=true clusterA->clusterB.exclude.topics=topic2,topic3.* # 匹配所有集群B主写的主题 # 集群B→A同步配置 clusterB->clusterA.enabled=true clusterB->clusterA.exclude.topics=topic1,topic4.* # 匹配所有集群A主写的主题
这个方案无需修改复制策略,完全基于原生配置实现,适合主题主写规则清晰的场景。
方案3:自定义消息拦截器标记过滤(低版本Kafka通用)
如果你的Kafka版本低于2.8,可以通过自定义拦截器实现消息标记和过滤,代码改动量很小:
- 实现自定义生产者拦截器,给所有MM2同步的消息加上固定Header,比如
mm2_replicated: true - 实现自定义消费者拦截器,消费时判断如果消息已经带有
mm2_replicated标记,就直接跳过这条消息不做同步 - 最后将两个拦截器分别配置到MM2的生产者和消费者参数中即可
这个方案完全不依赖前缀机制,适配所有版本的Kafka。
注意事项
- 不要直接修改默认
DefaultReplicationPolicy的replication.policy.separator参数为空,这个策略的设计本身依赖前缀区分源集群,硬改后很容易出现其他兼容问题 - 上线前务必用测试主题验证同步完整性、延迟和循环阻断逻辑,确认符合预期再全量接入
内容的提问来源于stack exchange,提问作者dykteip
相关产品推荐
相关产品推荐

