RabbitMQ 集群搭建

2016-06-05 11:26:57   最后更新: 2016-07-05 22:49:42   访问数量:1549




在前面的日志中,我们介绍了 RabbitMQ 的分布式架构 broker:

分布式架构 Broker 简介

在 RabbitMQ 中,一个或几个 Erlang node 的逻辑分组组成了一个 broker

每个 Erlang node 上运行着 RabbitMQ 应用并共享着 user、vhost、queue、exchange 等

通常,我们把 node 集合称之为集群

运行 RabbitMQ broker 所需的所有数据和状态都在所有 node 中是可复制的,这样增强了可靠性与可扩展性

但是,默认情况下,每个消息队列中的数据都仅存在于创建他的那个 node 上面,尽管对于其他 node 都是可见的

在高可用模式(镜像模式)下,每个镜像队列包含一个 master 和若干 slaver,他们之间存在着复制的关系,当 master 因为各种原因突然消失(挂掉),最老的 slaver 会自动变成新的 master

 

RabbitMQ 的节点是通过一个 cookie 来决定是否与另一个节点组成集群的,两个可以互相通信的节点必须具有相同的 Erlang cookie,他是一个共享的密码

在安装 RabbitMQ 的时候,RabbitMQ 默认在 /var/lib/rabbitmq/.erlang.cookie 文件中写入了 Erlang cookie 并保证了他的唯一性

如果你希望若干 RabbitMQ 节点组成集群,你需要手动配置这些节点的 .erlang.cookie 文件,将其中已有的 cookie 字符串改为任意相同字符串

 

RabbitMQ 的节点分为磁盘节点和内存节点:

 

内存节点

内存节点的状态信息只存储在内存中,只有在队列配置了 persistent 属性,或者队列中的数据量过大,节点才会将队列中的数据存放到磁盘上

因此内存节点具有高效的特点,但是一旦宕机,内存中的数据是不可恢复的

 

磁盘节点

磁盘节点同时在内存和磁盘上保存状态信息与队列数据,虽然性能有所下降,但是他可以保证节点数据的可靠性

 

通常的建议是,集群中只配置一个磁盘 node,用来保证集群的安全性,而多个内存节点用来提高集群的工作性能

 

每个 RabbitMQ 节点都通过域名访问其他节点的,你可以通过 DNS 或 host 文件来配置域名的解析

有下面四种方式搭建队列:

  1. 通过 rabbitmqctl 手动配置
  2. 在配置文件中列出集群中的所有 node
  3. 通过开源软件 -- rabbitmq-autocluster
  4. 通过开源软件 -- rabbitmq-clusterer

上面所列出的后两个开源集群管理工具可以在 github 上找到他们的源代码:

rabbitmq-autocluster

rabbitmq-clusterer

 

rabbitmq 的集群是可以动态改变的,每个 node 都可以随意的启动或停止

 

同步 COOKIE

我现在有三台机器:se1、se2 和 se3,我就准备用这三台机器搭建一个 rabbitmq 集群

首先,保证三台机器在一个局域网中,并且更新三台机器的 /etc/hosts 文件,让他们彼此可以识别

然后,将 se1 机器中的 /var/lib/rabbitmq/.erlang.cookie 文件中的 cookie 值 copy 出来覆盖 se2、se3 两台机器的相应文件,并在 se2、se3 机器上分别执行下列文件更新 .erlang.cookie 文件的权限:

sudo chmod -w /var/lib/rabbitmq/.erlang.cookie sudo chmod g-r /var/lib/rabbitmq/.erlang.cookie sudo chmod o-r /var/lib/rabbitmq/.erlang.cookie

 

 

创建集群

  1. 在三台机器上分别启动 rabbitmq-server
  2. 在 se2、se3 两台机器上分别执行 stop_app 终止节点
  3. 执行 rabbitmqctl join_cluster {clusternode} [--ram] 加入集群
  4. 执行 start_app 启动节点

 

sudo service rabbitmq-server restart sudo rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@se1 sudo rabbitmqctl start_app

 

 

查看集群状态

在三台机器的任一台机器上执行:

sudo rabbitmqctl cluster_status

 

 

可以看到集群的当前状态:

 

 

也可以通过访问默认端口 15672 的 web 监控页面来进行集群的监控和管理:

 

 

rabbitmq document -- http://www.rabbitmq.com/clustering.html

 






rabbitmq      集群      消息队列      分布式      mq      message queue      队列      节点      broker      rabbitmqctl      高可用      镜像模式     


京ICP备15018585号