我正在运行一个安全的NiFi群集,其中每个NiFi节点都在Docker容器中运行。我需要外化用户和策略的状态,所以基本上这两个文件:
这样做的最佳方式是什么?
一种天真的方法,在非集群环境中对我来说很好用,就是在Docker容器中安装一个外部卷,然后将authorizations.xml,users.xml文件放在那里。通过这种方法,我可以移除NiFi Docker容器并在以后再次运行它,而不必担心丢失任何更改。最初我的第一个想法是在集群环境中做同样的事情,并将所有节点指向相同的物理文件。但据我所知,如果我这样做,进行初始更改的NiFi节点将更新文件,随后群集中的所有其他节点最终也会尝试更新所有这些文件。但是,它们已经由初始节点更新,因此如果它们没有遇到已经存在的更改的问题,它们可能会在获取写文件句柄时遇到问题。
另一种方法可能是定期将文件从NiFi docker容器写入外部位置。这有点乱,但它引出了如何将文件开始进入NiFi Docker的问题。我可以在启动期间从外部卷复制它们。但是当我在某个时刻添加一个额外的节点时,它也会复制文件,并冒着与生活在现有节点中的文件不同步的风险。如果新节点可以某种方式确定其他节点正在运行并具有配置,它可以工作,在这种情况下它根本不会引入文件,并且一旦节点加入集群,它们将由NiFi动态创建(根据NiFi文档)。但这可能不那么容易。但也许仅仅确定当前是否还有其他节点正在运行?
我们可以让群集中的每个节点外部化这些文件。也许这可能导致一些竞争条件,但似乎不太可能。更大的问题是我们在大多数情况下会有许多版本的文件完全相同,这可能会激怒我们的客户,他们希望最多只能拥有一份文件副本。
答案 0 :(得分:3)
我在这里真的不能谈论Docker方面,但一般来说authorizations.xml和users.xml不应该被认为是配置文件。它们是正在使用的基于文件的授权程序的数据存储,恰好是XMl文件,但假装它们是嵌入式数据库,或者其他不是人类可读文本文件的东西。
定义授权程序的authorizers.xml文件将使所有节点可能指向同一文件以确保它们都使用相同的授权程序。此文件是一个配置文件,永远不会被正在运行的应用程序修改,因此它是有意义的。
对于users.xml和authorizations.xml,每个节点都需要管理自己的这些文件的副本,并且不建议尝试让所有节点指向相同的文件。
如果您真的想要外部化用户和策略的管理,那么您最好使用Apache Ranger授权程序,或者实现将所有内容存储在外部数据存储中的自定义授权程序。