当前位置: 首页 > news >正文

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

目录

1、特点

2、RabbitMQ的消息传递模式

2.1、简单模式(Simple Mode)

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

2.3、发布/订阅模式(Publish/Subscribe 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、创建日志、数据保存目录

三个服务器均操作

[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

填入上述配置

[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集群)

[root@rabbitMQ1 ~]# cat /var/lib/rabbitmq/.erlang.cookie

JXUSRTWCVLRVAMPQWISW

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

[root@rabbitMQ1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

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

[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、将节点加入集群,指定角色

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

[root@rabbitMQ2 ~]# rabbitmqctl stop_app

Stopping rabbit application on node rabbit@rabbitMQ2 ...

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

Resetting node rabbit@rabbitMQ2 ...

rabbitMQ2、rabbitMQ3加入内存节点

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

默认rabbitMQ1启动后是磁盘节点,在这个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来查看是否集群配置成功。

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

4.11、验证

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

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

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

5、rabbitMQ镜像集群配置

启用插件rabbitmq_federation

[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"}'

[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的基本部署,集群配置,镜像队列设置就完事了,感谢观看学习,文章有问题可留言作者会查看并分析处理🙂

相关文章:

  • RIME-CNN-SVM故障诊断
  • 在mac中安装Colima使用docker(替代Docker Desktop)
  • MapReduce到底是个啥?
  • 无人机 ,遥控器与接收机之前的通信
  • Python 调用 Azure OpenAI API
  • 浅谈Java Spring Boot 框架分析和理解
  • 掌握正则表达式_模式匹配的艺术
  • 【实测】用全志A733平板搭建一个端侧Deepseek算力平台
  • DeepSeek 助力 Vue 开发:打造丝滑的步骤条
  • 渗透利器:YAKIT 工具-基础实战教程.
  • TCP/IP 协议
  • #渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入
  • Unity进阶教程AOI算法原理详解
  • 计算机视觉的研究方向、发展历程、发展前景介绍
  • 深入理解Java对接DeepSeek
  • 【Java 面试 八股文】Redis篇
  • 深入HBase——引入
  • Unity开发播放视频
  • 数据治理双证通关经验分享 | CDGA/CDGP备考全指南
  • 深入了解 MySQL:从基础到高级特性
  • “异常”只停留在医院里,用艺术为“泡泡宝贝”加油
  • 耗资10亿潮汕豪宅“英之园”将强拆?区政府:非法占用集体土地
  • 220名“特朗普币”持有者花1.48亿美元,获邀与特朗普共进晚餐
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • “海豚音”依旧,玛丽亚·凯莉本周来沪开唱
  • 《致1999年的自己》:千禧之年的你在哪里?