【发布时间】:2018-07-25 22:28:46
【问题描述】:
基本上,MM 复制的内容比我需要的要多。
我有四个环境,DEV01、DEV02、TST01 和 TST02,每个环境都有两个服务器运行同一个生成 JSON 文件的应用程序。 Logstash 正在读取这些文件并将消息推送到两个、三个节点的 Kafka 集群、KAF01 和 KAF02。 DEV01 和 TST01 盒子推送到 KAF01 集群,对应 DEV01 和 TST01 主题,DEV02 和 TST02 盒子推送到 KAF02 集群,对应 DEV02 和 TST02 主题。 Logstash 在每个 Kafka 节点上运行,然后将消息推送到相应的 Elasticsearch 集群中。这一切都按预期工作。然后我在 MM 中添加了环境之间的复制消息,即:DEV01DEV02、TST01TST02。我为 DEV 环境启动了 MM 流程,一切正常。然后,在相同的主机上,我为 TST 环境启动了第二个 MM 流程,一切似乎都很好,直到我意识到我在 DEV Elasticsearch 中看到了来自 TST 的消息,反之亦然。
这是一个粗略的流程图:
我在每个 Kafka 集群的第一台主机上运行 MM,即:kaf01-01 和 kaf02-01。对于 KAF01 集群,kaf01-01 设置为将 dev01 和 tst01 主题镜像到 KAF02 集群:
kafka-mirror-maker.sh kafka.tools.MirrorMaker --consumer.config dev01_mm_source.properties --num.streams 1 --producer.config dev01_mm_target.properties --whitelist="dev01"
对于--consumer.config,dev01_mm_source.properties 文件配置了 KAF01 集群节点。对于--producer.config,dev01_mm_target.properties 文件配置了 KAF02 集群节点。
kafka-mirror-maker.sh kafka.tools.MirrorMaker --consumer.config tst01_mm_source.properties --num.streams 1 --producer.config tst01_mm_target.properties --whitelist="tst01"
对于--consumer.config,tst01_mm_source.properties 文件配置了 KAF01 集群节点。对于--producer.config,tst01_mm_target.properties 文件配置了 KAF02 集群节点。
对于 KAF02 集群,kaf02-01 设置为将 dev02 和 tst02 主题镜像到 KAF01 集群:
kafka-mirror-maker.sh kafka.tools.MirrorMaker --consumer.config dev02_mm_source.properties --num.streams 1 --producer.config dev02_mm_target.properties --whitelist="dev02"
对于--consumer.config,dev02_mm_source.properties 文件配置了 KAF02 集群节点。对于--producer.config,dev02_mm_target.properties 文件配置了 KAF01 集群节点。
kafka-mirror-maker.sh kafka.tools.MirrorMaker --consumer.config tst02_mm_source.properties --num.streams 1 --producer.config tst02_mm_target.properties --whitelist="tst02"
对于--consumer.config,tst02_mm_source.properties 文件配置了 KAF02 集群节点。对于--producer.config,tst02_mm_target.properties 文件配置了 KAF01 集群节点。
我有没有搞错?我有 --consumer.config 和 --producer.config 文件倒退吗?我使用的--whitelist 选项的正则表达式是否不正确?也没有真正使用正则表达式,只是一个带引号的字符串。我已经三重检查了所有应用程序框上的 Logstash 是否配置为推送到正确的 Kafka 主题,并且 Kafka 框上的 Logstash 配置为从正确的 Kafka 主题中提取,然后推送到正确的 Elasticsearch 集群。
今天刚开始使用 Kafka 和 MM,所以我对这一切完全陌生,非常感谢任何/所有帮助。
【问题讨论】:
-
我不太了解箭头。你在运行一个双向镜像吗?我建议研究 MirrorMaker 的消息处理程序参数并使用其来源的后缀重命名该主题。例如github.com/gwenshap/kafka-examples/blob/master/…
-
可能只是一个错误的箭头选择。我不认为双向镜像是可能的。 KAF01 将 DEV01 和 TST01 主题推送到 KAF02 集群主题,然后 KAF02 将消息从 DEV02 和 TST02 主题推送到 KAF01 集群主题。
-
这不是双向镜像,而是运行相同的命令并翻转生产/消费。您是否有特殊原因为每个主题运行一个 MirrorMaker,而不是使用白名单同时镜像两个主题?那么您将只有两个进程来维护和调试,而不是四个。您可能想使用正则表达式
^(topic)$强制您的主题名称完全匹配 -
好吧,这更有意义。我也没有意识到我可以为每个 MM 实例做多个主题。这是否只是
--whitelist中的多个条目,即:--whitelist="^(topic1)$,^(topic2)$"?另外,我在源集群上运行 MM,对吗? -
@cricket_007 谢谢。我已经想通了。我试图将 Logstash 输出到两个不同的 ES 集群,而 Logstash 的单个实例无法做到这一点,所以它将它们混合在一起。 MirrorMaker 按预期工作。我已经更改了 Logstash 的运行位置以将其分离出来,现在一切都按预期工作。
标签: apache-kafka