9

我正在使用分布式 erlang 应用程序付费。

配置和想法取自:
http://www.erlang.org/doc/pdf/otp-system-documentation.pdf 9.9。分布式应用程序

  • 我们有 3 个节点:n1@a2-X201、n2@a2-X201、n3@a2-X201
  • 我们有应用程序wd可以做一些有用的工作:)

配置文件:

  • wd1.config - 对于第一个节点:
      [{核心,
          [{分布式,[{wd,5000,['n1@a2-X201',{'n2@a2-X201','n3@a2-X201'}]}]},
           {sync_nodes_mandatory,['n2@a2-X201','n3@a2-X201']},
           {sync_nodes_timeout,5000}
        ]}
      ,{sasl, [
      %% 所有报告都到这个文件
      {sasl_error_logger,{file,"/tmp/wd_n1.log"}}
      ]
    }]。
  • 第二个 wd2.config:
    [{核心,
        [{分布式,[{wd,5000,['n1@a2-X201',{'n2@a2-X201','n3@a2-X201'}]}]},
         {sync_nodes_mandatory,['n1@a2-X201','n3@a2-X201']},
         {sync_nodes_timeout,5000}
         ]
     }
    ,{sasl, [
        %% 所有报告都到这个文件
        {sasl_error_logger,{file,"/tmp/wd_n2.log"}}
    ]
    }]。

  • 对于节点 n3 看起来很相似。

现在在 3 个单独的终端中启动 erlang:

  • erl -sname n1@a2-X201 -config wd1 -pa $WD_EBIN_PATH -boot start_sasl
  • erl -sname n2@a2-X201 -config wd2 -pa $WD_EBIN_PATH -boot start_sasl
  • erl -sname n3@a2-X201 -config wd3 -pa $WD_EBIN_PATH -boot start_sasl

在每个 erlang 节点上启动应用程序:* application:start(wd)。

(n1@a2-X201)1> 应用程序:开始(wd)。

=信息报告==== 2011 年 6 月 19 日::15:42:51 ===
wd_plug_server 开始... PluginId: 4 路径: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$"
好的
(n2@a2-X201)1> 应用程序:开始(wd)。
好的
(n2@a2-X201)2>
(n3@a2-X201)1> 应用程序:开始(wd)。
好的
(n3@a2-X201)2>

目前一切正常。正如 Erlang 文档中所写:应用程序正在节点n1@a2-X201上运行

现在杀死节点n1:应用程序已迁移到n2

(n2@a2-X201)2>
=信息报告==== 2011 年 6 月 19 日::15:46:28 ===
wd_plug_server 开始... PluginId: 4 路径: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$"

继续我们的游戏:杀死节点n2 再一次系统工作正常。我们在节点n3有我们的应用程序

(n3@a2-X201)2>
=信息报告==== 2011 年 6 月 19 日::15:48:18 ===
wd_plug_server 开始... PluginId: 4 路径: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$"

现在恢复节点n1n2。所以:

Erlang R14B (erts-5.8.1) [来源] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.1(使用 ^G 中止)
(n1@a2-X201)1>

Eshell V5.8.1(使用 ^G 中止)
(n2@a2-X201)1>

节点n1n2又回来了。
看起来现在我必须手动重新启动应用程序:* 让我们先在节点n2上执行此操作:

(n2@a2-X201)1> 应用程序:开始(wd)。
  • 好像挂了。。。
  • 现在在n1重新启动它
(n1@a2-X201)1> 应用程序:开始(wd)。

=信息报告==== 2011 年 6 月 19 日::15:55:43 ===
wd_plug_server 开始... PluginId: 4 路径: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$"

好的
(n1@a2-X201)2>

有用。并且节点n2也返回了 OK:

Eshell V5.8.1(使用 ^G 中止)
(n2@a2-X201)1> 应用程序:开始(wd)。
好的
(n2@a2-X201)2>

在节点n3我们看到:

=信息报告==== 2011 年 6 月 19 日::15:55:43 ===
    应用:wd
    退出:停止
    类型:临时

一般来说,一切看起来都不错,如文档中所写,除了在节点n2启动应用程序的延迟。

现在再次杀死节点n1 :

(n1@a2-X201)2>
用户切换命令
 --> q
[a2@a2-X201 发布]$

操作...一切都挂起。应用程序未在另一个节点重新启动。

实际上,当我写这篇文章时,我意识到有时一切都好,有时我有问题。

任何想法,虽然在恢复“主”节点并再次杀死它时可能会出现问题?

4

2 回答 2

1

正如在 Learn You Some Erlang(滚动到底部)中解释的那样,分布式应用程序仅在作为发行版的一部分启动时才能正常工作,而不是在您使用application:start.

于 2012-05-28T17:07:48.160 回答
0

您看到的奇怪现象很可能与您完全在节点 n1/n2 上重新启动应用程序有关,而 n3 仍在初始应用程序初始化下运行。

如果您的应用程序启动任何系统范围的进程并使用它们的 pid,而不是使用例如全局、pg 或 pg2 设置的注册名称,那么您可能正在使用两组全局状态。

如果是这种情况,推荐的方法是专注于从现有应用程序中添加/删除节点,而不是重新启动整个应用程序。这样,节点就会离开并加入到现有的一组初始化值中。

于 2011-06-21T09:08:40.400 回答