需求
使用MM2同步集群数据,topic名称不能变,默认的复制策略为:DefaultReplicationPolicy,这个策略会把同步至目标集群的topic都加上一个源集群别名的前缀,比如源集群别名为A,topic为:bi-log,该topic同步到目标集群后会变成:A.bi-log,为啥这么做呢,就是为了避免双向同步的场景出现死循环。
官方也给出了解释:
这是 MirrorMaker 2.0 中的默认行为,以避免在复杂的镜像拓扑中重写数据。 需要在复制流设计和主题管理方面小心自定义此项,以避免数据丢失。 可以通过对“replication.policy.class”使用自定义复制策略类来完成此操作,所以本文主要记录一下自定义复制策略的流程。
准备工作
下载源码
https://kafka.apache.org/downloads

kafka源码是使用Gradle编译的,需要安装Gradle,具体安装操作不赘述了,可以百度。
源码使用IDEA打开后,在connect模块下找到接口:org.apache.kafka.connect.mirror.ReplicationPolicy

自定义复制策略
ReplicationPolicy这个接口主要有几个方法:
- formatRemoteTopic:重命名topic名称
- topicSource:根据topic获取source集群别名
- upstreamTopic:获取topic在source集群中的名称
- originalTopic:获取topic原始的名称(针对多次同步过程中,被重命名过多次的topic)
- isInternalTopic:判断是否为内部topic
根据我们的需求,自定义策略需要满足:
- 不重命名source集群中topic的名称
- 能返回source集群别名
实现很简单,就是保证topic原封不动即可,完整代码如下:
package org.apache.kafka.connect.mirror;
import org.apache.kafka.common.Configurable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util

文章介绍了如何在KafkaMirrorMaker2(MM2)中自定义复制策略,以避免在同步集群时给topic添加源集群别名前缀。通过实现`ReplicationPolicy`接口并重写相关方法,确保topic名称不变,然后编译源码生成新的jar文件,替换原有库,最后更新MM2配置文件启用新策略,从而解决循环复制问题。

2329

被折叠的 条评论
为什么被折叠?



