分布式的Erlang/OTP介绍
guibin.beijing@gmail.com
Erlang仅仅能在具有相同的magic cookie系统之间的直接对话。如果想要在几台机器之间运行相互通信的Erlang程序,最简单的方法就是放置一个名叫".erlang.cookie"的文件在每个机器的$HOME目录里,并且把该文件的权限设置为400,该文件的内容即cookie名字。400权限意味着该文件仅能被此文件的owner访问。
引用
$ cd
$ cat .erlang.cookie
this is very secret
$ chmod 400 .erlang.cookie
Erlang支持分布式通信的两大基石
1. 进程间通过拷贝通信(Process communication by copying)
2. 透明的位置信息(Location transparency)
Erlang自己会保证进程标识符在运行网络上的唯一,即便是跨机器(Erlang guarantees that process identifiers are unique on the network, even across machines.)也一样。
每一个Erlang VM都叫作一个节点(Node),当两个或者多个Node都知道了对方之后,这些节点就形成了集群(Cluster)。Erlang集群默认情况下是完全连接(fully connected)的,即Erlang集群中的每一个节点都知道每一个其他的节点,并且相互之间能够直接通信。正因为如此,在实际中Erlang通常只有几十个节点,一般不会有几百个或者更多的节点,因为在完全连接的网络中,节点越多,保持节点之间的通信开销越大。
但是可以通过某个特殊的节点,将多个cluster连接成一个更大的cluster,这样的cluster不是完全连接的,cluster直接是通过这个特殊的节点连接的。
在Erlang集群中,节点不会主动去寻找其他节点,除非他寻找其他节点有事要做;在找到其他节点之后,他们会相互追踪对方,并且交换彼此所知道的其他节点信息,以便于形成一个完全连接的网络。
每个节点都有自己的名字(Name),其他节点就是通过这个名字来查找到该节点,并且与之交互。通过内建函数node()可以取得当前节点的名字,节点的名字格式为:
nodename@hostname。如果一个节点运行在非分布式模式下,则该节点的名字默认是
nonode@nohost。在单台机器上允许同时运行多个节点。
如何启动一个节点?
启动一个节点可以使用命令
引用
erl -name my_node_name
-name选项用在有DNS正常工作的普通网络中,即可以正常使用完全限定名(fully qualified name)的网络环境中。
或者
引用
erl -sname my_node_name
当完全限定名(fully qualified name)不起作用的时候,使用-sname选项。这种情况经常发生在局域网的生产环境中。比如在局域网中不能通过域名访问其他机器时,你只能使用短名称(sname)访问。
只要所有节点都在同一个子网中,短名称就起作用。
使用短名称和长名称的节点会使用不同的通信模式工作。在同一个Erlang集群中,所有节点必须使用统一的通信模式,或者使用长名称,或者都是用短名称,不可混用。
当Erlang VM作为一个节点运行时,他的节点名称会显示在命令行提示符中,比如我启动了一个名叫guibin的短名称节点:
引用
$ erl -sname guibin
Erlang R14B01 (erts-5.8.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.2 (abort with ^G)
(guibin@localhost)1>
Erlang nodes是如何找到对方并通信?
负责Erlang节点间通信的是一个叫作epmd(Erlang Port Mapper Daemon)的后台线程。如下:
引用
$ ps ax | grep epmd
305 ?? S 0:00.02 /opt/local/lib/erlang/erts-5.8.2/bin/epmd -daemon
513 s003 U+ 0:00.00 grep epmd
当启动一个node时,node会检查本机是否有epmd在运行,如果没有则启动epmd。epmd启动之后会跟踪记录所有本机运行的node和这些node被分配的端口号。
当一个在本机的node想和远程的node通信时,本地的epmd首先会和远程的epmd通信(默认在4369端口上使用TCP/IP),询问是否有相应的node在那里运行。如果有,则远程的epmd会响应请求,并直接和本地的epmd通信。
但是epmd不会自动去寻找其他的epmd,这些通信和寻找过程必须被node的查找操作触发。
注意:Erlang默认的分布模型是基于所有集群中的机器都运行在一个被信任和可靠的网络中。如果实际运行的网络环境并非如此信任和可靠,而是通过广域网连接,则集群中的机器间通信应该直接使用TCP(或者UDP,或者SCTP)。或者也可以基于SSL、SSH或者IPsec建立隧道通信。
Erlang基于cookie的安全系统
如果在一台机器上至少启动过一次node之后,就会生成cookie文件。初次启动node,node会自动生成由随机字符串组成的cookie。默认情况下,一个node认为其他的能和他通信的node
都具有相同的cookie。
推荐只有owner才对cookie文件具有读的权限,即400。
Erlang分布式控制常用命令选项
命令
erl用来启动Erlang的运行时系统(Erlang runtime system)。
引用
-name NodeName
这个选项使得启动的Erlang的运行时系统处于分布式模式下,节点名称为NodeName@FullyQualifiedName。
引用
-sname NodeName
这个选项使得启动的Erlang的运行时系统也处于分布式模式下,节点名称为NodeName@ShortName。
引用
-setcookie Cookie
该选项设置当前节点的Magic Cookie为Cookie,而不使用默认的~/.erlang.cookie中的内容作为Cookie。
引用
-connect_all false
这个选项设置该启动节点和其他Erlang节点的连接模式为非完全连接,即该节点仅仅保存和他直接通信的节点状态,非直接连接的节点状态不理会。
分享到:
相关推荐
Erlang/OTP(Open Telecom Platform)是Ericsson AB自1997年起开发的一套强大的分布式软实时运行环境,主要设计用于构建高可用性、高并发、分布式应用。其核心语言Erlang是一种函数式编程语言,特别适用于处理大量...
Erlang OTP是Erlang编程语言的核心组件,它提供了强大的并发处理、分布式计算和容错能力,广泛应用于电信、互联网服务以及实时系统等领域。在Windows操作系统上,Erlang OTP通常提供为预编译的64位版本,如"erlang-...
Erlang OTP (Open Telephony Platform) 是一种高级并发编程语言和框架,主要由瑞典电信设备制造商Ericsson开发,用于构建高度可靠、可扩展和实时的分布式系统。Erlang OTP 25.0是该平台的一个版本,特别针对Windows ...
Erlang OTP是Erlang编程语言的核心组成部分,它提供了分布式计算、并发处理、热代码升级和容错恢复等一系列强大的功能。在安装RabbitMQ,一个广泛使用的开源消息代理和队列服务器之前,通常需要先安装Erlang环境。...
**Erlang/OTP 中文手册(R11B)** ...通过深入学习这份手册,读者不仅可以掌握Erlang语言的基本语法,还能了解如何利用OTP构建健壮的分布式系统,为在高并发、高可用性场景下开发软件打下坚实基础。
Erlang是一种并发性能极佳的编程语言,而OTP(Open Telecom Platform)是其生态系统的一部分,提供了强大的软件开发框架,特别是对于构建分布式系统。RabbitMQ则是基于Erlang构建的开源消息代理和队列服务器,广泛...
文件名"otp_src_25.1"代表了OTP的源代码包,OTP是Erlang的标准库和框架,包含了大量用于构建可靠分布式系统的模块和工具。 为了构建Erlang 25.1版本,你需要按照以下步骤操作: 1. **下载源代码**:首先,你需要从...
Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...
4. 分布式应用(Distributed Applications):Erlang/OTP支持分布式编程,允许开发者构建跨越多台机器运行的并发系统。分布式应用可以启动、停止和配置为分布式环境,同时还包括故障转移和接管机制,保证了分布式...
Erlang在1991年由爱立信公司向用户推出了第一个版本,经过不断的改进完善和发展,在1996年爱立信又为所有的Erlang用户提供了一个非常实用且稳定的OTP软件库并在1998年发布了第一个开源版本。Erlang同时支持的操作...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和容错性强的系统。在IT领域,Erlang因其强大的实时性和并发处理能力,尤其在通信、网络和云计算等领域...
第二部分讲解如何在实际开发中逐一添加otp 高级特性,从而完善应用,作者通过贯穿本书的主项目——加速web 访问的分布式缓存应用,深入浅出地阐明了实践中的各种技巧;第三部分讨论如何将代码与其他系统和用户集成,...
以下将详细介绍Erlang OTP 19.0中的关键知识点: 1. **并发和并行处理**:Erlang的设计使其在处理并发和并行任务方面表现出色。它通过轻量级进程(Lightweight Processes, LWP)实现并发,这些进程消耗的资源很少,...
**OTP (Open Telecom Platform) for Windows 64位 25.0.1 版本:ErLang 下载** ErLang是一种高级并发编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高度可靠和可扩展的分布式系统。OTP(Open Telecom ...
Erlang是一种强大的编程语言,特别适合于构建高并发、分布式和容错性强的系统。由爱立信的CS-Lab开发,Erlang的设计目标是处理大规模并发活动,这在传统的操作系统上可能非常困难。它的核心特性使其在处理并发性、...
Erlang OTP(Open Telephony Platform)是一种开源的编程语言和框架,专为构建高度并发、分布式和容错系统而设计。"Erlang otp_win64_21.2.exe" 是Erlang OTP在Windows 64位平台上的一个特定版本,编号为21.2。这个...
Erlang是一种强大的编程语言,尤其在分布式计算、并发处理和实时系统中有着广泛的应用。OTP(Open Telecom Platform)是Erlang的核心组件,提供了一系列的库和设计原则,用于构建可靠、可扩展的系统。在Linux CentOS...
Erlang/OTP是一款功能强大的并发编程语言和运行环境,特别适用于构建高可用性、分布式的应用程序。通过上述内容,您可以了解到Erlang/OTP的基本安装与构建流程,以及在使用过程中可能会遇到的一些问题及其解决方法。...