Configuration 使用concur进行动态配置管理

Configuration 使用concur进行动态配置管理,configuration,distributed-system,consul,system-design,consul-kv,Configuration,Distributed System,Consul,System Design,Consul Kv,我正在设计一个小项目,我需要使用它来动态管理应用程序配置,这样我的所有应用程序机器都可以同时获得配置,而不会出现任何不一致的问题。我们已经在使用Consul进行服务发现,因此我阅读了更多关于它的信息,看起来他们有一个键/值存储,我可以使用它来管理我的配置 我们的所有配置都是json文件,因此我们制作了一个包含所有json配置文件的zip文件,并将引用存储在concur key/Valuestore中的一个特定密钥中,您可以从那里下载此zip文件。我们所有的应用程序机器都需要从该引用下载这个zip

我正在设计一个小项目,我需要使用它来动态管理应用程序配置,这样我的所有应用程序机器都可以同时获得配置,而不会出现任何不一致的问题。我们已经在使用
Consul
进行服务发现,因此我阅读了更多关于它的信息,看起来他们有一个
键/值
存储,我可以使用它来管理我的配置

我们的所有配置都是json文件,因此我们制作了一个包含所有json配置文件的zip文件,并将引用存储在
concur key/Value
store中的一个特定密钥中,您可以从那里下载此zip文件。我们所有的应用程序机器都需要从该引用下载这个zip文件(在concur的密钥中提到),并将其存储在每个应用程序机器的磁盘上。现在我需要所有的应用程序机器同时切换到这个新的配置,以避免任何不一致的问题

假设我有10台应用程序机器,所有这10台机器都需要下载包含我所有配置的zip文件,然后以原子方式同时切换到新配置,以避免任何不一致(因为它们占用了流量)。以下是我提出的步骤,但我不清楚如何在内存中加载新文件以及切换到新配置:

  • 到目前为止,所有10台机器都已启动并运行默认配置文件,该文件也在磁盘上
  • 一些外部进程将使用最新的zip文件引用更新我的领事密钥/值存储中的密钥
  • 所有这10台机器都在
    键上有一个手表,因此一旦有人更新
    键的
    ,手表就会被触发,然后所有这10台机器都会将zip文件下载到磁盘上并解压缩以获得所有配置文件
  • (……)
  • (……)
  • (……)
  • 现在,我对剩下的步骤应该如何工作感到困惑

    • 应用程序应该如何在内存中加载这些配置文件,然后同时切换所有配置文件
    • 我是否需要与执政官一起使用
      领导力选举
      ,或其他方法来实现这些目标
    • 由于所有10个应用程序都已在内存中使用默认配置(也存储在磁盘上)运行,因此围绕这一点的逻辑是什么。我们是否需要两个单独的目录,一个是默认目录,另一个是新配置目录,然后使用这两个目录
    假设这是我在
    concur
    中的节点,只是一个随机设计(这里可能是错误的)-

    其中
    path
    将有新的zip文件引用,
    machines
    可以是一个键,在这里我可以有所有机器的列表,所以现在我可以在每个机器成功下载文件后立即将其ip地址放入该键中?一旦
    机器
    关键列表的大小为10,那么我可以说我们准备好切换了吗?如果是,那么如何以原子方式更新该节点中的机器密钥?也许这个逻辑是错误的,但我只是想扔掉一些东西。而且还需要在切换后清理所有这些机器列表,因为对于下一次配置更新,我需要做类似的练习


    有人能概述一下我如何能够有效地动态管理我所有应用程序机器上的配置,同时避免不一致性问题的逻辑吗?也许我还需要一个节点作为
    status
    ,它可以有关于每台机器配置的详细信息、下载时间、切换时间和其他详细信息?

    我可以根据您的场景想出几种可能的解决方案

    最简单的解决方案是根本不将配置存储在内存和文件中,只需将配置直接存储在领事kv存储中。我所说的不是映射到整个json的单个键(我假设您的json很大,否则您不会压缩它),而是从json中提取较小的键/值集(这样,您就不需要每次向Consor查询时都提取整个键)。 如果您直接从Consor获得配置,那么您的一致性将得到保证。我猜如果丢失内存配置,您可能会担心性能,这是您需要衡量的。但是,如果您能够忍受性能损失,这将为您节省很多痛苦

    如果性能在这里是一个问题,那么可以使用一种变体。这样,您仍然可以将json提取到Concur中的多个键/值集,然后FSConcur将其映射到应用程序的文件中

    如果这是不可能的,那么问题是你愿意容忍多少不一致。 如果你能忍受几秒钟的不一致,你最好的办法可能是在你的内存配置上加一个。您仍然可以在concur上使用手表,但您可以将它与每隔几秒钟退出内存缓存相结合,作为手表因某种原因出现故障(或暂停)时的后备措施。这应该会给你一个最坏的情况几秒钟的不一致(取决于你为TTL设置的值),但正常情况(我认为)应该很快

    如果这是不可接受的(下载zip可能需要很多时间吗?),你可以按照你提到的路线走。要以原子方式更新值,可以使用它们的操作。如果在您发送请求和领事尝试应用请求之间发生更新,则会出现错误。然后,您需要提取机器列表,再次应用更改并重试(直到成功)

    我不明白为什么你需要2个目录,但也许我误解了这个问题:当你的应用程序启动时,在你做任何其他事情之前,你检查是否有一个新的配置,如果有,你下载它并加载到内存中。因此,如果您想要保持一致,就不应该使用“默认配置”。在启动时下载配置之后,您就可以启动并激活了。当您的手表发出按键更改信号时,您可以下载配置以直接覆盖旧配置。这是假设你正在运行手表触发
    {"path":"path-to-new-config", "machines":"ip1:ip2:ip3:ip4:ip5:ip6:ip7:ip8:ip9:ip10", ...}