我正在使用分布式 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$"
现在恢复节点n1和n2。所以:
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>
节点n1 和n2又回来了。
看起来现在我必须手动重新启动应用程序:* 让我们先在节点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 发布]$
操作...一切都挂起。应用程序未在另一个节点重新启动。
实际上,当我写这篇文章时,我意识到有时一切都好,有时我有问题。
任何想法,虽然在恢复“主”节点并再次杀死它时可能会出现问题?