一、副本集群
1. 架构图
默认情况下:RabbitMQ代理操作所需的所有数据、状态都将跨所有节点复制。这方面的一个例外是消息队列。默认情况下,消息队列位于一个节点上,尽管它们可以从所有节点看到和访问。
2. 环境准备
2.1. ip配置
三台已装好mq的主机
代码语言:javascript复制node1: 192.168.176.3 mq1 master 主节点
node2: 192.168.176.4 mq2 repl1 副本节点
node3: 192.168.176.5 mq3 repl2 副本节点
2.2. hosts配置
修改mq1的hosts配置文件
代码语言:javascript复制vim /etc/hosts
发送配置文件到mq2和mq3
代码语言:javascript复制scp /etc/hosts root@mq2:/etc/
scp /etc/hosts root@mq3:/etc/
在mq2和mq3中查看hosts文件,检查是否发生变化
2.3. 检查mq服务
代码语言:javascript复制systemctl status rabbitmq-server
注意:3台主机都要启动mq服务
2.4. 登陆web管理
3. 配置集群
3.1 关闭mq服务
- 关闭三台主机的mq服务
systemctl stop rabbitmq-server
- 检查mq服务状态,确保已经关闭
systemctl status rabbitmq-server
3.2 同步cookie
注意:必须保证三台主机的cookie是一致的。
- 将mq1的cookie同步到其他主机
scp /var/lib/rabbitmq/.erlang.cookie root@mq2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@mq3:/var/lib/rabbitmq/
- 查看cookie是否一致
3.3 主节点后台启动mq服务
代码语言:javascript复制rabbitmq-server -detached
后台启动完成后,可以使用命令查看集群状态
代码语言:javascript复制rabbitmqctl cluster_status
发现当前mq1集群只有自己
3.4 从节点停止服务
代码语言:javascript复制rabbitmqctl stop_app
3.5 从节点加入集群
代码语言:javascript复制注意:格式必须一致
rabbit@主机名
,这里只能写主机名,所有之前hosts文件映射尤为重要。
rabbitmqctl join_cluster rabbit@mq1
3.6 从节点启动mq服务
代码语言:javascript复制rabbitmqctl start_app
3.7 查看集群状态
代码语言:javascript复制rabbitmqctl cluster_status
加入集群成功,也可以查看web管理页面
4. 总结
- 搭建集群后,主节点和从节点的交换机和消息队列是一致的。
- 如果主节点在没有配置消息持久化情况下宕机了,从节点的消息也不能使用,必须依赖于主节点。当主节点重启后,会恢复交换机和消息队列,但不会恢复队列中的消息数据。
- 如果在主从节点正常的情况下,是可以通过从节点进行消费,它不是直接消费从节点,而是间接通过主节点进行消费。
二、镜像集群
1. 架构图
镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升MQ集群的整体高可用性。
2. 环境准备
在副本集群基础上进行加工
3. 策略说明
4. 配置集群
4.1 查看当前策略
在任意节点上执行命令,查看当前的策略
代码语言:javascript复制rabbitmqctl list_policies
4.2 添加策略
在任意节点上执行命令,添加策略
代码语言:javascript复制rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
查看web界面
4.3 删除策略
代码语言:javascript复制rabbitmqctl clear_policy ha-all
查看web界面
5. 总结
搭建集群后,主节点和从节点的交换机和消息队列是镜像的。如果此时主节点宕机了,从节点还能继续消费,Queues中的Node会替换成子节点,当主节点重启完成后,会加入到对应的Node子节点中,这样就形成了高可用架构。