消息中间件:RabbitMQ镜像集群部署配置全流程

目录

1、特点

2、RabbitMQ的消息传递模式

[2.1、简单模式(Simple Mode)](#2.1、简单模式(Simple Mode))

[2.2、工作队列模式(Work Queue Mode)](#2.2、工作队列模式(Work Queue Mode))

[2.3、发布/订阅模式(Publish/Subscribe Mode)](#2.3、发布/订阅模式(Publish/Subscribe Mode))

[2.4、路由模式(Routing Mode)](#2.4、路由模式(Routing Mode))

3、RabbitMQ集群

3.1、RabbitMQ部署和集群配置的三种模式

3.2、RabbitMQ集群的基本概念

3.2.1、节点类型

3.2.2、核心组件

4、rabbitMQ普通集群部署

4.1、环境准备

4.2、安装relang环境(三台服务器安装配置一致)

4.3、安装rabbitMQ(三台服务器安装配置一致)

下载安装

启动

4.4、开启web访问页面(启用插件)

4.5、访问(新增用户,设置权限)

4.6、创建日志、数据保存目录

4.7、创建配置文件并配置

4.8、构建erlang集群

4.9、将节点加入集群,并指定角色

4.10、查看集群状态

4.11、验证

5、rabbitMQ镜像集群配置

RabbitMQ 是一个基于 AMQP(高级消息队列协议)的开源的消息代理。

1、 特点

  1. 支持多种协议(AMQP, MQTT, STOMP等)。
  2. 强大的消息路由功能。
  3. 支持事务和确认机制,保证消息传递的可靠性。
  4. 提供丰富的管理界面和监控功能。

2、 RabbitMQ的 消息传递 模式

2.1、简单模式(Simple Mode)

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver) 。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于简单的点对点通信场景

  • 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
  • 接收者在成功接收消息之后需向队列应答成功
  • 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式

2.2、工作队列模式(Work Queue Mode)

适用于需要并行处理任务的场景,如图像处理、数据计算等。

特点:

允许多个消费者从同一个队列中接收消息。这种模式通过在消费者之间分配任务来提高消息处理的效率。

2.3、发布/订阅模式(Publish/Subscribe Mode)

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于需要消息广播的场景,例如新闻更新、日志记录等。

特点:

  1. 每个消息可以有多个消费者发布者和订阅者之间有时间上的依赖性。
  2. 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
  3. 为了消费消息,订阅者必须保持运行的状态
  4. 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

2.4、 路由模式(Routing Mode)

适用于需要根据特定条件或规则将消息路由到不同处理者的场景。

特点:

生产者将消息发送到交换机,交换机根据消息的路由键(Routing Key)将消息发送到特定的队列。消费者监听这些队列以接收消息。

3、 RabbitMQ集群

3.1、 RabbitMQ 部署和集群配置的三种模式

1、单机模式。

2、普通模式(默认的集群模式)。

3、镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适合)。要实现镜像模式,需要先搭建出普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

3.2、 RabbitMQ集群的基本概念

在 RabbitMQ 集群中,所有节点都会同步元数据,包括队列、交换器、绑定和 vhost 的定义。这意味着无论在哪个节点上创建或修改这些资源,其他节点都会自动更新。

3.2.1、节点类型

磁盘节点:默认的节点类型,将元数据(包括队列、交换器、绑定和 vhost 的定义)存储在磁盘上。集群中至少需要一个磁盘节点来持久化元数据。

内存节点:将元数据存储在内存中,不提供持久化。通常用于提高性能,但重启后元数据会丢失。

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存数据就足够了

如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

3.2.2、核心组件

Broker:消息队列服务器实体

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;

Exchange(交换器):用于接受、分配消息;

Routing Key:路由关键字,exchange根据这个关键字进行消息投递;

Queue(队列):用于存储生产者的消息;

Bindding:绑定,把exchange和queue按照路由规则绑定起来。

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.

producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:(信道)消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。消息推送使用的通道;

4、rabbitMQ普通集群部署

4.1、环境准备

|------------|--------------|-----------------|
| 主机名 | ip地址 | 版本 |
| rebbitMQ01 | 10.211.55.57 | aarch64的centos9 |
| rebbitMQ02 | 10.211.55.58 | aarch64的centos9 |
| rebbitMQ03 | 10.211.55.59 | aarch64的centos9 |

安装依赖(三台服务器安装配置一致)

yum install -y *epel* gcc-c++ unixODBC openssl-devel ncurses-devel

配置host文件

[root@rabbitMQ2 ~]# vim /etc/hosts

10.211.55.57 rabbitMQ1

10.211.55.58 rabbitMQ2

10.211.55.59 rabbitMQ3

4.2、 安装relang环境 三台服务器安装配置一致

下载地址:https://github.com/rabbitmq/erlang-rpm/releases/

根据自身环境下载安装

wget https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2.2/erlang-27.2.2-1.amzn2023.aarch61.rpm

rpm -ivh erlang-27.2.2-1.amzn2023.aarch61.rpm

[root@rabbitMQ1 ~]# rpm -ivh erlang-27.2.2-1.amzn2023.aarch61.rpm 

Verifying...                          ################################# [100%]

Preparing...                          ################################# [100%]

Updating / installing...

   1:erlang-27.2.2-1.amzn2023         ################################# [100%]

验证是否安装成功

[root@rabbitMQ1 ~]# erl

Erlang/OTP 27 [erts-15.2.2] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit]

Eshell V15.2.2 (press Ctrl+G to abort, type help(). for help)

4.3、 安装 rabbitMQ(三台服务器安装配置一致)

官方安装教程: Installing on RPM-based Linux | RabbitMQ

下载安装

[root@rabbitMQ1 ~]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v1.0.5/rabbitmq-server-1.0.5-1.el8.noarch.rpm

[root@rabbitMQ1 ~]# yum localinstall -y rabbitmq-server-1.0.5-1.el8.noarch.rpm

启动

systemctl start rabbitmq-server

systemctl enable rabbitmq-server

4.4、开启web访问页面(启用插件)

rabbitmq-plugins enable rabbitmq_management

4.5、访问(新增用户,设置权限)

http://10.211.55.57:15672/

http://ip:15672

用户名:guest

密码:guest

上述用户仅支持本机登录

远程登录需添加新用户

添加新用户

rabbitmqctl add_user zjp zjp

设置管理员

rabbitmqctl set_user_tags zjp administrator

设置新用户的权限

rabbitmqctl set_permissions -p / zjp ".*" ".*" ".*"

查看用户

rabbitmqctl list_users

备注:

4369 -- erlang端口

5672 --程序连接端口

15672 --- web界面访问端口

25672 -- server间内部通信端口

4.6、 创建日志、数据保存目录

三个服务器均操作

bash 复制代码
[root@rabbitMQ1 ~]# mkdir -p /data/rabbitmq/data

[root@rabbitMQ1 ~]# mkdir -p /data/rabbitmq/logs

[root@rabbitMQ1 ~]# chmod 777 -R /data/rabbitmq

[root@rabbitMQ1 ~]# chown rabbitmq.rabbitmq /data/ -R

4.7、创建配置文件并配置

RABBITMQ_MNESIA_BASE=/data/rabbitmq/data

RABBITMQ_LOG_BASE=/data/rabbitmq/logs

填入上述配置

bash 复制代码
[root@rabbitMQ1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf

[root@rabbitMQ1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf 

RABBITMQ_MNESIA_BASE=/data/rabbitmq/data

RABBITMQ_LOG_BASE=/data/rabbitmq/logs

配置完后三台机子重启服务 ( 可等下面erlang集群构建后再一起重启 )

systemctl restart rabbitmq-server

4.8、构建erlang集群

Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群。

erlang集群构建方法很简单,将三台机子中的其中一台的这个文件/var/lib/rabbitmq/.erlang.cookie,的内容拷贝到其他两台即可,拷贝过去后需要设置400权限。

查看rabbitmq-1的.erlang.cookie文件内容, (其他两台机器这个文件的内容替换成这个文件的内容就构成了一个erlang集群)

bash 复制代码
[root@rabbitMQ1 ~]# cat /var/lib/rabbitmq/.erlang.cookie

JXUSRTWCVLRVAMPQWISW

设置/var/lib/rabbitmq/.erlang.cookie的权限为400

bash 复制代码
[root@rabbitMQ1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

将rabbitmq-1文件的内容拷贝到其他两台机器rabbitmq-2、rabbitmq-3里

bash 复制代码
[root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@10.211.55.58:/var/lib/rabbitmq/

[root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@10.211.55.59:/var/lib/rabbitmq/

重启rebbitmq-2 rebbitmq-3服务(这里因为rabbitmq-1是传过去的本身没有改变所以不需要重启)

systemctl restart rabbitmq-server

4.9、将 节点加入集群, 指定角色

加入前均先停止并初始化节点

bash 复制代码
[root@rabbitMQ2 ~]# rabbitmqctl stop_app

Stopping rabbit application on node rabbit@rabbitMQ2 ...

[root@rabbitMQ2 ~]# rabbitmqctl reset(可不初始化,初始化会使前面创建的用户也删掉)

Resetting node rabbit@rabbitMQ2 ...

rabbitMQ2、rabbitMQ3加入内存节点

bash 复制代码
rabbit@rabbitMQ1怎么查?

[root@rabbitMQ1 ~]# rabbitmqctl cluster_status



[root@rabbitMQ2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitMQ1

Clustering node rabbit@rabbitMQ2 with rabbit@rabbitMQ1

加入后 启动节点

rabbitmqctl start_app

默认rabbit MQ1 启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,

MQ1是磁盘节点。

如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。

(3) 如果想要更改节点类型, 可以使用命令rabbitmqctl change_cluster_node_type

disc(ram), 前提是必须停掉rabbitmq应用

4.10、查看集群状态

在 RabbitMQ 集群任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。

MQ 1磁盘节点上面查看(集群里的任意一台机器查看都行,这里选择的是 MQ 1)

4.11、验证

三台机器访问15672端口的web页面

根据界面提示创建一条队列

其他两台机器的web界面也能看到刚刚创建的队列

5、rabbitMQ镜像集群配置

启用插件 rabbitmq_federation

bash 复制代码
[root@rabbitMQ2 ~]# rabbitmq-plugins enable rabbitmq_federation

Enabling plugins on node rabbit@rabbitMQ2:

rabbitmq_federation

The following plugins have been configured:

  rabbitmq_federation

  rabbitmq_management

  rabbitmq_management_agent

  rabbitmq_web_dispatch

Applying plugin configuration to rabbit@rabbitMQ2...

The following plugins have been enabled:

  rabbitmq_federation

在集群里的任意一台机器上输入

rabbitmqctl set_policy federate-me "^" '{"ha-mode":"all"}'

bash 复制代码
[root@rabbitMQ2 ~]# rabbitmqctl set_policy federate-me "^" '{"federation-upstream-set":"all"}'

Setting policy "federate-me" for pattern "^" to "{"federation-upstream-set":"all"}" with priority "0" for vhost "/" ...

federate-me是策略名,^表示匹配所有队列,{"ha-mode":"all"},策略模式all即复制到所有节点,包含新增节点(已有队列不会生效)

查看效果

至此,rabbitMQ的基本部署,集群配置,镜像队列设置就完事了,感谢观看学习,文章有问题可留言作者会查看并分析处理🙂

相关推荐
大小科圣1 分钟前
lnmp平台
运维·服务器·nginx
听风吹等浪起6 分钟前
计算机网络基础:IIS服务器(WEB服务器)
运维·服务器·计算机网络
niuTaylor1 小时前
【Linux和RTOS简析】
linux·运维·服务器·macos·macbook air·换硬盘·扩内存
什么半岛铁盒1 小时前
【Linux系统】进程状态:一个进程的轮回史
linux·服务器·编辑器
落——枫1 小时前
操作系统知识点23
linux·运维·服务器
Arbori_262151 小时前
linux 命令sed
linux·运维·服务器
獨枭1 小时前
Ubuntu 22.04 升级到 Ubuntu 24.04 全流程指南
linux·运维·ubuntu
初次见面我叫泰隆1 小时前
Linux常见指令
linux·运维·服务器
dessler2 小时前
DeepSeek-Open WebUI部署
linux·运维·大模型·ollama·deepseek
BetterJason2 小时前
不小心更改了/etc权限为777导致sudo,ssh等软件都无法使用
运维·ssh