RabbitMQ 集群

1、集群简介html

      一个RabbitMQ broker是一个或者几个Erlang节点的一个逻辑分组,每一个节点运行着RabbitMQ应用和共享用户、虚拟主机、队列、交换机等等。有时候咱们把这些节点集合做为集群。node

      为了作到可靠、可扩展和ACID属性,全部数据或者状态都须要RabbitMQ broker复制到全部节点。对此,一个例外是消息队列,默认驻留在建立它们的节点上,虽然它们对于全部节点都是可访问和可见的。经过节点在集群内复制队列,能够参见这里(须要注意的是首先必须是集群)。服务器

      RabbitMQ不能很好的处理分区容忍,因此它不能用于WAN。shovel或者federation插件很能很好的解决这个问题。cookie

    集群的配置可以被动态地改变。全部RabbitMQ broker在一个单独的节点上开始运行,这些节点可以被加入到集群中,随后又能转换成单独的broker。网络

      RabbitMQ broker容忍个别节点的失败。节点可以被随意的启动和中止。数据结构

一个节点能够是磁盘节点或者内存节点(注意:diskdisc在使用上是可交换的,配置语法或者状态消息一般使用disc)。 内存节点保持它们的状态仅仅在内存中(队列内容除外,若是队列持久化或者太大不能放在内存中则驻留在磁盘上)。磁盘节点保持状态在内存中和磁盘上。内存节 点不会像磁盘节点同样写入到磁盘,所以性能更佳。然而,须要注意的是队列数据一直存储在磁盘上,性能的提高仅仅影响到资源管理(例如:添加/删除队列、交 换机、或者虚拟机),而不是发布和消费速度。由于状态复制到集群内全部节点,因此集群内能够只有一个磁盘节点(可是不推荐)用于存储集群状态。app

 

2、集群副本负载均衡

接下来是一个设置和操做RabbitMQ集群的副本,其经过三台机器构成一个集群,分别是rabbit一、rabbit二、rabbit3,其中两台机器复制数据到内存和磁盘,另一台仅仅复制数据到内存中。tcp

咱们假设用户登陆到全部的三台机器上,RabbitMQ已经安装到机器上了,rabbitmq-server和rabbitmqctl脚本已经在用户PATH里了。分布式

一、初始化设置

Erlang节点使用cookie来检测它们之间是否容许通讯,若是两个节点可以通讯,那么它们必须拥有相同的cookie。

Cookie仅仅是一个含有文字与数字的字符串,若是你喜欢其能够是long或者short。

RabbitMQ服务器启动的时候,Erlang将自动建立随机cookie文件。这个文件通常位于/var/lib/rabbitmq/.erlang.cookie。最简单的方式是容许其中一个节点建立cookie文件,而后将其拷贝到集群内全部其它节点。

做为一种选择,你能够在调用rabbitmq-server和rabbitmqctl脚本时插入选项“-setcookie cookie”。

二、启动独立节点

      用正常的方式在全部节点上启动RabbitMQ,具体以下:

rabbit1$ rabbitmq-server -detached

rabbit2$ rabbitmq-server -detached

rabbit3$ rabbitmq-server -detached

      如此,则建立了三个独立的RabbitMQ broker,每一个节点上一个,能够经过以下命令查看集群状态:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

三、建立集群

      为了将三个节点连入集群中,咱们将其中两个节点加入到第三个节点的集群中,好比:将rabbit@rabbit2和rabbit@rabbit3加入到rabbit@rabbit1。

      咱们首先将rabbit@rabbit2做为内存节点加入到rabbit@rabbit1的集群中,以下操做便可达到目的:

rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl join_cluster --ram rabbit@rabbit1
Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
rabbit2$ rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.

      须要注意的是加入一个集群会隐式重启该节点,所以节点上以前存在的资源和数据都会被删除。

      在任意节点上运行rabbitmqctl cluster_status都会看到这两个节点已经一个集群中了,具体以下:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.

      如今咱们能够将rabbit@rabbit3以磁盘节点模式加入相同的集群。加入步骤跟上面相似,但不一样的是要删除—ram标志,由于默认就是磁盘节点模 式。实际上,在将节点加入集群时,能够选择集群内任何在线节点,而不必定是rabbit@rabbit1,这里选择的就是rabbit@rabbit2, 具体请看以下:

rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl join_cluster rabbit@rabbit2
Clustering node rabbit@rabbit3 with rabbit@rabbit2 ...done.
rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

      一样,在任意节点上运行rabbitmqctl cluster_status都会看到这三个节点已经一个集群中了,具体以下:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit3]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit3,rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit3]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit3,rabbit@rabbit1,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
...done.

      按上述步骤,只要集群处于运行状态,咱们能够随时加入一个新的节点到集群中。

四、改变节点类型

      咱们能改变将节点类型从内存改成磁盘,反之亦然。咱们可使用rabbitmqctl change_cluster_node_type命令来改变节点类型,但节点必须先rabbitmqctl stop_app。接下来的实例演示如何将上面集群中的rabbit@rabbit2改成磁盘节点,rabbit@rabbit3改成内存节点:

rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl change_cluster_node_type disc
Turning rabbit@rabbit2 into a disc node ...
...done.
Starting node rabbit@rabbit2 ...done.
rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl change_cluster_node_type ram
Turning rabbit@rabbit3 into a ram node ...
rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

五、重启集群节点

      集群中的节点能够随时被停在,固然崩溃也没问题。在这两种状况下,集群中的其他节点将继续工做而不受影响,当已中止或崩溃的节点再次启动时,其他节点会自动“catch up”。

      咱们关闭节点rabbit@rabbit1和rabbit@rabbit3,而后检查集群状态,具体以下:

rabbit1$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit1 ...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit3,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit2,rabbit@rabbit1]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit3$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit3 ...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2]}]
...done.

      如今咱们再次启动这两个节点,而后检查集群状态,具体以下:

rabbit1$ rabbitmq-server -detached
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmq-server -detached
rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit2,rabbit@rabbit1]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
...done.

      有一些重要的注意事项须要提出来,具体以下:

      (1)不管什么时候,集群中至少要有一个磁盘节点处在运行中,以防止数据丢失。在不少状况下,RabbitMQ将会阻止建立一个仅仅有内存节点的集群,可是它不会阻止你中止或者重置全部磁盘节点,这将致使一个仅仅有内存节点的集群出现。这样作是不可取的,这会很容易丢失数据。

      (2)当整个集群brought down时,最后一个go down的节点必须第一个brought online。若是这种状况不会发生,则全部节点将等待30秒用于等待最后一个磁盘节点上线,若是最后一个节点离线不能起来,则不能使用rabbitmqctl forget_cluster_node命令将其从集群中移除,具体查看rabbitmqctl帮助页面已得到更多信息。

六、解散集群

      当节点想要脱离集群时,须要显示地从集群中将其移除。咱们首先移除rabbit@rabbit3,须要经过以下操做才能将其从集群中移除:

rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl reset
Resetting node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl start_app
Starting node rabbit@rabbit3 ...done.

      能够经过在该节点上运行rabbitmqctl cluster_status命令来证明其再也不是集群成员:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

      咱们也能够远程移除节点,例如:当不得不处理一个无应答的节点时,这很是有用。下面演示从rabbit@rabbit2移除rabbit@rabbit1:

rabbit1$ rabbitmqctl stop_app
Stopping node rabbit@rabbit1 ...done.
rabbit2$ rabbitmqctl forget_cluster_node rabbit@rabbit1
Removing node rabbit@rabbit1 from cluster ...
...done.

      须要注意的是此时rabbit@rabbit1任然认为其还在rabbit@rabbit2的集群中,可是当尝试着启动它时会返回错误。咱们须要重置它已让其能够再次被启动:

rabbit1$ rabbitmqctl start_app
Starting node rabbit@rabbit1 ...
Error: inconsistent_cluster: Node rabbit@rabbit1 thinks it's clustered with node rabbit@rabbit2, but rabbit@rabbit2 disagrees
rabbit1$ rabbitmqctl reset
Resetting node rabbit@rabbit1 ...done.
rabbit1$ rabbitmqctl start_app
Starting node rabbit@mcnulty ...
...done.

   再次运行分别在三个节点上运行rabbitmqctl cluster_status命令,会发现它们都各自独立运行着RabbitMQ broker:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
