概述
MirrorMaker2(后文简称 MM2)在 2019 年 12 月随 Kafka 2.4.0 一起推出。顾名思义,是为了解决 Kafka 集群之间数据复制和数据同步的问题而诞生的 Kafka 官方的数据复制工具。在实际生产中,经常被用来实现 Kafka 数据的备份,迁移和灾备等目的。
使用场景
Kafka MM2适用于下列场景:
- 远程数据同步:通过MM2,Kafka数据可以在不同地域的集群进行传输复制。
- 灾备场景:通过MM2,可以构建不同数据中心的主备两个集群容灾架构,MM2实时同步两个集群的数据。当其中一个集群不可用时,可以将上面的应用程序切换到另一个集群,从而实现异地容灾功能。
- 数据迁移场景:在业务上云、混合云、集群升级等场景,存在数据从旧集群迁移到新集群的需求。此时,您可以使用MM2实现新旧数据的迁移,保证业务的连续性。
- 聚合数据中心场景:通过MM2,可以将多个Kafka子集群的数据同步到一个中心Kafka集群,实现数据的汇聚。
功能
Kafka MM2作为数据复制工具,具有以下功能:
- 复制topics数据以及配置信息。
- 复制consumer groups及其消费topic的offset信息。
- 复制ACLs。
- 自动检测新的topic以及partition。
- 提供MM2的metrics。
- 高可用以及可水平扩展的框架。
任务执行方式
MM2任务有以下执行方式:
- Distributed Connect集群的connector方式(推荐):在已有Connect集群执行MM2
connector任务的方式。您可以参照本文使用Connect集群服务的功能来管理MM2任务。 - Dedicated MirrorMaker集群方式:不需要使用Connect集群执行MM2
connector任务,而是直接通过Driver程序管理MM2的所有任务。 - Standalone Connect的worker方式:执行单个MirrorSourceConnector任务,适合在测试场景下使用。
说明
推荐在Distributed Connect集群上启动MM2 connector任务,可以借助Connect集群的Rest服务管理MM2任务。
使用限制
- 为保证生产集群的数据完整和安全,必须先在测试集群进行测试
- 源集群与目标集群的Kafka软件版本为2.12_2.4.1及以上。
- MM2 迁移任务会增加CPU和内存的占用,尽量停止客户端生产与消费,或根据数据量大小,选择在窗口时间进行迁移。
迁移方案
集群情况
集群配置
主题配置 :确保目标集群中的主题配置(如分区数、副本数、保留策略等)与源集群一致,或根据业务需求进行调整。
Broker 配置:检查每个 broker 的配置参数,确保两者之间的兼容性。
数据分布与负载
分区分布 :了解源集群中各主题的分区分布情况,以便在目标集群中合理安排分区。
负载评估:分析源集群的负载,确保目标集群有足够的能力来处理迁移后的数据流。
安全性和权限
认证与授权:检查源集群和目标集群的安全设置,确保数据迁移过程中涉及的用户和角色具有适当的权限。
兼容性和版本
Kafka 版本 :确保两个集群的 Kafka 版本兼容,特别是在使用特性时,避免因版本差异引发的问题。
消息格式:验证消息格式和序列化机制在两个集群中的一致性。
创建测试topic
根据目标集群与业务需求进行调整目标topic副本与分区数,测试不做要求
bash
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic topictest --replication-factor 3
2.3 生产消息
bash
bash-5.0$ kafka-console-producer.sh --bootstrap-server localhost:9092 --topic topictest
>1
>2
>3
>4
>5
>6
>7
>8
>
2.4 记录偏移量
记录 Kafka 主题的偏移量信息
bash
./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic s.topictest --time -1
MM2配置文件
bash
# 指定两个集群,以及对应的host
clusters = s,d
s.bootstrap.servers = xxxx:9092
d.bootstrap.servers = yyyy:9092
# 指定同步备份的topic & consumer group,支持正则
s->d.topics = topictest
s->d.groups = .*
# 指定复制链条,可以是双向的
s->d.enabled = true
# us-east->us-west.enabled = true # 双向,符合条件的两个集群的topic会相互备份
全量配置
bash
如有其他需要,可添加其他使用参数
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# see org.apache.kafka.clients.consumer.ConsumerConfig for more details
# Sample MirrorMaker 2.0 top-level configuration file
# Run with ./bin/connect-mirror-maker.sh connect-mirror-maker.properties
# specify any number of cluster aliases
clusters = A,B
#replication.policy.separator=""
#source.cluster.alias=""
#target.cluster.alias=""
# connection information for each cluster
# This is a comma separated host:port pairs for each cluster
# for e.g. "A_host1:9092, A_host2:9092, A_host3:9092"
A.bootstrap.servers = xxxx:9092
B.bootstrap.servers = yyyy:9092
A.security.protocol=SASL_PLAINTEXT
A.sasl.mechanism=SCRAM-SHA-512
A.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="xxx" password="xxx";
B.security.protocol=SASL_PLAINTEXT
B.sasl.mechanism=SCRAM-SHA-512
B.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
username="xxx" password="xxx";
# enable and configure individual replication flows
# 设置同步的流向
A->B.enabled = true
#A.producer.enable.idempotence = true
#B.producer.enable.idempotence = true
# regex which defines which topics gets replicated. For eg "foo-.*"
#A->B.topics = hadoopLogCollection,t_biz_act_mmetric
#设置同步的topic;支持正则
A->B.topics = xxxx,xxxx
#设置排除的topic:支持正则
A->B.topics.exclude= xxxx
#B->A.enabled = true
#B->A.topics = .*
# Setting replication factor of newly created remote topics
replication.factor=3
############################# Internal Topic Settings #############################
# The replication factor for mm2 internal topics "heartbeats", "B.checkpoints.internal" and
# "mm2-offset-syncs.B.internal"
# For anything other than development testing, a value greater than 1 is recommended to ensure availability such as 3.
sync.topic.configs.enabled=true
#同步配置的时间频率
sync.topic.configs.enabled.interval.seconds=60
checkpoints.topic.replication.factor=2
heartbeats.topic.replication.factor=2
offset-syncs.topic.replication.factor=2
#offset-syncs.topic.location = target
#启动同步的Task数量----启用几个线程进行同步
tasks.max = 5
# The replication factor for connect internal topics "mm2-configs.B.internal", "mm2-offsets.B.internal" and
# "mm2-status.B.internal"
# For anything other than development testing, a value greater than 1 is recommended to ensure availability such as 3.
offset.storage.replication.factor=2
status.storage.replication.factor=2
config.storage.replication.factor=2
# customize as needed
# replication.policy.separator = _
sync.topic.acls.enabled = true
emit.heartbeats.interval.seconds = 5
#开启topic动态和消费者组 动态同步与同步的周期
refresh.topics.enabled = true
refresh.topics.interval.seconds = 60
refresh.groups.enabled = true
refresh.groups.interval.seconds = 60
# 开始消费者组offset同步;设置同步的周期---注意:仅仅同步idle中的消费者的offset
sync.group.offsets.enabled = true
sync.group.offsets.interval.seconds = 5
#设置同步的topic Name命名规则;3.0版本提供了两种topic同步命名规则,默认会带上前缀,也可以手动不带前缀的----此时不能做双向同步
replication.policy.class = org.apache.kafka.connect.mirror.IdentityReplicationPolicy
执行迁移进程
bash
bash-5.0$ ./bin/connect-mirror-maker.sh mm2.properties
验证数据同步
topic迁移后会变为s.topic
bash
./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic s.topictest --time -1
与源集群偏移量相同,消费消息正常
确认消息偏移量,保证数据一致性。
源集群停止mm2迁移进程,并将业务连接到新集群中即可。