消息中间件: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](https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2.2/erlang-27.2.2-1.amzn2023.aarch64.rpm "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](https://www.rabbitmq.com/docs/install-rpm#cloudsmith "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](https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.0.5/rabbitmq-server-4.0.5-1.el8.noarch.rpm "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://10.211.55.57:15672/ "http://10.211.55.57:15672/") [http://ip:15672](http://ip: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 ![](https://i-blog.csdnimg.cn/direct/828d7a54e95244c98ce062731d0a0eca.png) 备注: 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 [email protected]:/var/lib/rabbitmq/ [root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/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页面**** ![](https://i-blog.csdnimg.cn/direct/a5af9c0c7ad64e48be607cbafef4368a.png) 根据界面提示创建一条队列 ![](https://i-blog.csdnimg.cn/direct/3f90b6169e0e4cdf82ee651066845d66.png) ****其他两台机器的web界面也能看到刚刚创建的队列**** ![](https://i-blog.csdnimg.cn/direct/2841d75fea2a4715a8d3b7173716fecf.png) ### ****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即复制到所有节点,包含新增节点(已有队列不会生效) ****查看效果**** ![](https://i-blog.csdnimg.cn/direct/0f2617e654dd4fd3a6e1a5dfa8a1d1c5.png) 至此,rabbitMQ的基本部署,集群配置,镜像队列设置就完事了,感谢观看学习,文章有问题可留言作者会查看并分析处理🙂

相关推荐
猴子请来的逗比4893 分钟前
tomcat查看状态页及调优信息
服务器·学习·tomcat·firefox
无证驾驶梁嗖嗖41 分钟前
ubuntu22鼠键失灵恢复记录笔记chatgpt解决
运维
带鱼吃猫1 小时前
Linux系统:ext2文件系统的核心概念和结构
linux·运维·服务器
qwer555881 小时前
linux-----------------库制作与原理(下)
linux·运维·服务器
vortex52 小时前
Bash fork 炸弹 —— :(){ :|:& };:
运维·服务器·开发语言·网络安全·bash
Blossom.1182 小时前
基于区块链技术的供应链溯源系统:重塑信任与透明度
服务器·网络·人工智能·目标检测·机器学习·计算机视觉·区块链
ephemerals__2 小时前
【Linux】简易版Shell实现(附源码)
linux·运维·chrome
烦躁的大鼻嘎3 小时前
【Linux】ELF与动静态库的“暗黑兵法”:程序是如何跑起来的?
linux·运维·服务器·c++·vscode·ubuntu
API_technology3 小时前
阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统
大数据·运维·数据挖掘·自动化
L_cl3 小时前
【NLP 75、如何通过API调用智谱大模型】
linux·服务器·windows