我们有一个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预期的候选人数量。属性(nifi.cluster.flow.election.max.candidates)使其不大于节点数量,以稍微加快此过程。
如果成功,则在8成员集群上运行300 MB流,在新的5成员集群上运行空流。将新集群连接到您的开发管道(NiFi注册表、模板或其他)。然后,您可以停止8个成员集群上的进程组,在新集群上导入它们,并在验证流在新集群上运行后,从旧集群中删除该进程组,慢慢缩小它。
如果没有管道,或者重新创建所有控制器和参数上下文的工作量太大,可以将flow.xml.gz的副本复制到一个新节点,只启动该节点并删除所有不需要的东西。只有在此之后,您才能再次启动其他文件(使用空的flow.xml.gz)。
要获得更多专家建议,您还应该尝试Apache NiFi用户电子邮件列表。如果你在你的问题中提供足够的相关细节,那里的人可能知道你的集群出了什么问题。