http://previous.rabbitmq.com/v3_6_x/clustering.html
RabbitMQ Broker是一个或多个Erlang节点的逻辑分组,每个节点运行RabbitMQ应用程序,并共享users, virtual hosts, queues, exchanges, bindings, and runtime parameters.有时我们将节点集合称为集群。
RabbitMQ Broker操作所需的所有数据/状态将在所有节点之间复制。message queues是一个例外,默认情况下它驻留在一个节点上,但是它们是可见的,并且可以从所有节点访问。
RabbitMQ节点使用短域名或全限定域名(FQDNs)相互寻址。因此,所有集群成员的主机名必须能够从所有集群节点以及可能使用rabbitmqctl等命令行工具的机器上解析。
主机名解析可以使用任何标准os提供的方法:
- DNS records
- Local host files (e.g. /etc/hosts)
在限制更严格的环境中,DNS记录或主机文件修改是受限制的、不可能的或不需要的,Erlang VM可以配置为使用其他主机名解析方法,如备用DNS服务器、本地文件、非标准主机文件位置或方法的组合。这些方法可以与标准OS主机名解析方法协同工作。
集群可以通过以下几种方式创建:
- Manually with rabbitmqctl (e.g. in development environments)
- Declaratively by listing cluster nodes in config file
- Declaratively with rabbitmq-autocluster (a plugin)
集群的组成可以动态更改。所有RabbitMQ代理最初都在单个节点上运行。这些节点可以连接到集群中,然后再次转换回单个代理。
RabbitMQ代理允许单个节点的失败。节点可以随意启动和停止,只要它们能够在关机时联系到已知的集群成员节点。
RabbitMQ集群有几种处理网络分区的模式,主要是面向一致性的。集群是用来跨LAN使用的。不建议运行跨WAN的集群。The Shovel or Federation plugins是跨WAN连接代理的更好解决方案。注意,The Shovel or Federation plugins并不等同于集群。
当从一个主要或次要版本的RabbitMQ升级到另一个版本或升级Erlang时,必须关闭整个集群进行升级(因为集群不能像这样运行混合版本)。
RabbitMQ节点使用主机名彼此通信。因此,所有节点名必须能够解析所有集群节点的名称。对于rabbitmqctl等工具也是如此。
除此之外,默认情况下,RabbitMQ使用系统的当前主机名来命名数据库目录。如果主机名更改,将创建一个新的空数据库。为了避免数据丢失,必须设置一个固定的和可解析的主机名。当主机名改变时,您应该重启RabbitMQ:
$ /etc/init.d/rabbitmq-server restart
当节点位于数据中心或可靠网络上,但被防火墙分隔时,就会出现防火墙集群节点。同样,不建议通过WAN或节点之间的网络链接不可靠时进行集群。在最常见的配置中,您将需要打开一些标准端口:
- 4369: epmd, a peer discovery service used by RabbitMQ nodes and CLI tools
- 5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS
- 25672: used by Erlang distribution for inter-node and CLI tools communication and is allocated from a dynamic range (limited to a single port by default, computed as AMQP port + 20000). See networking guide for details.
- 15672: HTTP API clients and rabbitmqadmin (only if the management plugin is enabled)
- 61613, 61614: STOMP clients without and with TLS (only if the STOMP plugin is enabled)
- 1883, 8883: (MQTT clients without and with TLS, if the MQTT plugin is enabled
- 15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)
- 15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)
集群中的所有节点必须运行相同的Erlang小版本:19.3.4和19.3.6可以混合使用,但19.0.1和19.3.6(或17.5和19.3.6)不能混合使用。不同版本之间的Erlang/OTP补丁版本之间的兼容性可能有所不同,但这种情况通常很少见。
Client可以正常连接到集群中的任何节点。如果某个节点失败,而集群的其余部分节点正常,那么Client应该注意到关闭的连接,并且应该能够重新连接到集群中其他正常的节点。通常,不建议将节点主机名或IP地址放入client端应用程序中:这带来了不灵活性,如果集群的配置或节点数量发生变化,将需要编辑、重新编译和重新部署client端应用程序。我们推荐一种更抽象的方法:这可以是一个动态DNS服务,它具有非常短的TTL配置,或者一个普通的TCP负载均衡器,或者使用pacemaker或类似技术实现的某种移动IP。一般来说,管理到集群中节点的连接的这方面超出了RabbitMQ本身的范围,我们建议使用专门为解决这些问题而设计的其他技术。