...done.

      须要注意的是rabbit@rabbit2此时仍保持着集群的残余状态,然而rabbit@rabbit1和rabbit@rabbit3的 RabbitMQ broker则是清新的初始状态。若是咱们想让rabbit@rabbit2也这样须要其执行相同的步骤:

rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl reset
Resetting node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.

七、自动配置集群

      除了经过命令能够实现集群外,还能够经过配置文件来实现集群,配置文件能够参看这里,也能够参看这里。在该文件中设置cluster_nodes域,该域是一个tuple包含一个节点列表,一个atom指示是磁盘仍是内存节点。

      若是cluster_nodes被指定,RabbitMQ将尝试着集群节点列表中全部拥有相同Erlang和RabbitMQ版本的在线节点。

      须要注意的是集群配置仅仅应用于新节点。新节点是指刚被重置或者第一次启动的节点。所以,自动集群不会在重启节点后当即生效。这意味着经过rabbitmqctl对集群发生的任何改变都优先于自动集群配置。

      下面咱们将演示如何把三个独立的节点加入集群,其中rabbit@rabbit1和rabbit@rabbit2为磁盘节点,为了确保全部节点的干净,首先咱们须要重置和中止全部节点,具体以下:

rabbit1$ rabbitmqctl stop_app
Stopping node rabbit@rabbit1 ...done.
rabbit1$ rabbitmqctl reset
Resetting node rabbit@rabbit1 ...done.
rabbit1$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit1 ...done.
rabbit2$ rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl reset
Resetting node rabbit@rabbit2 ...done.
rabbit2$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit2 ...done.
rabbit3$ rabbitmqctl stop_app
Stopping node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl reset
Resetting node rabbit@rabbit3 ...done.
rabbit3$ rabbitmqctl stop
Stopping and halting node rabbit@rabbit3 ...done.

      如今咱们设置配置文件中重要的域,具体以下:

[
  ...
  {rabbit, [
        ...
        {cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], disc}},
        ...
  ]},
  ...
].

      例如:若是这是咱们须要设置的域,那么咱们将简单地建立RabbitMQ配置文件,并设置上面的所示的域便可。

      若是想让rabbit@rabbit3成为内存节点,咱们须要修改rabbit@rabbit3的配置文件以下:

[
  ...
  {rabbit, [
        ...
        {cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], ram}},
        ...
  ]},
  ...
].

      这是标准的Erlang配置文件,更多详细信息能够参看RabbitMQ配置向导和Erlang配置帮助

      若是修改了配置文件,能够简单地启动节点:

rabbit1$ rabbitmq-server -detached
rabbit2$ rabbitmq-server -detached
rabbit3$ rabbitmq-server -detached

      分别在这三个节点上运行rabbitmqctl cluster_status,能够看到这三个节点都已加入集群:

rabbit1$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit2$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.
rabbit3$ rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit3 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]},{ram,[rabbit@rabbit3]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]
...done.

      须要注意的是:为了从自动集群配置中移除一个节点,首先须要从集群中别的节点的配置文件中将其移除。

 

3、升级集群

      当RabbitMQ升级major或者minor版本时(好比:从3.0.x到3.1.x或者从2.x.x到3.x.x),或者升级Erlang时,整个 集群必须停掉。可是当升级RabbitMQ补丁(例如:从3.0.x到3.0.y)时就不须要这样。这些版本都能被固化到集群中(可是除了3.0.0及后 来的3.0.x系列)。

      当RabbitMQ升级major或者minor版本时,若是必要RabbitMQ将自动更新其持久化的数据结构。在集群中,这项任务由第一个启动的磁盘 节点来执行。所以,当升级RabbitMQ集群时,不该该尝试启动任何内存节点,任何内存节点启动时都会发出一个错误消息而后失败。

      提早中止即将升级的磁盘节点,并在升级完后首先启动它,这是个好主意,但这不是绝对必须的。不然,在升级节点中止和最后节点中止之间,集群配置的改变将会丢失。

      只有RabbitMQ 2.1.1及其之后版本能够自动升级,若是有更早版本的集群,你须要重建集群来完成升级。

 

4、单机器集群

      在某些环境下,在单机器上运行集群的全部节点是颇有用的。很是典型的应用是:在桌面或便携式机器上经过启动几个虚拟机来实验集群。在单机器上运行多个节点 有两个主要的要求:(1)每一个节点有惟一的名称;(2)针对每种协议,每一个节点绑定到惟一的IP和端口号对。

      能够经过手动重复调用rabbitmq-server来在同一主机上启动多个节点。必须确保每次调用时设置的环境变量RABBITMQ_NODENAME和RABBITMQ_NODE_PORT都有合适的值。例如:

$ RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
$ RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=hare rabbitmq-server -detached
$ rabbitmqctl -n hare stop_app
$ rabbitmqctl -n hare join_cluster rabbit@`hostname -s`
$ rabbitmqctl -n hare start_app

      上面将创建两个节点的集群。

 

5、防火墙节点

      防火墙集群节点的经典案例是:节点在数据中心或者可信网络中,可是被防火墙分离。一样,不推荐在WAN或者不可信网络上架设集群。

      若是集群中不一样节点在同一数据中心,可是在防火墙后面,这样就必须修改配置以确保是内部节点通讯。Erlang使用empd(Erlang Port Mapper Daemon)来解析集群内节点名称。

      缺省epmd端口号是4369,可是能够经过环境变量ERL_EPMD_PORT改变其值。全部节点必须使用一样的端口号。防火墙必须容许集群内节点在这个端口上传输数据。更详细的信息请参看Erlang epmd帮助

     一旦分布式Erlang节点地址经过epmd已经被解析了,其它节点将经过Erlang分布式节点协议尝试使用该地址直接通讯。通讯端口号范围能够经过Erlang内核APP的两个参数来配置:

      inet_dist_listen_min

      inet_dist_listen_max

      防火墙必须容许集群内节点经过这个范围内的端口号传递数据(假设全部节点使用一样的端口号范围)。缺省端口号范围不受限制。更详细的信息能够参看Erlang内核APP帮助

 

6、客户端链接集群

    客户端能够链接集群内任何节点。若是被链接节点崩溃可是集群内其它节点还健在,则客户端通知链接关闭,而后重连集群内其它节点。一般,将节点主机 名或者IP地址写死在客户端APP中是不合适的,这会致使当集群配置改变或者集群节点数改变时,客户端须要从新编辑、编译、部署。相反,建议更抽象的方 式:能够是动态DNS服务,其有简短的TTL配置,或者TCP负载均衡,或者移动IP排序或者类似技术。通常,管理集群内节点的链接已经非 RabbitMQ自己能力所及,建议使用其它技术来解决此类问题。

 

7、注意事项
一、host问题
        集群节点之间可以互相访问,所以,每一个集群节点的host文件中都须要配置集群内全部节点的信息,以保证能互相解析,具体以下:
        #vi /etc/hosts
        172.28.14.223 ZS-QA-01
        172.28.14.224 ZS-QA-02
        172.28.14.225 ZS-QA-03
        好比:3个节点的集群,172.28.14.223/224/225三台机器的hostname分别是ZS-QA-01/02/03。
        若是不知道本机hostname能够经过如下命令查看:
        #cat /proc/sys/kernel/hostname

二、cookie问题
        RabbitMQ的集群彻底依赖于Erlang集群,而Erlang集群经过cookie来进行通讯认证,所以,集群内全部节点的cookie必须相同,通常采用第一个节点的cookie便可。
        默认状况下,Erlang的cookie文件在$HOME目录下,且是隐藏文件名为.erlang.cookie,能够拷贝第一个节点的cookie文件到集群内其它节点。
        cookie文件仅仅能被own访问,所以,须要将此文件权限改成-r--------,不然启动RabbitMQ时,会出现以下错误:
        [dev@ZS-QA-02 sbin]$ (./rabbitmq-server &)
        [dev@ZS-QA-02 sbin]$ {error_logger,{{2013,5,3},{16,9,29}},"Cookie file /home/dev/.erlang.cookie must be accessible by owner only",[]}

        文件权限能够经过以下命令来修改:
        #chmod -w .erlang.cookie
        #chmod g-r .erlang.cookie
        #chmod o-r .erlang.cookie
三、端口问题
        RabbitMQ默认监听5672端口,若是须要更改端口号,只须要在etc/rabbitmq目录下新建rabbitmq.config文件,并在该文件输入以下内容便可:
        [
            {rabbit, [{tcp_listeners, [22221]}]}
        ].
        具体关于配置的详细信息请参看这里

相关文章
相关标签/搜索