`

erlang使用长名启动的分析与解决

 
阅读更多

         erlang作为一种函数式编程语言,得到了越来越多的应用。在学习分布式编程的过程中,在本机使用长名启动报错,信息如下:

       {error_logger,{{2014,6,12},{10,56,2}},"Can't set long node name!\nPlease check your configuration\n",[]}
{error_logger,{{2014,6,12},{10,56,2}},crash_report,[[{initial_call,{net_kernel,init,['Argument__1']}},{pid,<0.20.0>},{registered_name,[]},{error_info,{exit,{error,badarg},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,322}]},{proc_li
b,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}},{ancestors,[net_sup,kernel_sup,<0.10.0>]},{messages,[]},{links,[<0.17.0>]},{dictionary,[{longnames,true}]},{trap_exit,true},{status,running},{heap_size,610},{stack_size,27},{reducti
ons,784}],[]]}
{error_logger,{{2014,6,12},{10,56,2}},supervisor_report,[{supervisor,{local,net_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{pid,undefined},{name,net_kernel},{mfargs,{net_kernel,start_link,[[cat,longnames]]}
},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}
{error_logger,{{2014,6,12},{10,56,2}},supervisor_report,[{supervisor,{local,kernel_sup}},{errorContext,start_error},{reason,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}},{offender,[{pid,undefined},{name,net_sup},{mf
args,{erl_distribution,start_link,[]}},{restart_type,permanent},{shutdown,infinity},{child_type,supervisor}]}]}
{error_logger,{{2014,6,12},{10,56,2}},crash_report,[[{initial_call,{application_master,init,['Argument__1','Argument__2','Argument__3','Argument__4']}},{pid,<0.9.0>},{registered_name,[]},{error_info,{exit,{{shutdown,{failed_to_start_child,n
et_sup,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}}},{kernel,start,[normal,[]]}},[{application_master,init,4,[{file,"application_master.erl"},{line,133}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,23
9}]}]}},{ancestors,[<0.8.0>]},{messages,[{'EXIT',<0.10.0>,normal}]},{links,[<0.8.0>,<0.7.0>]},{dictionary,[]},{trap_exit,true},{status,running},{heap_size,376},{stack_size,27},{reductions,117}],[]]}
{error_logger,{{2014,6,12},{10,56,2}},std_info,[{application,kernel},{exited,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}}},{kernel,start,[normal,[]]}}},{type,permanent}]}
{"Kernel pid terminated",application_controller,"{application_start_failure,kernel,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}}},{kernel,start,[normal,[]]}}}"}

Crash dump was written to: erl_crash.dump
Kernel pid terminated (application_controller) ({application_start_failure,kernel,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}}},{k

 

 

  其中的提示信息  Can't set long node name!\nPlease check your configuration没有明确说是什么原因。结合搜索到的一些信息,和群友提供的答案,结合书本,基本上确定此问题和域名解析有关,情况大致如下:

     1.使用-sname时,默认是本地节点,所以,不需要考虑网络交互,也就不存在域名解析问题。

     2.使用-name启动时,系统认为需要通过网络交互,那么,在这个时候,不管是局域网还是广域网,都会涉及到域名解析的问题。

          使用 erl  -name  nodename 启动时,默认会使用机器名作域名进行解析请求,此时肯定解析是无法成功的,所以报错。知道了问题原因,那么解决起来就会有途径可以遵循了。

 

        解决方法有多个,分别如下:

          (1)使用erl   -name nodename@127.0.0.1启动,

                   这种方法,借用了127.0.0.1是指向本机的约定来解决此问题的。因为已经提供了具体的ip指向,所以这个时候,不再需要解析了。所以会成功。这个方法是erlang群的群友提供的,在此表示感谢。

          (2)和方法1类似,但是用本机的真实ip来处理:erl -name nodename@本机ip地址。

                   该方法和方法一的原理是一样的,当然,这个地址是真实的,不是模拟的,这个很重要。所以就逻辑性而言,这个方法要更好一些。

          (3) 直接使用机器名:erl -name nodename@hostname

                    由于在这里直接指明了机器名,也就是本机的机器名,所以在这里也不存在解析问题了。问题得到了解决。在这里有个问题:也就是完整长名时的处理流程和只有nodename的长名时的区别在哪里?这个貌似只有看源代码才能回答

           (4)使用host文件解析:这个方法是最好的方法,是适合用在部署环境中,因为此时,机器名也并无必要通过dns系统解析。

            ok,问题解决了。那么问题是在最常规的-name nodename 时,erlang使用什么来请求dns但是没有结果呢?  在我的出问题环境中,机器名是 hostname,但是 host文件中只有localhost的配置。所以,此时应当是使用了机器名,去请求dns解析,没有解析成功而导致的。而在使用nodename@hostname时,应该在发现hostname是本机后,就没有再去解析了。

            

分享到:
评论

相关推荐

    Erlang深度分析

    调试是软件开发中不可或缺的环节,Erlang提供了许多强大的调试工具,例如Erlang的crash dump分析工具、snooper消息监听器等,它们帮助开发者在开发和测试阶段快速定位和解决问题。 #### 4. 并发与网络 ##### 4.1 ...

    erlang 深度分析

    ### Erlang深度分析知识点概述 #### 1. Erlang虚拟机(VM)分析 - **概念**: Erlang VM,也称为BEAM (Bytecode for the Erlang Abstract Machine),是Erlang语言的基础运行环境。 - **特性**: - **轻量级进程**: ...

    Erlang项目内存泄漏分析方法

    - 当使用第三方工具(如appmon,webtool)由于内存不足无法启动时,可以依赖Erlang shell本身提供的功能进行分析。 - 对于复杂的系统,可能需要记录和分析日志,了解特定时间点或事件后内存的使用情况。 - 在处理...

    tsung+erlang包

    2. **启动阶段**:使用 `tsung start` 命令启动测试,Tsung 会根据配置文件创建虚拟用户并开始发送请求。 3. **运行阶段**:Tsung 持续监控系统性能,并记录各种指标,如响应时间、吞吐量、失败率等。 4. **结束阶段...

    Erlang 24.0(win64).exe

    5. 环境变量:安装完成后,确保系统环境变量PATH包含了Erlang的bin目录,以便在命令行中直接使用Erlang命令。 6. 验证安装:打开命令行,输入`erl`命令,如果能进入Erlang shell(REPL),则表明安装成功。 **...

    erlang学习3pdf

    - **解决方案**:可以考虑使用Erlang标准库中的字典(Dictionary)模块来替代ETS表,或者通过显式的消息传递机制来同步数据结构的状态。 #### 三、总结 通过本篇文档的学习,我们可以了解到在Erlang中构建支持多个...

    RabbitMQ_Erlang

    总的来说,RabbitMQ和Erlang的结合为Windows平台提供了强大的消息中间件解决方案,适用于需要高并发、高可靠性以及灵活消息传递的复杂分布式系统。通过深入学习和理解RabbitMQ的特性和使用方法,开发者可以构建出...

    Erlang程序设计

    4. **错误处理与容错**:Erlang采用“let it crash”理念,即当错误发生时,系统会崩溃并重新启动,以此达到快速恢复和高可用性。错误处理通常是通过链接和监视过程来实现的。 5. **分布式编程**:Erlang天生支持...

    erlang学习4.pdf

    ### Erlang分布式调用与TableServer支持详解 #### 前言 Erlang作为一种专为构建高并发、高可用性系统而设计的编程语言,其核心特性之一就是强大的分布式处理能力。本篇文档旨在深入解析Erlang的分布式调用机制及...

    tsung1.6.0

    **Tsung的安装与使用步骤:** 1. **下载与安装**:您可以从官方或者第三方站点(如文中提到的URL)下载Tsung 1.6.0版本的压缩包。解压后,按照Erlang的环境配置进行编译和安装。 2. **配置测试场景**:编辑`tsung....

    E4VM:小型便携式虚拟机,可以在嵌入式系统上运行Erlang

    综上所述,E4VM是一个旨在让Erlang在嵌入式系统上运行的轻量级解决方案,它通过C++实现,优化了内存管理和并发性能,是连接Erlang生态系统和嵌入式世界的重要桥梁。对于想要在嵌入式环境中利用Erlang强大功能的...

    Mnesia table fragmentation 过程及算法分析

    在分析 Mnesia 表分片的过程和算法之前,首先要理解分片的必要性和它所解决的问题。随着业务的发展,数据量会迅速增加,读写请求的次数也会大幅增长。为了保证服务的高可用性,系统需要能够在短时间内处理大量的读写...

    教育应用程序接口CNErloungeIII周爱民aimingoo约2530PPT概要.pptx

    高级语言接口允许开发者使用诸如Python、Ruby或ActionScript等语言与Erlang节点进行通信。这些接口通常通过socket通信协议实现,如http://dryverl.objectweb.org/和http://publish.itpub.net/zt/erlang/index.html...

    emqx-windows10-v3.2.2.zip

    2. **查找 bin 目录**:解压后,你需要进入解压得到的文件夹,然后找到名为 "bin" 的目录。这个目录包含了运行和管理 EMQ X Broker 所需的可执行文件。 3. **启动服务**:在 "bin" 目录下,你可以找到 "emqx" 命令...

    otp-src-23.3.2.tar.gz

    4. **验证安装**:安装完成后,你可以通过运行 `erl` 命令来启动 Erlang shell 来验证 OTP 是否成功安装。 5. **使用 OTP**:OTP 提供了丰富的库和框架,如 Mnesia(分布式数据库)、ERTS(Erlang 运行时系统)、 ...

    Joe Armstrong-面对软件错误构建可靠的分布式系统 2003 EN

    这些案例展示了如何使用Erlang和OTP构建大型、复杂的分布式系统,并且即使在软件出现错误的情况下也能保持系统的稳定性和可用性。 例如,在Ericsson的产品中,Erlang和OTP被广泛应用于电信交换机和其他关键基础设施...

    E语言搜索代码

    "E语言搜索代码"是一个与编程相关的主题,主要聚焦在使用E语言进行代码搜索的实践。E语言,全称为Erlang,是一种通用的、并发的、基于过程的、动态类型的编程语言,由爱立信公司开发,主要用于构建高可用性、容错性...

    EMQTT(Erlang MQTT消息服务器) v2.3.5 for windows7 x64

    3. **安装与使用EMQTT**: - 下载并解压EMQTT v2.3.5 for windows7 x64的压缩包。 - 运行服务器程序,启动EMQTT服务。 - 配置服务器设置,如端口、认证、权限等,这通常通过修改配置文件或使用管理界面完成。 - ...

    Rabbit详细使用手册

    - **配置与使用过程中的问题**: - 如何排查消息丢失、性能瓶颈等常见问题。 - 提供调试日志分析技巧和工具推荐。 通过上述内容的学习与实践,可以全面掌握 RabbitMQ 的安装、配置以及日常管理和维护工作,为构建...

Global site tag (gtag.js) - Google Analytics