RabbitMQ集群Erlang知识扩展

简介:

Erlang是 一种通用的面向并发的编程语言

Erlang的推出则是为了打造一款高并发高扩展性的实时系统。例如应用于电信,银行,商业,即时通讯等场合。Erlang的运行时系统内置了对并发,分布式,容错等的处理。

Erlang的容错能力是它与生俱来的的能力,因为这是电信领域的重要需求。但是这并不代表Erlang是复杂的、不具表达力的。

OTP包含了一组库和实现方式,可以构建大规模、容错和分布式的应用程序,包含了许多强大的工具,能够实现H248,SNMP等多种协议,核心概念是OTP行为,可以看作一个用回调函数作为参数的应用程序框架,类似一个J2EE容器。行为负责解决问题的非函数部分,回调函数负责解决函数部分。

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节点的连接模式为非完全连接,即该节点仅仅保存和他直接通信的节点状态,非直接连接的节点状态不理会。 



本文转自 OpenStack2015 51CTO博客,原文链接:http://blog.51cto.com/andyliu/1902266,如需转载请自行联系原作者

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
2259 91
|
边缘计算 负载均衡 NoSQL
FreeMQTT Plus: 一个新型 MQTT Broker 集群的实现
FreeMQTT Plus 是一款基于 MQTT 协议的高性能消息中间件,采用分布式架构解决单点瓶颈问题。其核心由 Nginx 负载均衡器、黑(A)节点(MQTT Broker)、白(B)节点(消息路由)和日志(L)节点组成。通过无主从设计,支持高可用性、负载均衡与灵活扩展。针对会话同步、消息路由等挑战,FreeMQTT Plus 利用 MQTT5 特性定义元命令,实现节点间高效通信,无需依赖第三方组件。适用于物联网海量设备接入与高并发场景,为未来边缘计算和多级集群部署提供坚实基础。
2294 74
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
3923 3
|
消息中间件 RocketMQ
2024最全RocketMQ集群方案汇总
在研究RocketMQ集群方案时,发现网上存在诸多不一致之处,如组件包含NameServer、Broker、Proxy等。通过查阅官方文档,了解到v4.x和v5.x版本的差异。v4.x部署模式包括单主、多主、多主多从(异步复制、同步双写),而v5.x新增Local与Cluster模式,主要区别在于Broker和Proxy是否同进程部署。Local模式适合平滑升级,Cluster模式适合高可用需求。不同模式下,集群部署方案大致相同,涵盖单主、多主、多主多从等模式,以满足不同的高可用性和性能需求。
2247 0
|
消息中间件 存储 负载均衡
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
410 2
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
389 4
|
消息中间件 Prometheus 监控
消息队列 MQ使用问题之如何将旧集群的store目录迁移到新集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
消息中间件 Kafka API
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
面试题Kafka问题之RabbitMQ的扩展和二次开发如何解决
312 1
|
消息中间件 负载均衡 算法
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
962 2