Erlang:分布式应用程序奇怪的行为

Erlang:分布式应用程序奇怪的行为,erlang,otp,Erlang,Otp,我用分布式erlang应用程序付费 配置和想法取自: http://www.erlang.org/doc/pdf/otp-system-documentation.pdf9.9。分布式应用程序 我们有3个节点:n1@a2-X201,n2@a2-X201,n3@a2-X201 我们的应用程序wd可以做一些有用的工作:) 配置文件: wd1.config-对于第一个节点: [{内核, [{分布式,[{wd,5000,['n1@a2-X201',{'n2@a2-X201’,'n3@a2-X20

我用分布式erlang应用程序付费

配置和想法取自:
http://www.erlang.org/doc/pdf/otp-system-documentation.pdf9.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_必填,['n2@a2-X201’,'n3@a2-X201']}, {同步节点超时,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_必填,['n1@a2-X201’,'n3@a2-X201']}, {同步节点超时,5000} ] } ,{sasl[ %%所有报告都将转到此文件 {sasl_error_logger,{file,“/tmp/wd_n2.log”} ] }].
  • 对于节点n3,它看起来类似
现在在3个单独的终端中启动erlang:

  • 厄尔斯奈姆n1@a2-X201-配置wd1-pa$WD\u EBIN\u路径-启动启动\u sasl
  • 厄尔斯奈姆n2@a2-X201-配置wd2-pa$WD\u EBIN\u路径-启动启动\u sasl
  • 厄尔斯奈姆n3@a2-X201-配置wd3-pa$WD\u EBIN\u路径-启动启动\u sasl
在每个erlang节点上启动应用程序: *应用:启动(wd)

(n1@a2-X201)1>应用程序:启动(wd)。 =信息报告===2011年6月19日::15:42:51=== wd_插件_服务器正在启动。。。PluginId:4路径:“/home/a2/src/erl/data/SIG”文件掩码:(?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> =INFO REPORT==== 19-Jun-2011::15:46:28 === wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" (n2@a2-X201)2> =信息报告===2011年6月19日::15:46:28=== wd_插件_服务器正在启动。。。PluginId:4路径:“/home/a2/src/erl/data/SIG”文件掩码:(?i)(.*)\\\.SIG$” 继续我们的游戏:杀死节点n2 再来一次系统工作正常。我们的应用程序位于noden3

(n3@a2-X201)2> =INFO REPORT==== 19-Jun-2011::15:48:18 === wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" (n3@a2-X201)2> =信息报告===2011年6月19日::15:48:18=== wd_插件_服务器正在启动。。。PluginId:4路径:“/home/a2/src/erl/data/SIG”文件掩码:(?i)(.*)\\\.SIG$” 现在恢复节点n1n2。 因此:

Erlang R14B(erts-5.8.1)[源代码][smp:4:4][rq:4][异步线程:0][hipe][内核轮询:false] Eshell V5.8.1(使用^G中止) (n1@a2-X201)1> Eshell V5.8.1(使用^G中止) (n2@a2-X201)1> 节点n1n2返回。
看起来现在我必须手动重新启动应用程序: *让我们先在noden2上执行此操作:

(n2@a2-X201)1> application:start(wd). (n2@a2-X201)1>应用程序:启动(wd)。
  • 看起来像是挂起来了
  • 现在在n1重新启动
(n1@a2-X201)1>应用程序:启动(wd)。 =信息报告===2011年6月19日::15:55:43=== wd_插件_服务器正在启动。。。PluginId:4路径:“/home/a2/src/erl/data/SIG”文件掩码:(?i)(.*)\\\.SIG$” 好啊 (n1@a2-X201)2> 它起作用了。节点n2也已返回OK:

Eshell V5.8.1 (abort with ^G) (n2@a2-X201)1> application:start(wd). ok (n2@a2-X201)2> Eshell V5.8.1(使用^G中止) (n2@a2-X201)1>应用程序:启动(wd)。 好啊 (n2@a2-X201)2> 在节点n3处,我们看到:

=INFO REPORT==== 19-Jun-2011::15:55:43 === application: wd exited: stopped type: temporary =信息报告===2011年6月19日::15:55:43=== 应用:wd 退出:停止 类型:临时 一般来说,正如文档中所写的,除了在节点n2启动应用程序的延迟之外,一切看起来都正常

现在再次杀死节点n1

(n1@a2-X201)2> User switch command --> q [a2@a2-X201 releases]$ (n1@a2-X201)2> 用户切换命令 -->q [a2@a2-X201版本]$ 行动。。。一切都悬而未决。应用程序未在另一个节点上重新启动

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


有什么想法吗?恢复“主”节点并再次杀死它时可能会出现问题?

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

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


如果是这种情况,建议采取的方法是将重点放在从现有应用程序添加/删除节点上,而不是重新启动整个应用程序。这样,节点就离开并加入到一组现有的初始化值中。

作为(滚动到底部),分布式应用程序只有在作为发布的一部分启动时才能正常工作,而不是当您使用
应用程序:开始

手动启动它们时。很好的问题:大量投票,但没有答案:)实际上,我不使用PID,我使用注册的名字。我使用{local,Name}注册了gen_服务器实现行为。所以,我觉得这不应该是个问题。我不完全理解如何从正在运行的应用程序中添加/删除节点?你有代码示例吗?谢谢 (n3@a2-X201)2> =INFO REPORT==== 19-Jun-2011::15:48:18 === wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.8.1 (abort with ^G) (n1@a2-X201)1> Eshell V5.8.1 (abort with ^G) (n2@a2-X201)1> (n2@a2-X201)1> application:start(wd). (n1@a2-X201)1> application:start(wd). =INFO REPORT==== 19-Jun-2011::15:55:43 === wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" ok (n1@a2-X201)2> Eshell V5.8.1 (abort with ^G) (n2@a2-X201)1> application:start(wd). ok (n2@a2-X201)2> =INFO REPORT==== 19-Jun-2011::15:55:43 === application: wd exited: stopped type: temporary (n1@a2-X201)2> User switch command --> q [a2@a2-X201 releases]$