如何配置不同虚拟机上的两个Docker化Kafka集群互见主题?
Kafka跨集群双向主题同步配置方案
要实现两个Kafka集群互相显示对方的主题,核心是完成主题元数据与消息的双向同步,官方推荐使用Kafka MirrorMaker 2.0实现,以下是适配你环境的具体操作步骤:
1. 确认集群网络与基础配置
你已验证过两个集群可互相访问,只需确保每个集群的Kafka服务对外地址配置正确:
- Windows集群(192.168.2.22)的docker-compose.yml中,修改kafka1服务的环境变量:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,PLAINTEXT_HOST://192.168.2.22:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT - Linux集群(192.168.94.130)同理修改:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,PLAINTEXT_HOST://192.168.94.130:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
修改后重启两个集群的Kafka服务:
# Windows集群执行 docker-compose restart kafka1 # Linux集群执行 docker-compose restart kafka1
2. 部署Kafka Connect(集成MirrorMaker 2插件)
选择Linux集群部署Kafka Connect服务(也可选择Windows集群,只要能访问两个集群即可),在Linux的docker-compose.yml中添加以下服务:
connect: image: confluentinc/cp-kafka-connect:7.4.0 container_name: connect depends_on: - kafka1 ports: - "8083:8083" environment: CONNECT_BOOTSTRAP_SERVERS: "192.168.94.130:9092" CONNECT_REST_ADVERTISED_HOST_NAME: connect CONNECT_GROUP_ID: connect-mirror-group CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status CONNECT_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter CONNECT_KEY_CONVERTER_SCHEMAS_ENABLE: false CONNECT_VALUE_CONVERTER_SCHEMAS_ENABLE: false CONNECT_INTERNAL_KEY_CONVERTER: "org.apache.kafka.connect.json.JsonConverter" CONNECT_INTERNAL_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter" CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components" CONNECT_LOG4J_LOGGERS: org.apache.kafka.connect.runtime.rest=WARN,org.reflections=ERROR
启动Connect服务:
docker-compose up -d connect
3. 创建双向同步连接器
3.1 同步Windows集群主题到Linux集群
执行curl命令创建同步连接器:
curl -X POST -H "Content-Type: application/json" --data '{ "name": "mirror-windows-to-linux", "config": { "connector.class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", "tasks.max": "1", "source.cluster.alias": "windows", "source.bootstrap.servers": "192.168.2.22:9092", "target.cluster.alias": "linux", "target.bootstrap.servers": "192.168.94.130:9092", "topics": "my-Windows-Topic-1", "topic.prefix": "", "sync.topic.configs": "true", "sync.topic.acls": "true" } }' http://192.168.94.130:8083/connectors
3.2 同步Linux集群主题到Windows集群
执行curl命令创建反向同步连接器:
curl -X POST -H "Content-Type: application/json" --data '{ "name": "mirror-linux-to-windows", "config": { "connector.class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", "tasks.max": "1", "source.cluster.alias": "linux", "source.bootstrap.servers": "192.168.94.130:9092", "target.cluster.alias": "windows", "target.bootstrap.servers": "192.168.2.22:9092", "topics": "my-Linux-Topic", "topic.prefix": "", "sync.topic.configs": "true", "sync.topic.acls": "true" } }' http://192.168.94.130:8083/connectors
4. 验证同步效果
- 在Windows集群查看主题列表:
docker exec kafka1 kafka-topics --bootstrap-server localhost:9092 --list
应返回my-Windows-Topic-1和my-Linux-Topic
- 在Linux集群查看主题列表:
docker exec kafka1 kafka-topics --bootstrap-server localhost:9092 --list
应返回my-Linux-Topic和my-Windows-Topic-1
- 额外测试消息同步:在Windows集群发送消息到
my-Windows-Topic-1,在Linux集群消费;在Linux集群发送消息到my-Linux-Topic,在Windows集群消费,确认消息可正常跨集群传递。
关键注意事项
- 若需同步所有主题,可将
topics字段改为.*,但建议明确指定主题以避免不必要的资源消耗。 - 确保两个集群的Kafka版本一致,避免兼容性问题。
- 同步主题配置时,若目标集群的默认副本数、分区数与源集群不同,需提前调整目标集群的默认配置,或修改
sync.topic.configs参数控制同步范围。
内容的提问来源于stack exchange,提问作者debo
相关产品推荐
相关产品推荐

