RabbitMQ 集群搭建

概述

  • RabbitMQ 是用Erang开发的,集群节点包括内存节点、磁盘节点。
  • RabbitMQ 支持消息的持久化,也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。
  • 镜像集群模式:把需要的队列做成镜像队列,消息发送到主节点上,主节点通过 mirror 队列把数据同步到其他的 MQ 节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用。
  • 要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。
模式 特点 优缺点
单机模式 生产几乎不用 单节点嘛,性能最好
普通集群模式 默认的集群模式 无高可用性,所有队列的数据都只存在于它被创建的节点上
镜像集群模式 RabbiMQ的HA方案 支持故障自动恢复,切换过程透明,但性能开销大,无法线性扩展存储能力

注:镜像集群(匹配该策略的队列会在多个节点间同步数据)无法线性扩展存储能力,是因为每个节点都保存着所有镜像队列的完整数据副本,增加节点并不能分摊存储压力,不是分布式的,没有扩展性可言。

搭建过程

  • 机器规划清单
IP地址 主机名 操作系统 用途
192.168.31.101 mq101 CentOS 7.9 x64 磁盘节点
192.168.31.102 mq102 CentOS 7.9 x64 内存节点
192.168.31.103 mq103 CentOS 7.9 x64 内存节点

1.通用配置

  • 所有节点:初始化工作
#.安装基础软件并同步时间
yum install -y -q curl wget ntp ntpdate lrzsz telnet zip unzip net-tools
timedatectl set-timezone Asia/Shanghai
/usr/sbin/ntpdate -u ntp.aliyun.com

#.修改机器名
newhost=`ifconfig -a|grep inet|grep 192.168.31|awk '{print $2}'|tail -1|awk -F'.' '{print "mq"$4}'`
hostnamectl set-hostname $newhost
cat /etc/hosts | grep `cat /etc/hostname` || echo 127.0.0.1 `cat /etc/hostname` >> /etc/hosts

#.配置hosts文件
sed -i '/mq101\|mq102\|mq103/d' /etc/hosts
cat /etc/hosts | grep "mq101" > /dev/null || echo "192.168.31.101 mq101" >> /etc/hosts
cat /etc/hosts | grep "mq102" > /dev/null || echo "192.168.31.102 mq102" >> /etc/hosts
cat /etc/hosts | grep "mq103" > /dev/null || echo "192.168.31.103 mq103" >> /etc/hosts
cat /etc/hosts | grep "mq"

#.建议禁用firewalld防火墙
/usr/sbin/iptables -F
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service

#.建议关闭selinux否则会限制服务
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
  • 所有节点:重启之后确认 selinux 已 disabled
reboot
/usr/sbin/sestatus | grep SELinux

2.搭建 单机 模式

  • 2.1.所有节点:安装最新版的 erlang 14.0.2
curl -L http://iso.sqlfans.cn/linux/erlang-26.0.2-1.el7.x86_64.rpm -o /opt/erlang-26.0.2-1.el7.x86_64.rpm
rpm -ivh /opt/erlang-26.0.2-1.el7.x86_64.rpm
/usr/bin/erl -version
  • 2.2.所有节点:安装 rabbitmq 3.12.1
curl -L http://iso.sqlfans.cn/linux/rabbitmq-server-generic-unix-3.12.1.tar.xz -o /opt/rabbitmq-server-generic-unix-3.12.1.tar.xz
tar -xJf /opt/rabbitmq-server-generic-unix-3.12.1.tar.xz -C /opt/
mv /opt/rabbitmq_server-3.12.1 /usr/local/rabbitmq
/usr/local/rabbitmq/sbin/rabbitmqctl --version
  • 2.3.所有节点:配置rabbitmq环境变量
echo $PATH | grep rabbitmq || echo 'export PATH=$PATH:/usr/local/rabbitmq/sbin' >> /etc/profile
source /etc/profile
rabbitmqctl --version
  • 2.4.所有节点:启用web管理端插件(rabbitmq_management,监听15672端口,请逐条执行)
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins list | grep rabbitmq_management
  • 2.5.所有节点:启动rabbitmq服务(监听5672端口)
rabbitmq-server -detached
sleep 5 && netstat -lnpt | egrep "(15672|25672|5672)"

#.检查当前节点的存活状态
rabbitmq-diagnostics check_running

3.搭建 普通集群 模式

  • 3.1.所有节点:停掉rabbitmq服务
rabbitmqctl stop
  • 3.2.主节点(mq101):拷贝Rrlang Cookie到其他2个节点

    注:Erlang的集群中各节点是经由过程一个magic cookie来实现的,所以必须保证各节点cookie一致,不然节点之间就无法通信。

cat /root/.erlang.cookie
scp /root/.erlang.cookie root@mq102:/root/.erlang.cookie
scp /root/.erlang.cookie root@mq103:/root/.erlang.cookie
  • 3.3.所有节点:需要修改文件权限为600(默认400),再启动rabbitmq服务
