RabbitMQ 镜像集群部署

镜像集群原理

特征

默认情况下,队列只保存在创建该队列的节点上。而镜像模式下,创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。

但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。甚至,一个队列的主节点可能是另一个队列的镜像节点。

用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。镜像节点仅仅起到备份数据作用。

当主节点接收到消费者的ACK时,所有镜像都会删除节点中的数据。

总结

  • 镜像队列结构是一主多从(从就是镜像)
  • 所有操作都是主节点完成,然后同步给镜像节点
  • 主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失)
  • 不具备负载均衡功能,因为所有操作都会有主节点完成(但是不同队列,其主节点可以不同,可以利用这个提高吞吐量)

镜像模式的配置

镜像模式的配置有3种模式:

|----------------|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ha-mode | ha-params | 作用 |
| 准确模式 exactly | 队列的副本量 count | 集群中队列副本(主服务器和镜像服务器之和)的数量。count如果为1意味着单个副本:即队列主节点。count值为2表示2个副本:1个队列主和1个队列镜像。换句话说:count = 镜像数量 + 1。如果群集中的节点数少于count,则该队列将镜像到所有节点。如果有集群总数大于count+1,并且包含镜像的节点出现故障,则将在另一个节点上创建一个新的镜像。 |
| all | (none) | 队列在群集中的所有节点之间进行镜像。队列将镜像到任何新加入的节点。镜像到所有节点将对所有群集节点施加额外的压力,包括网络I / O,磁盘I / O和磁盘空间使用情况。推荐使用exactly,设置副本数为(N / 2 +1)。 |
| nodes | node names | 指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点。 |

2.1.exactly模式

bash 复制代码
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
  • rabbitmqctl set_policy:固定写法

  • ha-two:策略名称,自定义

  • "^two\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以two.开头的队列名称

  • '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}': 策略内容

"ha-mode":"exactly":策略模式,此处是exactly模式,指定副本数量

"ha-params":2:策略参数,这里是2,就是副本数量为2,1主1镜像

"ha-sync-mode":"automatic":同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销。

2.2 all模式

bash 复制代码
rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'
  • ha-all:策略名称,自定义
  • "^all\.":匹配所有以all.开头的队列名
  • '{"ha-mode":"all"}':策略内容
    • "ha-mode":"all":策略模式,此处是all模式,即所有节点都会称为镜像节点

2.3 nodes模式

bash 复制代码
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
  • rabbitmqctl set_policy:固定写法
  • ha-nodes:策略名称,自定义
  • "^nodes\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以nodes.开头的队列名称。

'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}': 策略内容

"ha-mode":"nodes":策略模式,此处是nodes模式

"ha-params":["rabbit@mq1", "rabbit@mq2"]:策略参数,这里指定副本所在节点名称

3.测试

我们使用exactly模式的镜像,因为集群节点数量为3,因此镜像数量就设置为2。

运行下面的命令:

bash 复制代码
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

参考文章

bash 复制代码
https://blog.csdn.net/qq_37726813/article/details/131157265

镜像集群配置

前置条件: 两个节点关闭访问,并且安装好RabbitMQ

同步cookie

bash 复制代码
## .erlang.cookie 可以自己写死为 一个字符串

## 同步(拷贝.cookie时,各节点都必须停止MQ服务,在node1上执行远程操作命令)
scp .erlang.cookie vm-03:/var/lib/rabbitmq/

配置

bash 复制代码
## 在从节点 rabbitmq-02上执行如下命令
# 先停止服务,这里的参数stop_app和stop是不一样的,stop是停掉服务,
# stop_app是停掉这个节点,但是并没有停止rabbitmq依赖的erlang进程。
rabbitmqctl stop_app

##
rabbitmqctl join_cluster rabbit@bigdata-02
## 或者
rabbitmqctl join_cluster --ram rabbit@bigdata-02

## 如果加入报错,可以重置节点.
# 这里重置节点将会把此节点下的所有数据全部清除,包括队列、交换器、虚拟主机和用户等
rabbitmqctl reset


# 启动服务
rabbitmqctl start_app


## 然后启动
rabbitmqctl start_app

## 查看集群状态
 rabbitmqctl cluster_status

日志如下:

bash 复制代码
[root@bigdata-02 rabbitmq]# tail  rabbit\@bigdata-02.log  -f
2023-09-09 16:16:30.067 [info] <0.982.0> Feature flags:   [x] empty_basic_get_metric
2023-09-09 16:16:30.067 [info] <0.982.0> Feature flags:   [x] implicit_default_bindings
2023-09-09 16:16:30.068 [info] <0.982.0> Feature flags:   [x] maintenance_mode_status
2023-09-09 16:16:30.068 [info] <0.982.0> Feature flags:   [x] quorum_queue
2023-09-09 16:16:30.068 [info] <0.982.0> Feature flags:   [x] user_limits
2023-09-09 16:16:30.068 [info] <0.982.0> Feature flags:   [x] virtual_host_metadata
2023-09-09 16:16:30.068 [info] <0.982.0> Feature flags: feature flag states written to disk: yes
2023-09-09 16:16:37.106 [info] <0.454.0> node 'rabbit@bigdata-03' down: connection_closed
2023-09-09 16:16:41.347 [info] <0.454.0> node 'rabbit@bigdata-03' up
2023-09-09 16:18:05.095 [info] <0.454.0> rabbit on node 'rabbit@bigdata-03' up

检测

bash 复制代码
##
rabbitmqctl cluster_status

常用集群命令

bash 复制代码
## 剔除节点
rabbitmqctl forget_cluster_node rabbit@node3

配置用户

复制代码
## 创建用户,第二个admin 为密码
rabbitmqctl add_user admin admin 
 
##设置用户分配操作权限
rabbitmqctl set_user_tags admin administrator
 
##
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
 
##
systemctl status rabbitmq-server
 
## 开启 web 访问
rabbitmq-plugins enable rabbitmq_management
相关推荐
茶杯梦轩1 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
回家路上绕了弯3 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
用户8307196840823 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
用户8307196840825 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者6 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者8 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧9 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖9 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农9 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者9 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端