我可以对两个不同的 Nifi 集群使用相同的 flow.xml.gz 吗?

Can I use the same flow.xml.gz for two different Nifi cluster?

我们有一个 13 个节点的 nifi 集群,大约有 50k 个处理器。 flow.xml.gz 的大小约为 300MB。启动13个节点的Nifi集群,一般需要8-10个小时。最近我们将集群分成两部分,5 节点集群和 8 节点集群,两者都具有相同的 300MB flow.xml.gz。从那以后,我们无法在两个集群中启动 Nifi。此外,我们没有看到与此问题相关的任何有效日志。有相同的 flow.xml.gz 可以吗?拆分 Nifi 集群时我们可能会遗漏哪些最佳实践。

你问了很多问题,这些问题都归结为“如何提高我们拥有非常大的 flow.xml.gz 的 NiFi 集群的性能”。 如果没有关于您的集群及其中的流程的更多详细信息,我无法给出明确或保证有效的答案,但我可以指出一些步骤。

分群不分流不行

是的,您会稍微减少集群通信开销,但您可能有许多输入处理器设置为“仅限主节点”。如果您在两个集群上加载相同的 flow.xml.gz,两者都会有一个主节点执行这些,从而导致争用问题。

更重要的是,由于每个节点仍然加载所有 flow.xml.gz(可能解压缩 4 Gb),您没有任何其他性能优势并且在启动时验证流程中的 50k 处理器仍然需要很长时间.

如何拆分集群

按照您的方式拆分集群可能会留下对现在位于另一个集群中的节点的引用,例如在本地状态目录中。对于 NiFi 集群,这可能会导致选择新的集群协调器和主节点的问题,因为无法达到法定人数。

首先从群集 GUI 中断开连接、卸载和删除 那些节点会更干净,以便删除这些引用。然后可以将这些节点配置为具有空流的新集群。即使你以后再用旧流程,用空流程测试一下,速度会快很多。

既然你已经分裂了集群,我会尝试启动8个成员集群的一个节点,看看你是否可以访问集群菜单来删除分裂的节点(断开和卸载可能不再起作用).然后对于集群的其他 7 个成员,删除 flow.xml.gz 并启动它们。他们应该从 运行 节点复制流。您应该调整 nifi.properties (nifi.cluster.flow.election.max.candidates) 中预期的候选人数量,使其不大于节点数量,以略微加快此过程。

如果成功,您将在 8 成员集群上拥有 300 MB 流 运行,在新的 5 成员集群上拥有空流。 将新集群连接到您的开发管道(NiFi 注册表、模板或其他)。然后,您可以停止 8 成员集群上的进程组,将它们导入新集群,并在验证新集群上的流程 运行 后,从旧集群中删除进程组,慢慢缩小它。

如果您没有管道或者重新创建所有控制器和参数上下文的工作量太大,您可以将 flow.xml.gz 的副本复制到一个新节点,仅启动该节点并删除所有内容你不需要。只有在那之后你才能再次启动其他人(他们的空 flow.xml.gz)。

如需更多专家建议,您还应该尝试 Apache NiFi 用户电子邮件列表。如果您在问题中提供了足够的相关详细信息,那里的人可能会知道您的集群出了什么问题。