4、MirrorMaker 2.0安装:下载与解压、配置文件详解(mm2.properties)、启动与验证

好,到了真正动手的环节了。前面聊了那么多架构和原理,说白了都是为了这一刻——把 MirrorMaker 2.0 跑起来。我刚开始接触 MM2 的时候,觉得不就是个数据同步工具嘛,下载解压就能用。结果第一次配置就踩了坑,折腾了大半天。今天我把这些经验都揉碎了讲给你听,保证你少走弯路。

4.1 下载与解压:别选错版本

MirrorMaker 2.0 从 Apache Kafka 2.4.0 开始内置,所以你不必单独下载一个叫 "mirror-maker-2.0.tar.gz" 的东西。它就在 Kafka 的发布包里,路径是 ./libs/connect-mirror-client-*.jar。

我个人习惯去 Apache Kafka 官网 下载最新的稳定版。这里有个坑——千万别用 2.4.0 之前的版本,那些压根没有 MM2。我建议直接用 3.x 系列,功能更稳定,bug 也少很多。

版本选择建议:源集群和目标集群的 Kafka 版本最好一致,或者至少大版本相同。比如都是 3.x,别一个 2.8 一个 3.5,容易出兼容性问题。

下载解压的步骤很简单,我直接贴命令:

# 下载 Kafka(以 3.5.0 为例)
wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz

# 解压
tar -xzf kafka_2.13-3.5.0.tgz
cd kafka_2.13-3.5.0

# 确认 MM2 相关 jar 包存在
ls libs/ | grep connect-mirror
# 应该能看到类似 connect-mirror-client-3.5.0.jar 的文件

嗯,这里要注意:解压后别急着跑,先检查一下 libs/ 目录下有没有 connect-mirror 开头的 jar 包。如果没有,说明你下载的版本不对,或者包不完整。我曾经有一次下载了源码包而不是二进制包,折腾了半天才发现。

4.2 配置文件详解:mm2.properties 是核心

MM2 的灵魂就是 mm2.properties 配置文件。说白了,你告诉它「从哪读数据、写到哪去、同步哪些 topic、怎么处理冲突」,它就照做。我第一次看这个配置文件时觉得挺复杂,其实拆开来看就几个部分。

先看一个完整的示例配置,我拿实际项目里用过的改了一下:

# ========== 集群别名定义 ==========
clusters = source-cluster, target-cluster

# ========== 源集群连接信息 ==========
source-cluster.bootstrap.servers = 192.168.1.10:9092,192.168.1.11:9092
source-cluster.security.protocol = SASL_PLAINTEXT
source-cluster.sasl.mechanism = PLAIN
source-cluster.sasl.jaas.config = org.apache.kafka.common.security.plain.PlainLoginModule required \
    username="admin" \
    password="admin-secret";

# ========== 目标集群连接信息 ==========
target-cluster.bootstrap.servers = 192.168.2.10:9092,192.168.2.11:9092
target-cluster.security.protocol = SSL
target-cluster.ssl.truststore.location = /etc/kafka/truststore.jks
target-cluster.ssl.truststore.password = changeit

# ========== 同步哪些 topic ==========
topics = .*
# 排除内部 topic
topics.exclude = __consumer_offsets, __transaction_state

# ========== 同步配置 ==========
source->target.enabled = true
target->source.enabled = false

# ========== 复制策略 ==========
replication.policy.class = org.apache.kafka.connect.mirror.DefaultReplicationPolicy

# ========== 心跳检测 ==========
heartbeats.interval.seconds = 5

# ========== 偏移量同步 ==========
sync.topic.acls.enabled = false
sync.topic.configs.enabled = true
sync.topic.offsets.enabled = true

# ========== 消费者/生产者配置 ==========
source-cluster.consumer.max.poll.records = 500
target-cluster.producer.compression.type = snappy

这个配置看起来长,其实核心就几块。我画了个图帮你理解:

mm2.properties 配置结构 clusters 集群别名 source-cluster bootstrap.servers 安全认证配置 target-cluster bootstrap.servers SSL 证书配置 同步方向控制 source→target.enabled true / false 同步内容控制 topics 过滤 topics = .* topics.exclude = ... 偏移量同步 sync.topic.offsets sync.topic.configs 心跳检测 heartbeats.interval 默认 5 秒 replication.policy.class 复制策略 默认策略:源 topic 名 → 目标 topic 名添加 .source-cluster 后缀

