目录
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、特点
- 支持多种协议(AMQP, MQTT, STOMP等)。
- 强大的消息路由功能。
- 支持事务和确认机制,保证消息传递的可靠性。
- 提供丰富的管理界面和监控功能。
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)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于需要消息广播的场景,例如新闻更新、日志记录等。
特点:
- 每个消息可以有多个消费者发布者和订阅者之间有时间上的依赖性。
- 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
- 为了消费消息,订阅者必须保持运行的状态
- 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用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 ~]# erlErlang/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/dataRABBITMQ_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.cookieJXUSRTWCVLRVAMPQWISW
设置/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_appStopping 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@rabbitMQ1Clustering 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_federationEnabling plugins on node rabbit@rabbitMQ2:rabbitmq_federationThe following plugins have been configured:rabbitmq_federationrabbitmq_managementrabbitmq_management_agentrabbitmq_web_dispatchApplying 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的基本部署,集群配置,镜像队列设置就完事了,感谢观看学习,文章有问题可留言作者会查看并分析处理🙂