rabbit mq 集群总结

本文详细介绍了RabbitMQ集群的配置步骤,包括元数据同步、节点类型设置、集群组建、节点加入与退出、镜像队列的实现与管理。强调集群不支持负载均衡,但可通过HAProxy和keepalived实现高可用。同时讨论了镜像队列对性能的影响及其配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


集群原理
RabbitMQ 集群模式下,只有元数据在各节点是同步一致的,消息保存在定义队列的那个节点上,其他节点只知道这个 queue 的 metadata 信息和一个指向 queue 的 owner node 的指针, 生产者消费者不管连接的是哪一个节点,他们收发的消息都会保存在定义队列的那个节点,其他节点只做路由转发

RabbitMQ 要求集群中至少有一个磁盘节点,最好包含 2 个磁盘节点,即使一个磁盘节点宕机了,也不影响其他节点声明交换机,队列及绑定,其它节点均设置为内存节点,这样会让队列和交换器声明之类的操作更加快速,元数据同步也会更加高效

RabbitMQ 集群不支持负载均衡,RabbitMQ 客户端连接 RabbitMQ 时,不支持填多个 ip, 所以只能连一个节点

各节点放一个局域网,通过内网访问
1.vim /etc/hosts
192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3

2.vim /etc/hostname
192.168.1.1 的机器 -- node1
192.168.1.2 的机器 -- node2
192.168.1.3 的机器 -- node3

3.各节点的 Erlang Cookie 文件,内容应该一致
该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误

把第一个节点的该文件复制到其他节点,由于其他节点的该文件权限是 400,所以需要先修改该文件权限为 777,
chmod 777 /var/lib/rabbitmq/.erlang.cookie

复制文件之后,需改回权限和所属用户/组
scp /var/lib/rabbitmq/.erlang.cookie 192.168.1.2:/var/lib/rabbitmq


4.各节点防火墙开端口
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=25672/tcp
//# epmd 进程使用的端口,用于 RabbitMQ 节点和 CLI 工具的端点发现服务
firewall-cmd --permanent --add-port=4369/tcp
firewall-cmd --reload

//# 查看端口是否打开 -- yes表示成功
firewall-cmd --query-port=4369/tcp

5.节点加入集群命令
//# 只停 app,不停 erlang
rabbitmqctl stop_app 
Stopping node rabbit@node2 ...

//# 重置状态, 会脱离原有集群
rabbitmqctl reset
Resetting node rabbit@node2 ...

//# --ram 内存节点,默认磁盘节点
//# rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl join_cluster rabbit@node1 
Clustering node rabbit@node2 with rabbit@node1...

//# 启动服务
rabbitmqctl start_app
Starting node rabbit@node2...

//# 查看集群
rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,['rabbit@node1','rabbit@node2']}]},
 {running_nodes,['rabbit@node1','rabbit@node2']},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,[]},
 {alarms,[{'rabbit@node1',[]},
          {'rabbit@node2',[]}]}]

//# 修改集群名字
rabbitmqctl set_cluster_name my_rabbitmq_cluster

-------------------------------------
节点退出集群命令
-------------------------------------
//# 停止服务
rabbitmqctl stop_app
//# 重置状态, 会脱离原有集群
rabbitmqctl reset
//# 重启服务
rabbitmqctl start_app
-------------------------------------

-------------------------------------
变更节点类型
-------------------------------------
//# 停止服务
rabbitmqctl stop_app
//# 变更类型 ram disc
rabbitmqctl change_cluster_node_type disc
//# 重启服务
rabbitmqctl start_app
-------------------------------------

-------------------------------------
清除 RabbitMQ 节点配置
-------------------------------------
//# 如果遇到不能正常退出直接 kill 进程
systemctl stop rabbitmq-server
//# 查看进程
ps aux|grep rabbitmq
//# 清除节点 rabbitmq 配置
rm -rf /var/lib/rabbitmq/mnesia
-------------------------------------

可通过如下命令确认哪些 salve 在同步
rabbitmqctl list_queues [name] slave_pids [synchronised_slave_pids] 

手动同步 queue
rabbitmqctl sync_queue [name]

取消 queue 同步
rabbitmqctl cancel_sync_queue [name]


-------------------------------------
镜像队列
-------------------------------------
主队列(master)依然是仅存在于一个节点上,通过关联的 rabbitMQ 服务器,从主队列同步消息到各个节点,也就是所谓的主从模式,将主队列的消息进行备份处理
如果主队列没有发生故障,那么其工作流程跟普通队列一样,生产者和消费者不会感知其变化,当发布消息时,依然是路由到主队列中,而主队列通过类似广播的机制,将消息扩散同步至其余从队列中,消费者依然是从主队列中读取消息
一旦主队列发生故障,集群就会选举最老的一个从队列为新的主队列,实现了队列的高可用
镜像队列对性能有影响,一般配 2-3 个节点就够了

三种配置方法
1.代码中完成,申请队列时,加属性,一般没有权限
x-ha-policy:all

x-ha-policy:nodes
x-ha-nodes:[rabbit@node1,rabbit@node2]

2.控制台命令
镜像队列的配置通过添加 policy 完成
rabbitmqctl set_policy [-p Vhost] [Name] [Pattern] [Definition] [Priority] 
-p Vhost 可选参数,针对指定 vhost 下的 queue 进行设置 
Name - policy 的名称
Pattern - queue 的匹配模式(正则表达式) 
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
priority 可选参数,policy 的优先级 

对队列名称以 “queue_” 开头的所有队列进行镜像,并在集群的两个节点上完成,policy 的设置命令为
rabbitmqctl set_policy ha-queue-two "^queue_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}' 

windows 下将单引号改为双引号
rabbitmqctl set_policy ha-all “^ha.” “{“”ha-mode”“:”“all”“}”)

3.控制台页面
policy 页面
-------------------------------------
通过 HAProxy 实现负载均衡,通过 keepalived 实现高可用
-------------------------------------


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我三师弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值