chmod 600 /root/.erlang.cookie
rabbitmq-server -detached
sleep 5 && netstat -lnpt | egrep "(15672|25672|5672)"
  • 3.4.其他节点:在 mq102、mq103 上,将本机作为【内存节点】加入mq101节点集群中
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq101
rabbitmqctl start_app

注:关于磁盘/内存节点,有如下几点注意:

1.mq101默认是磁盘节点,参数 --ram 指定当前节点为内存节点,而参数 --disc 则指定当前节点为磁盘节点;
2.更改节点类型可使用命令 rabbitmqctl change_cluster_node_type {disc/ram},前提是必须停掉rabbit应用;
3.必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息;
  • 3.5.所有节点:检查集群状态,确认 Cluster name、Disk Nodes、RAM Nodes
#.查看集群状态
rabbitmqctl cluster_status

#.确认所有节点的状态为 Running
[root@mq101 ~]# rabbitmqctl cluster_status | grep -A 5 "Running Nodes"
Running Nodes

rabbit@mq101
rabbit@mq102
rabbit@mq103
  • 3.6.主节点(mq101):删除guest账号并添加管理员账号(请逐条执行)
rabbitmqctl -n rabbit@mq101 change_password guest Admin_147
rabbitmqctl -n rabbit@mq101 delete_user guest
rabbitmqctl -n rabbit@mq101 add_user admin Admin_147
rabbitmqctl -n rabbit@mq101 set_user_tags admin administrator
rabbitmqctl -n rabbit@mq101 set_permissions -p / admin ".*" ".*" ".*"
rabbitmqctl -n rabbit@mq101 list_users
  • 3.7.登录rabbitmq web管理控制台,查看nodes
地址:http://192.168.31.101:15672
账号:admin
密码:Admin_147

4.搭建 镜像集群 模式

  • 4.1.任一节点:创建镜像策略

注:即便所有节点发生重启也不会丢失镜像策略

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
  • 4.2.登录web控制台 - Queues - 添加队列
#.参数:
Type:队列类型,可选Classic/Quorum
Name:队列名称
Durability:队列是否持久化
Node:消息队列的节点
Auto delete:自动删除
Arguments:使用的策略类型
  • 4.3.登录web控制台 - Admin,确认集群模式为镜像集群
#.如果以下输出没有包含 {"ha-mode":"all"} 则是普通集群(所有队列的数据都只存在于它被创建的节点上)
#.如果以下输出包含策略 {"ha-mode":"all"} 则是镜像集群(匹配该策略的队列会在多个节点间同步数据)
[root@mq101 ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost   name    pattern apply-to        definition      priority
/       ha-all  ^       all     {"ha-mode":"all"}       0

  • 4.4.登录web控制台 - Queues and Streams,查看队列消息的流转和积压情况

注:重点关注 Ready (待消费消息数)队列中等待被消费者取走并处理的消息总数,Unacked (未确认消息数)已经被消费者取走,但消费者还没有发回确认的消息总数。

遇到的错误

场景1:集群节点启动start_app报错:timeout_waiting_for_tables

  • 症状:成功安装mq单节点(包含了启用延迟队列插件)之后,以内存节点加入集群后start_app报错:timeout_waiting_for_tables
[root@mq102 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq102 ...

[root@mq102 ~]# rabbitmqctl join_cluster --ram rabbit@mq101
Clustering node rabbit@mq102 with rabbit@mq101

[root@mq102 ~]# rabbitmqctl start_app
Starting node rabbit@mq102 ...
Error:
  • 原因:mq集群中只有 Disc 磁盘节点才支持延时队列插件,而RAM内存节点启用延时插件后启动服务会报错
  • 解决:如果是内存节点(比如 mq102 节点),请先将该节点调整为磁盘节点,再启用延时队列插件,参考如下:
#.登录mq102节点,调整为磁盘节点
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl start_app

#.登录mq102节点,启用延时插件
curl -sL http://iso.sqlfans.cn/linux/rabbitmq_delayed_message_exchange-3.12.0.ez -o /usr/local/rabbitmq/plugins/rabbitmq_delayed_message_exchange-3.12.0.ez
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
rabbitmq-plugins list | grep rabbitmq_delayed_message_exchange

#.确认端口及集群状态
netstat -lnpt | egrep "(15672|25672|5672)"
rabbitmqctl cluster_status

场景2:nacos如何配置rabbitmq集群

  • 如果rabbitmq为单节点,那么在nacos配置的时候,请使用mq服务的ip和端口
spring.rabbitmq.host=192.168.31.101
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=Admin_147
  • 如果rabbitmq为集群模式,那么在nacos配置的时候,请使用mq集群的所有ip和端口
spring.rabbitmq.addresses=192.168.31.101:5672,192.168.31.102:5672,192.168.31.103:5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=Admin_147
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-09-08 15:00:24

results matching ""

    No results matching ""