RabbitMQ集群搭建
RabbitMQ集群搭建
准备工作
开始本课程之前,先按文章
克隆三个虚拟机,修改主机名依次为:RabbitMQ01、RabbitMQ02、RabbitMQ03;修改ip地址依次为192.168.10.201、192.168.10.202、192.168.10.203。今天我们要是用的虚拟机环境就搭建完成了。
RabbitMQ的集群大致分为两类:副本集群和镜像集群
副本集群
副本集群架构
理解:该种架构中,消费者可以从所有节点访问消息队列,但是消息队列仅存储在master
节点,slave节点仅仅同步Exchange
,如果消费者监听的是slave节点,那么slave节点会跟master节点通信,取得相应的队列消息传递给消费者消费。如果master宕机,无法进行主从切换,该种架构解决的主要问题即:当集群中某一时刻master节点宕机,可以对消息队列进行备份,所以该架构又称之为主备架构
该架构如果master宕机slave不会转正,因此rabbitMQ服务无法再对外提供服务,所以该架构不满足高可用的特性
集群搭建
集群规划
node1:192.168.10.201 master 主节点
node2:192.168.10.202 salve01 副本集节点01
node2:192.168.10.203 salve02 副本集节点02
配置ip映射
配置master主机
以master主机为例,使用vim
命令打开hosts,添加以下配置
192.168.10.201 RabbitMQ01
192.168.10.202 RabbitMQ02
192.168.10.203 RabbitMQ03
远程同步slave
执行命令scp /etc/hosts root@RabbitMQ02:/etc
、scp /etc/hosts root@RabbitMQ03:/etc
期间有两处要注意,其一是否确定继续远程连接,选择yes
;其二要输入远程机器的密码;
同步成功后,我们查看slave01的hosts文件
可以看到文件已经同步成功。按照上述操作,同步slave02机器即可
安装RabbitMQ
上传rpm
同步rpm到slave
安装rpm
按照erlang、socat、rabbitmq的顺序在三台机器上依次执行rpm -ivh **.rpm
命令安装上面三个rpm
拷贝配置文件
分别在三台机器上执行命令cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
修改配置文件
分别在三台机器上执行命令vim /etc/rabbitmq/rabbitmq.config
,修改行如下
启动RabbitMQ的插件管理功能
在三台机器上执行以下命令rabbitmq-plugins enable rabbitmq_management
,执行结果如下图则说明插件管理服务启动成功
启动并查看状态
三台机器上一次执行命令systemctl start rabbitmq-server
、systemctl status rabbitmq-server
浏览器访问管理界面
依次输入地址http://192.168.10.201:15672
、http://192.168.10.202:15672
、http://192.168.10.203:15672
,使用guest/guest
用户名密码登录
同步.erlang.cookie
关闭RabbitMQ服务
同步**.erlang.cookie**之前记得首先关闭RabbitMQ服务,三台机器依次执行systemctl stop rabbitmq-server
,然后使用命令systemctl status rabbitmq-server
查看状态
同步.erlang.cookie
我们这里以master的cookie为主,执行命令scp /var/lib/rabbitmq/.erlang.cookie root@RabbitMQ02:/var/lib/rabbitmq/
、scp /var/lib/rabbitmq/.erlang.cookie root@RabbitMQ03:/var/lib/rabbitmq/
同步master的.erlang.cookie到salve中
启动master
集群的启动方式跟单机有所区别,官方建议我们使用命令rabbitmq-server -detached
,这种方式是后台启动方式,并没有启动界面管理功能,这时候我们访问界面是访问不到的。依次在三台机器上执行该命令启动RabbitMQ服务
将slave加入到集群
走到这里终于拨开云雾见青天了,这里开始正式搭建集群,首先要确保两个从机是关闭的(不包括master),如果不确定可以执行关闭命令rabbitmqctl stop_app
。最后在slave执行命令rabbitmqctl join_cluster rabbit@RabbitMQ01
启动slave
slave加入到master之后就可以执行命令rabbitmqctl start_app
启动两台slave服务器
这里注意的是通过命令rabbitmqctl start_app
的方式启动服务并不是以后台的方式启动的,最后控制台也打印出了cmpleted with 3 plugins
这说明管理界面也被加载了,这会更改整个集群的状态。我们之前之前我们的master是以后台方式启动的,并不能访问管理界面,现在我们再去看下master的管理界面已经可以打开了,而且显示出了集群目前的状态
现在我们可以在任意节点执行命令rabbitmqctl cluster_status
来查看当前集群的状态
- nodes:节点显示当前集群所有的节点
- running_nodes:显示当前集群中正在运行的节点
- cluster_name:就是当前的master节点
镜像集群
镜像集群队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升MQ集群的整体高可用性
镜像集群是通过上面我们配置的副本集群的基础上配置而来
镜像集群架构
配置集群架构
策略说明
上面说了镜像集群是通过配置来实现的,配置主要是策略的配置,线面对策略进行一下简要的说明
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
-
[-p vhost]: 可选参数,针对指定vhost下的queue进行设置
-
[–priority ]:可选参数,policy的优先级,一般不写
-
[–apply-to ]:可选参数,指定策略的应用对象,是应用于交换机还是应用于队列,一般不写
-
:policy的名称
-
:queue的匹配模式(正则表达式)
-
:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
- all:表示在集群中所有的节点上进行镜像
- exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
- nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
查看当前策略
在集群中的任一节点执行命令rabbitmqctl list_policies
,查看当前集群的策略
可以看到当前集群中只有默认的一个虚拟主机且没有配置任何策略
添加策略
添加策略之前我们先新建一个hello队列
#策略正则表达式为 “^” 表示所有匹配所有队列名称 ^hello:匹配hello开头队列
rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
在任一节点执行上述命令后,再次查看管理界面
对可对外提供服务的节点可以理解为最多几个主机宕机或是整个服务瘫痪
上图node+2意思是我们上面搭建的副本集群通过上面的策略配置已经变成了镜像集群,如果master节点宕机,那么slave就会自动切换成master,这样就实现了集群的高可用
删除策略
删除策略使用命令rabbitmqctl clear_policy <name>
比如我们删除上面的策略ha-all的命令就是rabbitmqctl clear_policy ha-all
这里需要注意是,如果策略被全部删除,那么镜像集群又会回退到副本集群,这时候该集群也就失去了高可用的特性,如下图