`

[笔记]erlang集群常识(其实只是关于node的基本知识)

阅读更多

读书笔记 读书笔记 依旧是那本erlang/OTP并发编程实战 买了纸质书懊悔不已 已打算再买图灵的电子版了...哎~~

 

在本机上建立一个node网络 和好几台计算机分别建一个node然后连接差不多是一样的

 

1.建立节点

要建立节点是很简单的(以下的实验都是在win下做得):

分别在三个cmd下输入

erl -sname a
erl -sname b
erl -sname c

 当然还可以输入erl -name a 但在win下(至少是我这)会出错误:

写道
{error_logger,{{2013,7,10},{21,25,11}},"Can't set long node name!\nPlease check your configuration\n",[]}
{error_logger,{{2013,7,10},{21,25,11}},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,320}]},{proc_l
ib,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,6772},{stack_size,27},{reduc
tions,1921}],[]]}
{error_logger,{{2013,7,10},{21,25,11}},supervisor_report,[{supervisor,{local,net_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{pid,undefined},{name,net_kernel},{mfargs,{net_kernel,start_link,[[c2,longnames]]}
},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}
{error_logger,{{2013,7,10},{21,25,11}},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},{m
fargs,{erl_distribution,start_link,[]}},{restart_type,permanent},{shutdown,infinity},{child_type,supervisor}]}]}
{error_logger,{{2013,7,10},{21,25,11}},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,
net_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,2
39}]}]}},{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,{{2013,7,10},{21,25,11}},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

 过程如下

 

 

 

 

 

 

2.节点互联

接下去让节点间互联:

节点间:

nodes/0 %获得和当前node连接的所有node
net_adm:ping/1 %ping一个node 成功后就返回pong 失败返回pang(也许还有出错信息)
 

 

 图中用a去连b 再用a去连c 然后就可以看到a b c都联通了 

erlang 默认下用的是全连接的方式 如图:



 

3.cookie

cookie是保证连接顺利的一个重要因素

如果两个node的cookie相同 那么就可以连接(以上的abc都在本机中 c:\user\dell\.erlang.cookie中)

如果cookie不相同 也可以设置一下 设置之后的node就可以连接

还是以上的图 我们让节点a退出(在abc互联下 如果不退出直接用auth:set_cookie/1改掉a的cookie 那a的连接还是保持的)

a退出后 只有bc保持互联 

可以看到 bc 的cookie是:

'MGEHUYAYGOAWXUPWFKDN'

 a的:

(a@dell-PC)6> q().
ok
(a@dell-PC)7>
C:\Users\dell>erl -sname a
Eshell V5.10.2  (abort with ^G)
(a@dell-PC)1> auth:set_cookie('abcdefg123456789').
true
(a@dell-PC)2> net_adm:ping('b@dell-PC').
pang
(a@dell-PC)3>

 可见是pang 表示失败了

同时看一下b:

(b@dell-PC)2> auth:get_cookie().
'MGEHUYAYGOAWXUPWFKDN'
(b@dell-PC)3>
=ERROR REPORT==== 10-Jul-2013::22:16:31 ===
** Connection attempt from disallowed node 'a@dell-PC' **

 

不允许ab互联 当然 ac也不能互联了 现在能互联的只有 bc

这样可以保证节点之间的隔离 不至于发现一次误ping导致所有的节点都连在一起了

 

但如果一定要ab互联呢?? 这也是可以的 

既可以从a 设置 也可以从b设置:

使用:

auth:set_cookie/2

 代码如下:

(a@dell-PC)3> auth:set_cookie('b@dell-PC','MGEHUYAYGOAWXUPWFKDN').
true
(a@dell-PC)4> net_adm:ping('b@dell-PC').
pong
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
** Connection attempt from disallowed node 'c@dell-PC' **
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
** Connection attempt from disallowed node 'c@dell-PC' **
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
** Connection attempt from disallowed node 'c@dell-PC' **
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
** Connection attempt from disallowed node 'c@dell-PC' **
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
** Connection attempt from disallowed node 'c@dell-PC' **
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
** Connection attempt from disallowed node 'c@dell-PC' **
(a@dell-PC)5>
=ERROR REPORT==== 10-Jul-2013::22:20:20 ===
global: 'a@dell-PC' failed to connect to 'c@dell-PC'

 代码的步骤是在a中设置一下b的cookie 让a的node可以认可b的node 这样ab就可以互联

 然后a ping了一下b 可见pong 说明ping通了 但是产生了错误

错误时因为a和c不能连接 最开始bc是连接的 现在通过修改a让a认可b a和b之间可以互联 但是a和c之间并没有验证:

a 的nodes():
(a@dell-PC)5> nodes().
['b@dell-PC']


b的nodes():
(b@dell-PC)3> nodes().
['c@dell-PC','a@dell-PC']


c的nodes():
(c@dell-PC)2> nodes().
['b@dell-PC']

 如图:



 (为什么觉得和手工配路由有点像啊....)

也就是各种"全双工“的拓扑只要你想建就建得起来,....不过一般没那么无聊吧 汗....

 

以上说过如果已经连通了 修改cookie不对连接产生影响 验证如下:

(b@dell-PC)3> nodes().
['c@dell-PC','a@dell-PC']
(b@dell-PC)4> auth:set_cookie('123456').
true
(b@dell-PC)5> net_adm:ping('a@dell-PC').
pong
(b@dell-PC)6> net_adm:ping('c@dell-PC').
pong

 

 

 

 

 

总结一下命令吧:

erl -sname 名字 %建立一个node

net_adm:ping/1 %ping一个node pong就连接 pang表失败

auth:get_cookie/1 %获得当前node的cookie值

auth:set_cookie/1 %修改当前的node的cookie值(已连接下不会断开和其他node的连接)

auth:set_cookie/2 %第一个参数是另外一个node(node和cookie都是原子 用' ')第二个参数是那个node的cookie 用来让不同cookie的两个node连接

 

有错误一定要提啊...谢谢了

 

  • 大小: 36.7 KB
  • 大小: 39.6 KB
  • 大小: 11.2 KB
  • 大小: 12.1 KB
0
1
分享到:
评论
1 楼 chunzhenzyd 2015-12-23  
要在已连接的情况下彻底断开连接,可以先用disconnect_node/1, 再set一个不同的cookie。

相关推荐

    erlang高性能集群

    erlang的高性能集群服务器,erlang解决方案。 供大家学习使用

    高性能集群服务器Erlang解决方案

    ### 高性能集群服务器Erlang解决方案 #### Erlang简介及其特性 Erlang是一种专为构建高并发、高可用性和容错性系统而设计的编程语言与运行环境。其核心优势在于支持大规模并发处理能力,并能够实现分布式计算。...

    erlang 笔记

    ### Erlang程序设计知识点概述 #### 1. Erlang基础语法与函数定义 - **模块定义**: 在Erlang中,所有的代码都包含在模块之中。例如:`-module(tut).` 定义了一个名为`tut`的模块。 - **函数定义与导出**: 函数定义...

    nkcluster, 在大型Erlang集群中,管理作业的框架.zip

    nkcluster, 在大型Erlang集群中,管理作业的框架 Intoduction快速入门用例和部署方案启动和发现功能操作指南请求,任务和作业类失败方案失败配置文件简介NkCLUSTER是创建任何规模的Erlang节点集群,并将它的分配和...

    erlang 学习笔记1

    【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...

    Erlang基础知识集锦

    Erlang基本语法包括: - 模块:源文件扩展名为.erl,编译后的文件扩展名为.beam,编译命令为c(Modulename)。 - 工作目录的改变:通过在用户目录下创建.erlang文件夹,并在其中设置工作目录来实现。 - 符号使用:逗号...

    erlang节点连通测试

    Erlang是一种面向并发的、强类型、动态类型的编程语言,尤其在...以上就是关于Erlang节点连通测试和按需连接的相关知识。理解并熟练掌握这些概念和技巧,将有助于你在构建分布式Erlang系统时实现高效、可靠的节点通信。

    Erlang趣学指南

    书中从Erlang的基础知识讲起,融汇所有的基本概念和语法。 这是一本讲解Erlang编程语言的入门指南,内容通俗易懂,插图生动幽默,示例短小清晰,结构安排合理。书中从Erlang的基础知识讲起,融汇所有的基本概念和...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    erlang 中文基础教程

    ### Erlang 中文基础教程:理解Erlang Shell与模块函数 #### 1. Erlang Shell:编程者的交互式环境 Erlang Shell是Erlang编程语言提供的一种交互式编程...掌握这些基础知识,是深入学习Erlang编程语言的重要一步。

    erlang中文基础教程

    "Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的...

    erlang资源

    《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发基于轻量级进程(Lightweight Processes, LSPs),这些进程间的通信通过消息传递实现,这与传统的线程模型不同,具有更好的隔离性和...

    两本erlang电子书

    第一部分介绍Erlang语言的基础知识,包括其语法特性、并发模型和错误处理策略。读者将了解Erlang的模式匹配、函数式编程概念以及如何利用轻量级进程进行并发编程。第二部分深入探讨OTP,讲解其设计原则和组件,如...

    inside Erlang VM3

    它运行在Erlang虚拟机(Erlang Virtual Machine, ERTS)之上,ERTS提供了语言的基础执行环境。 #### ERTS的核心优势 - **高性能**:通过轻量级进程模型、高效的内存管理机制和优秀的并行处理能力实现了高性能。 - *...

    Node.js-Clusterluck-以node.js编写的类似于erlang的分散式分布式系统的库

    Clusterluck 的核心理念就是将 Erlang 的这些优秀特性引入到 Node.js 中,使开发者能利用 Node.js 的生态系统同时享受 Erlang 风格的并发和分布式处理优势。 Clusterluck 库的主要特点和功能包括: 1. **进程模型*...

    erlang_gproc_扩展实现Erlang的全局ets

    Erlang是一种面向并发的、函数式编程语言,被广泛应用于分布式系统和高可用性服务。在Erlang中,ETS(Erlang Term Storage)是内置的一种高效、内存中的数据库,用于存储和检索Erlang术语。然而,ETS的一个限制是它...

    erlang趣学指南

    Erlang趣学指南是一本面向初学者的入门书籍,旨在帮助读者从零开始学习Erlang语言的基础知识和编程技巧。 这本书的作者Fred Hébert是一位在一线拥有丰富实战经验的工程师,他通过轻松幽默的文风和清晰的讲解,向...

    erlang深度分析.pdf

    ### Erlang深度分析知识点 #### 1. Erlang VM分析 Erlang的虚拟机(VM)即Erlang Runtime System(ERTS),是Erlang系统运行的基础。它支持轻量级进程,提供了高效的并发处理能力。在性能方面,ERTS经过优化,能够...

    erlang程序设计中文版

    本书不仅覆盖了Erlang的基础知识,还包括并发编程和分布式编程的深入内容。Erlang的设计为程序员提供了处理并发问题的强有力工具,使得程序能够以一种更接近真实世界交互的方式来模拟人类思考过程。 本书适合初学者...

Global site tag (gtag.js) - Google Analytics