在使用Docker时如何将集群NiFi中的授权和用户文件外化?

我正在运行一个安全的NiFi集群,每个NiFi节点在一个Docker容器中运行。 我需要外部化用户和策略的状态,所以基本上这两个文件:

  • authorizations.xml
  • users.xml中

做这个的最好方式是什么?

一个天真的方法,在非集群环境下工作得很好,就是在Docker容器中安装一个外部卷,并把authorizations.xml,users.xml文件放在那里。 使用这种方法,我可以移除NiFi Docker容器,稍后再运行它,而不用担心丢失任何更改。 最初我的第一个想法是在集群环境中做同样的事情,并将所有节点指向相同的物理文件。 但是据我所知,如果我这样做了,那么进行初始更改的NiFi节点会更新这些文件,随后群集中的所有其他节点最终都会尝试更新所有这些文件。 但是,它们已经被初始节点更新了,所以如果它们没有遇到已经存在的变化的问题,它们可能会遇到一个获得写文件句柄的问题。

另一种方法是定期将文件从NiFidocker集装箱写入外部位置。 这有点麻烦,但它引发了如何将文件放入NiFi Docker的问题。 我可以在启动时从外部卷复制它们。 但是当我在某个时候添加一个额外的节点时,它也会复制这些文件,并冒着与现有节点中的文件不同步的风险。 如果新节点能够以某种方式确定其他节点正在运行并且具有configuration(在这种情况下根本不会带入文件),并且一旦节点join集群后它们将由NiFidynamic地创build根据NiFi文件)。 但这可能不是那么容易做到的。 但是,也许只是确定是否有其他节点正在运行?

我们可以让集群中的每个节点将这些文件外化。 也许这可能会导致一些竞争条件,但似乎不太可能。 更大的问题是,大多数情况下,我们会有很多版本的文件完全相同,这可能会激怒我们的客户,他们宁愿最多只有一个文件副本处理。

我不能在这里谈到Docker方面,但通常authorizations.xml和users.xml不应该被认为是configuration文件。 它们是正在使用的基于文件的授权人的数据存储,只是碰巧是XMl文件,但假装他们是embedded式数据库,或者其他一些不是人类可读的文本文件。

定义授权者的authorizers.xml文件是有意义的,让所有节点可能指向同一个文件,以确保它们都使用相同的授权者。 这个文件是一个configuration文件,永远不会被正在运行的应用程序修改,所以它是有道理的。

对于users.xml和authorizations.xml,每个节点都需要pipe理自己的这些文件的副本,build议不要尝试让所有节点指向相同的文件。

如果您真的想将用户和策略的pipe理外部化,那么使用Apache Ranger授权程序或实现将所有内容存储在外部数据存储区的自定义授权程序可能会更好。