一、主从集群架构
1、普通集群(主备模式)
RabbitMQ代理操作所需的所有数据/状态都在所有节点之间复制。消息队列是一个例外,默认情况下,消息队列驻留在一个节点上,尽管它们在所有节点上都是可见且可访问的。
注意点:
1.此种模式,master点上的队列不能copy到salve节点上,连接到salve节点上的消费者是可以消费消息,消息消费master上队列中的消息也会删除掉。
2.master节点down掉后,两个salve节点消费者也不能消费当中的消息。
3.master节点发布消息后,或对消息进行操作后会立即同步到所有的salve节点上
2、集群环境准备
- 节点配置:
master节点:192.168.231.131 主机名:(mq1)
salve节点1:192.168.231.132 主机名:(mq2)
salve节点2:192.168.231.133 主机名:(mq3) - 准备三台服务器并配置IP映射:
vim /etc/hosts 命令加入映射信息:
192.168.231.131 mq1
192.168.231.132 mq2
192.168.231.133 mq3 - 三台服务器上安装RabbitMQ,并同步cookie文件(是隐藏文件),在master节点上执行
为什么必须同步cookie文件?
.erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每一个节点上要保持相同的.erlang.cookie文件,Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,或者${home}/.erlang.cookie ,所以必须保证各节点cookie保持一致,否则节点之间就无法通信。
安装步骤这里就不叙述了,
下面开始同步cookie文件:
scp /var/lib/rabbitmq/.erlang.cookie root@mq2: /var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@mq3: /var/lib/rabbitmq/
Linux scp 命令说明:
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,是 cp 命令的加强版,
基本用法:scp [可选参数] 源文件/目录 root用户@那台主机 目标文件/目录
常用的可选参数:
-P 大写的,指定端口号
-r 递归复制整个目录
-v 显示所有 debug 信息
-q 不显示传输进度
-C 大写的,启用压缩
-4 使用 IPv4 地址
-6 使用 IPv6 地址
- 查看cookie是否一致:
master节点:cat /var/lib/rabbitmq/.erlang.cookie
salve节点1:cat /var/lib/rabbitmq/.erlang.cookie
salve节点2:cat /var/lib/rabbitmq/.erlang.cookie
三台服务器上的cookie必须是相同的(CGRMOKNNPQRUNBZSEGWO) - 后台启动RabbitMQ所有节点,命令如下,启动成功后访问管理界面
rabbitmq-server -detached
- 在salve节点1salve节点2两台服务器上执行加入集群命令:
1.先关闭
rabbitmqctl stop_app
2.加入集群
rabbitmqctl join_cluster rabbit @mq1
3.启动集群
rabbitmqctl start_app
- 在任意节点查看集群状态:
rabbitmqctl cluster_status
-
搭建集群成功如下显示:
-
登录管理界面,展示如下界面:
-
在master节点上创建队列:
-
在salve1、salve2节点上查看队列
- 关闭master节点,执行如下命令,查看salve1和salve2节点:
rabbitmqctl stop_app
二、镜像集群架构
镜像队列机制就是将三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提示MQ集群的高可用。
- 集群架构图:
- 配置集群架构
1.策略说明:
rabbitmqctl set_policy [--p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
[--p <vhost>]:可选参数 针对指定vhost下的queue进行设置 如不指定对所有的vhost下的queue进行设置
name:policy的名称
pattern:queue的匹配模式(正则表达式)
priority:可选参数,policy的优先级
definition:镜像定义,包括三个部分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
- 添加策略
rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
说明:策略正则表达式为" ^ ":表示匹配所有队列名称 " ^hello ":表示匹配以hello开头的队列
- 删除策略
rabbitmqctl clear_policy ha-all
- 测试集群
master节点down机
结论:当master节点down掉后,rabbit会重新选择一个新节点作为master节点继续提供服务
master管理界面
salve1节点管理界面
salve2节点管理界面
down掉的节点重新启动
此时此节点为作为salve节点存在,并同步当前master节点的队列。