RabbitMQ集群架构搭建与高可用性实现

当你的RabbitMQ服务器遇到诸如内存崩溃或者断电等极端情况时,单节点是不能应对这些故障的。因此需要多节点集群部署来弹性应对故障。另外可以通过多节点部署,来扩展消息通信的吞吐量。

1. 集群搭建

首先,我们不用关心RabbitMQ的集群策略、节点类型等问题,可以先手动把RabbitMQ的集群搭建好,再一步步地了解其原理。

1.1 准备两个节点

搭建的详细过程就不再叙述,具体可参考RabbitMQ安装

我在两台机器上分别安装了RabbitMQ,在/etc/hostname里也分别配置了机器名:nc060、nc078,要保证两台机器互相能ping通。

erlang.cookie是erlang实现分布式通信的必要文件,erlang之间的共享通信要求分布式的每个节点上要保持相同的erlang.cookie文件,同时保证文件的权限是400。因此,先把两台RabbitMQ服务关闭,其次,我们把nc060和nc078的erlang.cookie设置成相同,我是把nc060上的erlang.cookie内容复制到nc078机器下。

如果我们使用解压缩方式安装部署的RabbitMQ,那么这个文件会在$home/.erlang.cookie下。
如果我们使用rpm或者yum等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq/.erlang.cookie下。

放心,到了这里很多人会懵,不要怕,我们已经完成了RabbitMQ集群部署的最难的部分了。

1.3 部署集群

此时应保证两台装有RabbitMQ的机器具有相同的erlang.cookie内容。

进入到nc060机器的RabbitMQ的sbin目录:

1
./rabbitmqctl join_cluster --ram rabbit@nc078

此时就加入到nc078机器下的集群了,并设置nc060为ram节点,至于什么是ram节点,可参考2.2节的内容。

分别启动两台机器的RabbitMQ节点:

1
./rabbitmqctl start_app

或者

1
./rabbitmq-server -detached

此时去RabbitMQ的web管理页面,会看到已经成功了:

image

2. 相关说明

接下来会对集群部署策略,和一些关键技术做一些介绍。

2.1 节点类型

  • ram(内存)节点:将队列、交换机、绑定等数据存储在内存中,好处是存储和交换机生命之类的操作速度快,坏处是断电后数据会丢失。
  • disk(磁盘)节点:将元数据存储在磁盘中,单节点的RabbitMQ只允许磁盘节点,防止重启RabbitMQ的时候,丢失配置信息。

RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群可以继续路由消息,但是无法进行其他操作(增删改查队列、交换机、权限等),直到节点恢复。

2.2 元数据

RabbitMQ会始终记录以下四种类型的内部元数据:

  • 队列元数据:队列名称及属性(是否持久化、自动删除等)。
  • 交换机元数据:交换机名称、属性、类型等。
  • 绑定元数据:将消息路由到队列。
  • vhost元数据:命名空间属性。

2.3 集群模式

  • 普通模式:集群的默认模式,以本次搭建的集群(nc060,nc078)为例,nc060和nc078拥有相同的元数据,即交换机、队列、绑定等基础结构,但是消息实体只存在于一个节点。
  • 镜像模式:将需要消费的队列变为镜像队列,存在于集群的多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用网络带宽。

3. 高可用性部署策略

3.1 镜像队列

此部分内容可参考官方文档:http://www.rabbitmq.com/ha.html

RabbitMQ镜像队列的模式如下列表:

ha-mode ha-params Result
exactly count 镜像队列将会在集群上复制count份。如果节点数量少于count,队列会复制到所有节点上。如果节点数量大于count,有一个镜像节点crash后,其余节点也不会作为新的镜像节点。
all 镜像队列将会在整个集群节点中复制。当一个新的节点加入集群后,也会在这个节点上复制一份镜像队列。
nodes node names 镜像队列会在node name中复制。如果这个node name不属于集群,不会触发错误。

设置镜像队列有两种方式,第一种是在代码里声明队列时设置参数:

1
2
map.put("x-ha-policy", "all");
channel.queueDeclare(QUEUE_NAME, true, false, false, map);

第二种是直接修改系统配置:

1
./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

3.2 RabbitMQ负载均衡部署

在某台服务器上安装haproxy

1
yum install haproxy

打开haproxy的配置文件,/etc/haproxy/haproxy.cfg
加入以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//RabbitMQ链接监听
listen rabbitmq_local_cluster 部署haproxy的机器IP:5670
mode tcp
balance roundrobin
server rabbit_nc078 nc078:5672 check inter 5000 rise 2 fall 3
server rabbit_nc060 nc060:5672 check inter 5000 rise 2 fall 3

//web管理界面
listen private_monitoring :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 10s
stats auth user:pwd

启动haproxy:

1
service haproxy start

浏览器打开:haproxy的机器IP:8100/stats,查看当前的RabbitMQ节点的状态:

image

现在已经部署好了负载均衡服务,接下来就可以把你的消息生产者和消费者代码中的配置修改下,之前的RabbitMQ链接示例为:

1
nc060:5672 或者 nc078:5672

因为在haproxy中配置的端口为5670,现在可以统一修改为:

1
部署haproxy的机器IP:5670

至此已经完成了对RabbitMQ的集群搭建和高可用模式的初步探索,接下来就请你好好享受消息通信带来的便捷吧!

以上内容就是关于RabbitMQ集群架构搭建与高可用性实现的全部内容了,谢谢你阅读到了这里!

Author:zhaoyh