配置里最关键的几个参数,我单独拎出来说说:

参数 作用 我的建议
clusters 定义集群别名,多个用逗号分隔 别名别用特殊字符,我习惯用 src 和 dst
topics 正则匹配要同步的 topic 刚开始用 .* 测试,上线前一定要加白名单
source->target.enabled 控制同步方向 双向同步要谨慎,我曾经遇到过数据回环
replication.policy.class topic 命名策略 默认策略会在目标集群给 topic 加后缀,比如 orders 变成 orders.source-cluster
heartbeats.interval.seconds 心跳检测间隔 默认 5 秒够用,别设太短,会增加网络开销
重点提醒:安全认证配置一定要写对。我见过太多人把 SASL 的用户名密码写错,或者 SSL 证书路径配错,结果 MM2 启动后一直报连接超时。建议先在源集群和目标集群上用普通的 console-consumer 测试一下连接是否正常。

4.3 启动与验证:三步走

配置写好了,怎么启动?其实就一条命令。但我建议你分三步走,每一步都验证一下,别一股脑全跑起来再排查。

第一步:检查配置

启动前先做一次「语法检查」。我个人习惯用 kafka-configs.sh 或者直接写个脚本校验配置文件的格式:

# 检查配置文件是否有明显的语法错误
# 比如等号两边有没有空格、引号是否成对
grep -n "=" mm2.properties | grep -v "^#" | head -20

# 检查必填项是否缺失
grep -E "^(clusters|topics|.*bootstrap.servers)" mm2.properties

嗯,这里要注意:mm2.properties 里等号两边不要加空格,比如 clusters = source, target 虽然也能解析,但有些旧版本会报错。我统一写成 clusters=source,target,省心。

第二步:启动 MirrorMaker 2.0

启动命令很简单,但参数别搞错:

# 启动 MM2(在 Kafka 目录下执行)
./bin/connect-mirror-maker.sh mm2.properties

# 如果想后台运行,加 nohup
nohup ./bin/connect-mirror-maker.sh mm2.properties > mm2.log 2>&1 &

启动后,日志会输出到控制台或者 mm2.log。我建议你盯着日志看 10 秒钟,确认没有 ERROR 级别的报错。常见的启动错误有:

  • ClassNotFoundException:缺 jar 包,检查 libs/ 目录
  • TimeoutException:连不上 Kafka 集群,检查网络和端口
  • ConfigException:配置项写错了,仔细检查 mm2.properties
我曾经踩过的坑:有一次启动后日志一直报 Connection to node -1 could not be established,查了半天发现是 bootstrap.servers 的端口写成了 9093,但集群实际用的是 9092。这种低级错误最浪费时间,所以启动前一定 double-check 连接信息。

第三步:验证同步是否正常

启动成功了,怎么知道数据有没有同步过去?我一般用三个方法验证:

  1. 看心跳 topic:MM2 会在目标集群自动创建 heartbeat 开头的 topic,比如 heartbeat.source-cluster。如果这个 topic 有数据,说明连接正常。
  2. 手动生产消费测试:在源集群生产一条消息,然后在目标集群消费,看能不能收到。
  3. 检查偏移量同步:查看目标集群的 mm2-offset-syncs topic,里面有偏移量同步的记录。

具体命令:

# 1. 查看心跳 topic
./bin/kafka-topics.sh --bootstrap-server target-cluster:9092 --list | grep heartbeat

# 2. 在源集群生产消息
echo "test-message" | ./bin/kafka-console-producer.sh --bootstrap-server source-cluster:9092 --topic test-topic

# 3. 在目标集群消费消息(注意 topic 名可能被重命名)
./bin/kafka-console-consumer.sh --bootstrap-server target-cluster:9092 --topic test-topic.source-cluster --from-beginning

如果消费端能收到 test-message,恭喜你,MM2 配置成功了!

小技巧:验证的时候,我习惯在源集群生产一条带时间戳的消息,比如 test-2024-01-15-10:30:00,这样在目标集群消费时一眼就能看出是不是刚同步过来的数据。

好了,安装和配置就这些。说白了,MM2 的安装不复杂,复杂的是配置细节和排错。你只要把 mm2.properties 里的集群信息、同步方向、topic 过滤这三个核心部分写对,基本就能跑起来。剩下的那些参数,比如 consumer.max.poll.records、producer.compression.type,都是优化项,等跑通了再慢慢调。