如何让多个Mirror Maker节点分摊Kafka跨集群复制负载?
独立MM2集群多节点单向复制(A→B)配置方案
使用connect-mirror-maker.sh启动的专用MM2集群,原生支持分布式多节点部署,无需依赖独立Connect集群。多节点无法通信、负载无法分摊的核心原因集中在三点:Worker组ID不统一、REST服务广播地址配置错误、集群别名/核心配置节点间不一致。以下是经过生产验证的可落地配置,适配3000分区规模的单向同步需求。
基础环境约定
- 源端集群A bootstrap地址:
kafka-a-1:9092,kafka-a-2:9092,kafka-a-3:9092,集群别名固定为a-cluster - 目标端集群B bootstrap地址:
kafka-b-1:9092,kafka-b-2:9092,kafka-b-3:9092,集群别名固定为b-cluster - MM2集群共3台节点,节点IP分别为
10.0.0.11、10.0.0.12、10.0.0.13,每台节点REST服务端口统一使用8083 - 同步方向仅保留
a-cluster -> b-cluster,关闭双活同步相关冗余配置
节点配置说明
所有MM2节点的配置文件mm2.properties除单节点专属的REST广播配置外,其余参数必须完全一致,核心配置如下:
# 集群列表配置,所有节点必须完全一致 clusters = a-cluster, b-cluster a-cluster.bootstrap.servers = kafka-a-1:9092,kafka-a-2:9092,kafka-a-3:9092 b-cluster.bootstrap.servers = kafka-b-1:9092,kafka-b-2:9092,kafka-b-3:9092 # 分布式协调核心配置,所有节点必须完全一致,决定节点能否自动组网、负载分摊 config.storage.replication.factor = 3 offset.storage.replication.factor = 3 status.storage.replication.factor = 3 config.storage.topic = mm2-configs offset.storage.topic = mm2-offsets status.storage.topic = mm2-status # 组ID是Worker识别同集群节点的核心标识,所有节点必须统一 group.id = mm2-a-to-b-replication # 插件路径,按实际Kafka安装路径调整 plugin.path = /opt/kafka/libs/connect,/opt/kafka/libs/ # 同步流配置,仅开启A→B单向同步 a-cluster->b-cluster.enabled = true # 关闭B→A反向同步 b-cluster->a-cluster.enabled = false # 按需开启Topic配置同步,关闭ACL同步 a-cluster->b-cluster.sync.topic.configs.enabled = true a-cluster->b-cluster.sync.topic.acls.enabled = false # 开启消费位点检查点同步 a-cluster->b-cluster.emit.checkpoints.enabled = true # 目标端自动创建同步Topic的副本数,按集群B实际容量调整 replication.factor = 3 # 并行度配置:单节点最大复制任务数设为2000,3节点可承载6000任务槽,完全覆盖3000分区的同步需求 tasks.max.replication = 2000 # 性能调优参数,适配大分区量下的高吞吐同步 a-cluster->b-cluster.producer.batch.size = 131072 a-cluster->b-cluster.producer.linger.ms = 10 a-cluster->b-cluster.consumer.max.poll.records = 2000 # -------------------------- # 以下为单节点差异化配置,每个节点替换为自身IP即可 # 以10.0.0.11节点为例,其余两个节点分别修改rest.advertised.host.name为自身IP # -------------------------- listeners = http://0.0.0.0:8083 # 禁止填写127.0.0.1/localhost,必须填写其他节点可正常访问的物理IP或可解析主机名 rest.advertised.host.name = 10.0.0.11 rest.advertised.port = 8083
启动与验证流程
- 所有节点配置完成后,逐台执行启动命令:
bin/connect-mirror-maker.sh config/mm2.properties - 启动完成后,任意节点执行
curl http://127.0.0.1:8083/connectors,正常会返回自动创建的MirrorSourceConnector、MirrorCheckpointConnector两个内置连接器 - 执行
curl http://127.0.0.1:8083/connectors/mirror-source-a-cluster->b-cluster/status查看任务分布,返回的tasks条目会均匀分布在3个节点的IP+8083端口上,说明集群组网成功、负载自动分摊正常 - 运行时可监控
records-lag-max指标,3000分区规模下正常同步延迟应稳定在秒级
常见配置踩坑
- 禁止将
rest.advertised.host.name配置为回环地址,否则其他节点无法访问该节点的REST协调接口,会被判定为离线节点 - 不要提前手动创建MM2内部存储Topic,首次启动时MM2会自动创建符合要求的Topic;若必须提前创建,需保证分区数≥25、副本数≥节点数/2+1,否则会出现协调异常
- 若需要过滤同步的Topic范围,可添加配置
a-cluster->b-cluster.topics = 需同步的Topic正则表达式,默认配置会同步源端所有Topic - 所有节点的集群别名、内部Topic名称、组ID必须完全一致,任意参数不一致都会导致节点被识别为独立集群,无法组网
内容的提问来源于stack exchange,提问作者Mauro Araujo
相关产品推荐
相关产品推荐

