#作者:张桐瑞
文章目录
1概述
MirrorMaker2(后文简称 MM2)在 2019 年 12 月随 Kafka 2.4.0 一起推出。顾名思义,是为了解决 Kafka 集群之间数据复制和数据同步的问题而诞生的 Kafka 官方的数据复制工具。在实际生产中,经常被用来实现 Kafka 数据的备份,迁移和灾备等目的。
1.1使用场景
Kafka MM2适用于下列场景:
- 远程数据同步:通过MM2,Kafka数据可以在不同地域的集群进行传输复制。
- 灾备场景:通过MM#2,可以构建不同数据中心的主备两个集群容灾架构,MM2同步两个集群的数据。当其中一个集群不可用时,可以将上面的应用程序切换到另一个集群,从而实现异地容灾功能。
- 数据迁移场景:在业务上云、混合云、集群升级等场景,存在数据从旧集群迁移到新集群的需求。此时,您可以使用MM2实现新旧数据的迁移,保证业务的连续性。
- 聚合数据中心场景:通过MM2,可以将多个Kafka子集群的数据同步到一个中心Kafka集群,实现数据的汇聚。
1.2核心架构
MirrorMaker 2 基于 Kafka Connect 框架构建,该框架为数据复制提供了一个分布式、容错的基础架构。与使用简单消费者-生产者对的初代 MirrorMaker 不同,MM2 采用专门的连接器来处理复制过程的不同方面。
MM2 的核心是由一系列协同工作的 Connectors 组成的,主要包括四个:
- MirrorSourceConnector:负责从源集群(Source Cluster)消费消息,并将其生产到目标集群(Target Cluster)。
- MirrorCheckpointConnector:负责将源集群中的消费者组(Consumer Group)的消费位移(Offset)同步到目标集群,并以检查点(Checkpoint)的形式记录下来。这对于实现消费者应用的容灾切换至关重要。
- MirrorHeartbeatConnector:会定期在源集群和目标集群之间发送心跳消息(写入统一命名的内部 Topic heartbeats),用于监控两个集群之间的连接状态和端到端的数据同步延迟。
- MirrorSinkConnector:当你需要把某个远程主题再写回本地集群、或在聚合集群中汇总多源数据时,就需要它登场;和 MirrorSourceConnector 的方向恰好相反。

1.3功能
Kafka MM2作为数据复制工具,具有以下功能:
- 复制topics数据以及配置信息。
- 复制consumer groups及其消费topic的offset信息。
- 复制ACLs。
- 自动检测新的topic以及partition。
- 提供MM2的metrics。
- 高可用以及可水平扩展的框架。
1.4使用限制
- 为保证生产集群的数据完整和安全,必须先在测试集群进行模拟测试
- 源集群与目标集群的Kafka软件版本为2.12_2.4.1及以上。
- MM2 迁移任务会增加CPU和内存的占用,需根据集群资源负载情况,进行迁移任务,防止因资源抢占导致业务出现中断。
2迁移集群配置说明
2.1关键参数
2.1.1listeners
作用:Broker 实际监听的地址(绑定哪块网卡、哪个端口)。
格式:LISTENER_NAME://host:port(可多个,用逗号分隔)
例:listeners=PLAINTEXT://0.0.0.0:9092(所有网卡都监听 9092)。
2.1.2advertised.listeners
作用:Broker 对外"公布"的地址,客户端真正用来连的地址。
典型用途: 容器 / 云环境中,Broker 监听的是容器内网 IP,但要公布成宿主机公网 IP / 域名。
例:advertised.listeners=INTERNAL://域名:9092,EXTERNAL:// 公网IP:9093
注意: 不能用 0.0.0.0,必须是真实 IP 或域名,不配时,默认等于 listeners 的值。
2.1.3listener.security.protocol.map
作用:把监听器名称映射到安全协议,例如 PLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL。
格式:NAME:PROTOCOL,NAME2:PROTOCOL2。
例:listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
2.1.4inter.broker.listener.name
作用:指定 Broker 之间复制 / 内部通信用哪个 Listener 名称。一般设成走内网的那个,
例:inter.broker.listener.name=INTERNAL
2.2内外网多地址配置方案
2.2.1配置文件参数说明
两集群均需新增可通信地址,并将地址配置在advertised.listeners中,且
假设每个 Kafka 节点有:
-
内网 IP
-
外网 IP(或端口映射后对外 IP)
#################### Listener 相关 ####################
实际监听的地址(绑定网卡)------内网 + 外网 + controller
listeners=INTERNAL:// 内网ip或域名:9092,EXTERNAL:// 公网IP:9093,CONTROLLER:// 内网ip或域名:9094
每个 listener 使用的安全协议,这里全部明文,可按需改成 SSL / SASL
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT
对外公布的地址:内网业务用内网 IP,外网业务用公网 IP
advertised.listeners=INTERNAL://内网ip或域名:9092,EXTERNAL://公网IP:9093
Broker 间复制统一走内网
inter.broker.listener.name=INTERNAL
Controller 使用的 listener 名称,要在 listeners 中存在
controller.listener.names=CONTROLLER
客户端连接方式:
内网程序:bootstrap.servers=内网ip或域名:9092
外网程序:bootstrap.servers=内网ip或域名:9093
注:集群中每个节点都按此模板修改对应的 IP、端口。
2.2.2网络打通说明
如果进行源集群进行向目标集群的数据迁移,则需要能够连接目标集群全部kafka节点的advertised.listeners配置的地址。
如果进行源集群和目标集群的双向数据迁移,则需要两集群都需要能够正常连接advertised.listeners配置的地址。
2.2.3容器环境变量配置
在kubernetes环境下,需要添加或更改如下配置,外部环境并使用NodePort进行访问,需要打通网络,并将localhost更改为打通网络地址。
2.2.3.1控制器ENV配置
env:
- name: KAFKA_CFG_LISTENERS
value: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
- name: KAFKA_CFG_ADVERTISED_LISTENERS
value: PLAINTEXT://KafkaPod域名:9092,EXTERNAL://localhost:9094
- name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP
value: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
2.2.3.2外部访问 Service(NodePort)
apiVersion: v1
kind: Service
metadata:
name: kafka-external
spec:
type: NodePort
selector:
app: kafka
ports:
- name: external
port: 29092
targetPort: 29092
nodePort: 29092