当你的RabbitMQ服务器遇到诸如内存崩溃或者断电等极端情况时,单节点是不能应对这些故障的。因此需要多节点集群部署来弹性应对故障。另外可以通过多节点部署,来扩展消息通信的吞吐量。
1. 集群搭建
首先,我们不用关心RabbitMQ的集群策略、节点类型等问题,可以先手动把RabbitMQ的集群搭建好,再一步步地了解其原理。
1.1 准备两个节点
搭建的详细过程就不再叙述,具体可参考RabbitMQ安装。
我在两台机器上分别安装了RabbitMQ,在/etc/hostname里也分别配置了机器名:nc060、nc078,要保证两台机器互相能ping通。
1.2 共享Erlang Cookie
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管理页面,会看到已经成功了:
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 | map.put("x-ha-policy", "all"); |
第二种是直接修改系统配置:
1 | ./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' |
3.2 RabbitMQ负载均衡部署
在某台服务器上安装haproxy
1 | yum install haproxy |
打开haproxy的配置文件,/etc/haproxy/haproxy.cfg
加入以下配置:
1 | //RabbitMQ链接监听 |
启动haproxy:
1 | service haproxy start |
浏览器打开:haproxy的机器IP:8100/stats,查看当前的RabbitMQ节点的状态:
现在已经部署好了负载均衡服务,接下来就可以把你的消息生产者和消费者代码中的配置修改下,之前的RabbitMQ链接示例为:
1 | nc060:5672 或者 nc078:5672 |
因为在haproxy中配置的端口为5670,现在可以统一修改为:
1 | 部署haproxy的机器IP:5670 |
至此已经完成了对RabbitMQ的集群搭建和高可用模式的初步探索,接下来就请你好好享受消息通信带来的便捷吧!
以上内容就是关于RabbitMQ集群架构搭建与高可用性实现的全部内容了,谢谢你阅读到了这里!
Author:zhaoyh