【问题标题】:How to distribute applications across nodes without having to start all applications as part of the Distributed Hand-shake如何在不启动所有应用程序的情况下跨节点分发应用程序作为分布式握手的一部分
【发布时间】:2012-09-07 04:12:18
【问题描述】:

背景

  • 我有一个在节点启动时自动启动的应用程序(使用 .rel、.boot 等)
  • 如果第一个节点出现故障,我希望应用程序故障转移到备用节点。
  • 我使用 Erlang 的分布式应用程序功能来处理故障转移和接管。

问题

问题在于分布式应用程序协商的一部分是,当节点握手以确定哪个节点将保持运行以及哪个节点将被停顿时,应用程序会在所有节点上启动。如果可能,我需要应用程序不要在多个节点上运行。

问题

  • 在参与分布式应用程序启动协商时,有没有办法让节点自动启动我的应用程序除了?或者,
  • 如何让我的应用程序以无人参与的方式启动并进行故障转移,而不需要我的应用程序在多个节点上启动(甚至是短暂启动)

【问题讨论】:

    标签: erlang distributed-apps


    【解决方案1】:

    不幸的是,如今 Erlang 接管和故障转移功能非常有限,因此您需要在所有节点上运行您的应用程序才能使这些功能发挥作用。

    我想到的唯一想法有点疯狂,并且涉及到更高级别的间接性,但它实际上可能有效。

    您可以编写一个假的、轻量级的包装器应用程序,然后在所有节点上启动它。此应用程序使用标准的 Erlang 分发功能。然后,您只需启动原始应用程序即可实施接管/故障转移策略:

    -module(wrapper).
    -behaviour(application).
    
    [...]
    
    start({takeover, _Node}, _Args) ->
      application:start(original_app).
    
    [...]
    

    另外,请记住,当您为所有节点中的分布式应用程序键入 application:start(my_app) 时,该应用程序并非在所有节点上启动。您可以通过在每个节点上键入 application:which_applications() 来验证这一点。您会注意到应用程序是如何在单个节点上运行的。

    最后,请问为什么不能在多个节点上启动应用程序?

    【讨论】:

    • 我的应用程序从 Oracle 数据库创建域模型,将模型持久保存到分布式缓存中,将 Oracle 用于更新这些模型,更新缓存等。我不希望两个应用程序执行这些操作同时活动......这不会是世界末日,但它似乎很浪费带宽,我会锁定不必要的行,等等。
    • 感谢您帮助我。因为我的应用程序是以启动文件(erl -name myapp@1.2.3.4 -boot bootfile)启动的版本的一部分,所以应用程序在所有节点上启动......我需要应用程序无人看管,所以没有一个是在做一个应用:start(myapp)
    • stackoverflow.com/a/10788200/930588 还表明分布式功能最适合作为发行版一部分的应用程序,这意味着(我相信)应用程序在节点启动时启动......因此我的问题。
    猜你喜欢
    • 2015-08-31
    • 2014-05-26
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2011-02-15
    • 2012-12-15
    相关资源
    最近更新 更多