我正在设计一个小项目,我需要使用Consul以动态方式管理应用程序配置,以便我的所有应用程序机器可以同时获取配置,而不会出现任何不一致问题。我们Consul
已经将其用于服务发现目的,所以我正在阅读更多关于它的信息,看起来他们有一个Key/Value
商店,我可以用它来管理我的配置。
我们所有的配置都是 json 文件,因此我们制作了一个包含所有 json 配置文件的 zip 文件,并将参考存储在其中,您可以从该位置下载此 zip 文件到Consul Key/Value
存储中的特定密钥中。我们所有的应用程序机器都需要从该引用(在 Consul 中的密钥中提到)下载此 zip 文件并将其存储在每个应用程序机器的磁盘上。现在我需要所有应用程序机器同时切换到这个新配置,以避免任何不一致问题。
假设我有 10 台应用程序机器,所有这 10 台机器都需要下载包含我所有配置的 zip 文件,然后原子地同时切换到新配置以避免任何不一致(因为它们正在占用流量)。以下是我提出的步骤,但我对如何在内存中加载新文件以及切换到新配置的工作方式感到困惑:
- 到目前为止,所有 10 台机器都已启动并使用默认配置文件运行,这些文件也在磁盘上。
- 一些外部进程将使用最新的 zip 文件参考更新我的领事键/值存储中的键。
- 所有 10 台机器都有手表,
key
因此一旦有人更新value
,key
手表就会被触发,然后所有这 10 台机器都会将 zip 文件下载到磁盘上并解压缩以获取所有配置文件。 - (..)
- (..)
- (..)
现在这是我对剩余步骤应该如何工作感到困惑的地方。
- 应用程序应该如何将这些配置文件加载到内存中,然后同时切换?
- 我是否需要使用
leadership election
领事或其他任何东西来实现这些事情? - 由于所有 10 个应用程序都已经在内存中使用默认配置(也存储在磁盘上)运行,这将是什么逻辑。我们是否需要两个单独的目录,一个是默认目录,另一个是新配置,然后使用这两个目录?
假设这是否是我在Consul
随机设计中拥有的节点(这里可能是错误的) -
{"path":"path-to-new-config", "machines":"ip1:ip2:ip3:ip4:ip5:ip6:ip7:ip8:ip9:ip10", ...}
哪里path
会有新的 zip 文件参考,并且machines
可能是这里的一个密钥,我可以在其中列出所有机器,所以现在我可以在每台机器成功下载文件后立即将每台机器的 IP 地址放入该密钥中?一旦machines
密钥列表的大小为 10,那么我可以说我们准备好切换了吗?如果是,那么我如何以原子方式更新该节点中的机器密钥?也许这个逻辑在这里是错误的,但我只是想扔掉一些东西。并且还需要在切换后清理所有这些机器列表,因为对于下一次配置更新我需要做类似的练习。
有人可以概述有关如何有效地动态管理所有应用程序机器上的配置并同时避免不一致问题的逻辑吗?也许我还需要一个节点,因为status
它可以包含有关每台机器配置、下载时间、切换时间和其他详细信息的详细信息?