一、clustering
1、 使用集群的原因
- 单台RabbitMQ遇到内存崩溃、机器故障等情况会导致服务不可用
- 单台RabbitMQ只能满足每秒1000条的消息吞吐量
2、搭建步骤
1、准备三台虚拟机
2、修改3台机器的主机名称 分别为node1、node2、node3
vi /etc/hostname
3、配置节点的hosts文件,让各个节点都能互相识别到对方
vim /etc/hosts
4、确保各个节点的cookie文件使用的是同一个值
在node1上执行远程操作命令:
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
5、启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以 下命令)
rabbitmq-server -detached
6、在节点 2 执行 => 节点2 加入节点1
rabbitmqctl stop_app
(rabbitmqctl stop 会将 Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ服务)
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app(只启动应用服务)
7、在节点3执行 =》 节点3 加入节点2
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node2
rabbitmqctl start_app
8、查看集群状态
rabbitmqctl cluster_status
9、需要重新设置用户
创建账号 rabbitmqctl add_user admin 123
设置用户角色 rabbitmqctl set_user_tags admin administrator
设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
进入 http://192.168.56.11:15672/
10、(备注)解除RabbitMQ的集群状态
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
rabbitmqctl forget_cluster_node rabbit@node2(node1 机器上执行)
二、镜像队列
1、 为什么要引入镜像队列
假设队列1处于node1节点上,当node1宕机时,所有发送消息给队列1以及从队列1消费消息的客户端全部不能使用
引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他Broker节点之上,如果集群中的一个节点失效了,队列能自动切换到镜像中的另一个节点上以保证服务的可用性
2、 镜像队列的搭建步骤
1、启动三台集群节点
2、随便找一个节点添加 policy
3、在node1上创建一个队列,发送一条消息,队列存在镜像队列
4、停掉 node1 节点,发现node3上的队列称为主队列,node2节点上存在其镜像队列