RabbitMQ 集群搭建

概述

  • RabbitMQ 是用Erang开发的,集群节点包括内存节点、磁盘节点。
  • RabbitMQ 支持消息的持久化,也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。
  • 镜像集群模式:把需要的队列做成镜像队列,消息发送到主节点上,主节点通过 mirror 队列把数据同步到其他的 MQ 节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用。
  • 要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

RabbitMQ有三种模式

模式 特点 优缺点
单机模式 生产几乎不用 -
普通集群模式 默认的集群模式 无高可用性
镜像集群模式 RabbiMQ的HA方案 性能开销大,且不是分布式的,没有扩展性可言

[TOC]

搭建 RabbitMQ 镜像集群

  • 机器规划清单
IP地址 主机名 操作系统 用途
10.30.3.231 mq01 CentOS 7.9 x64 磁盘节点
10.30.3.232 mq02 CentOS 7.9 x64 内存节点
10.30.3.233 mq03 CentOS 7.9 x64 内存节点

1.通用配置

  • 1.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
  • 1.2.修改机器名
#.节点1:hostnamectl set-hostname mq01
#.节点2:hostnamectl set-hostname mq02
#.节点3:hostnamectl set-hostname mq03
  • 1.3.配置hosts文件
cat /etc/hosts | grep "mq01" > /dev/null || echo "10.30.3.231 mq01" >> /etc/hosts
cat /etc/hosts | grep "mq02" > /dev/null || echo "10.30.3.232 mq02" >> /etc/hosts
cat /etc/hosts | grep "mq03" > /dev/null || echo "10.30.3.233 mq03" >> /etc/hosts
cat /etc/hosts | grep "mq"
  • 1.4.禁用防火墙和selinux
#.建议禁用firewalld否则重启后需要iptable -F清除防火墙策略
/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
  • 1.5.重启一下,确认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)"

3.搭建 普通集群 模式

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

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

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

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

1.mq01默认是磁盘节点,参数 --ram 指定当前节点为内存节点,而参数 --disc 则指定当前节点为磁盘节点;
2.更改节点类型可使用命令 rabbitmqctl change_cluster_node_type {disc/ram},前提是必须停掉rabbit应用;
3.必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息;
  • 3.5.所有节点:检查集群状态,确认 Cluster name、Disk Nodes、RAM Nodes
rabbitmqctl cluster_status
  • 3.6.主节点(mq01):删除guest账号并添加管理员账号(请逐条执行,切记不要一起执行)
rabbitmqctl -n rabbit@mq01 change_password guest Admin_147
rabbitmqctl -n rabbit@mq01 delete_user guest
rabbitmqctl -n rabbit@mq01 add_user admin Admin_147
rabbitmqctl -n rabbit@mq01 set_user_tags admin administrator
rabbitmqctl -n rabbit@mq01 set_permissions -p / admin '.*' '.*' '.*'
rabbitmqctl -n rabbit@mq01 list_users
  • 3.7.登录rabbitmq web管理控制台,查看nodes
地址:http://10.30.3.231:15672
账号:admin
密码:Admin_147

4.搭建 镜像集群 模式

  • 4.1.主节点(mq01):创建策略(入口:web控制台 - Admin - 右侧Policies)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
  • 4.2.登录web控制台 - Queues - 添加队列
#.参数:
Type:队列类型,可选Classic/Quorum
Name:队列名称
Durability:队列是否持久化
Node:消息队列的节点
Auto delete:自动删除
Arguments:使用的策略类型
  • 4.3.创建消息

遇到的错误

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

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

[root@mq02 ~]# rabbitmqctl join_cluster --ram rabbit@mq01
Clustering node rabbit@mq02 with rabbit@mq01

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

#.登录mq02节点,启用延时插件
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=10.30.3.231
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=Admin_147
  • 如果rabbitmq为集群模式,那么在nacos配置的时候,请使用mq集群的所有ip和端口
spring.rabbitmq.addresses=10.30.3.231:5672,10.30.3.232:5672,10.30.3.233:5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=Admin_147
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2023-08-30 22:52:29

results matching ""

    No results matching ""