RabbitMQ集群搭建

介绍

RabbitMQ 是一个开源的消息代理软件,实现了高级消息队列协议(AMQP,Advanced Message Queuing Protocol)。它充当了消息的中间件,用于在分布式系统中传递消息,提供了可靠的、异步的、跨应用程序的消息传递机制。

RabbitMQ 的主要特点和用途:

  • 消息队列: RabbitMQ 作为消息队列(Message Queue)的一种实现,允许应用程序之间通过消息进行通信。消息队列可以解耦发送者和接收者,使得它们可以独立地演进和扩展。

  • 解耦应用组件: 通过在系统的不同部分之间引入消息队列,可以实现应用组件的解耦。这意味着系统的不同部分可以独立开发、部署和扩展,而不必知道其他部分的实现细节。

  • 异步通信: RabbitMQ 支持异步消息传递,允许发送者发送消息后立即继续执行,而不必等待接收者的响应。这有助于提高系统的并发性和响应性。

  • 可靠性: RabbitMQ 提供了消息持久性选项,确保即使在代理重启后,也不会丢失已经发送的消息。这对于关键的业务消息和任务很重要。

  • 灵活的消息路由: RabbitMQ 提供了灵活的消息路由和交换机(Exchange)的机制。通过不同类型的交换机和路由规则,可以实现多样化的消息路由策略。

  • 工作队列: RabbitMQ 可以用作工作队列,允许任务的异步执行。生产者将任务放入队列,而工作者则从队列中取出任务并处理。这对于分布式任务处理和负载均衡非常有用。

  • 发布/订阅模式: RabbitMQ 支持发布/订阅模式,允许多个消费者订阅同一队列,并接收相同的消息。这在实现广播和通知系统时很有用。

  • 可扩展性: RabbitMQ 支持水平扩展,可以通过添加更多的节点来提高消息代理的处理能力。这有助于应对不断增长的负载。

  • 社区支持和丰富文档: RabbitMQ 是一个开源项目,拥有庞大的社区支持和丰富的文档资源,使得使用和集成 RabbitMQ 相对容易。

集群模式

RabbitMQ 支持不同类型的集群模式,以确保高可用性和水平扩展。以下是 RabbitMQ 中常见的集群模式:

  • 镜像队列集群(Queue Mirroring Cluster): 这是 RabbitMQ 中最常见的集群模式。在这种模式下,队列的所有消息都会在集群中的多个节点上进行复制(镜像)。每个队列的复制体称为队列的镜像。如果一个节点失效,仍然可以从其他节点获取相同队列的消息。这提高了队列的可用性和可靠性。

  • 所有者模式(Quorum Queues Cluster): 在 RabbitMQ 3.8 版本及更高版本中引入了 Quorum Queues,这是一种基于 Raft 协议的新队列类型。Quorum Queues 提供更强的数据一致性和容错性,它们的数据存储在多个节点上。Quorum Queues 的集群模式称为所有者模式。在这种模式下,队列的所有者(leader)负责处理消息的写入和复制,而其他节点则充当跟随者(followers),复制队列的数据。

  • 基于发布/订阅的集群模式(Publisher-Subscriber Cluster): RabbitMQ 也支持发布/订阅模式的集群,其中交换机和队列的绑定关系会在所有集群节点之间共享。这样,无论消息生产者连接到哪个节点,消息都能够正确地发布到相应的队列。这种模式可以用于构建分布式的发布/订阅系统。

专业术语

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立tcp连接的管理器,程序代码中使用;
Channel(信道):消息推送使用的通道;
Exchange(交换器):用于接受、分配消息;
Queue(队列):用于存储生产者的消息;类似存放商品的仓库和商店。是生产商品的工厂和购买商品的用户之间的中转站。
Broker:简单来说就是消息队列服务器实体
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
user:用户
Binding: exchange 与 queue 之间的虚拟链接,binding 中可以包含 routing key。binding 信息被保存到 exchange 的查询表中,用于消息的分发。

节点类型

磁盘节点(Disk Node): 磁盘节点是 RabbitMQ 集群中的普通节点,它负责存储消息和元数据,以确保消息的持久性。磁盘节点会将消息写入磁盘,以便在节点重启后仍然可以访问。大多数节点都是磁盘节点,尤其是那些处理关键业务消息的节点。

内存节点(Memory Node): 内存节点是一种轻量级的节点类型,它主要用于缓存消息,而不将它们写入磁盘。内存节点对于处理大量短暂消息的情况非常有用,因为它们能够更快地处理消息。然而,内存节点不能保证消息的持久性,因此在节点重启后可能会丢失消息。

镜像节点(Mirrored Node): 镜像节点是 RabbitMQ 集群中的节点,它主要用于存储队列的镜像副本。镜像节点在集群中的其他节点上维护队列的镜像,以提供消息的冗余存储。这有助于提高队列的可用性和可靠性。

所有者节点(Quorum Queues Owner Node): 在 RabbitMQ 3.8 版本及更高版本中引入的 Quorum Queues 中,引入了所有者节点的概念。所有者节点负责处理队列的写入和复制,而其他节点充当跟随者(followers),负责复制队列的数据。这种节点类型用于 Quorum Queues 集群模式。

搭建集群

192.168.50.138 	rabbitmq-1
192.168.50.139	rabbitmq-2
192.168.50.140	rabbitmq-3

下载

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.10/rabbitmq-server-3.7.10-1.el7.noarch.rpm

下载erlang

wget https://cloud.7boe.top/d/HKOSS/%E8%BD%AF%E4%BB%B6%E5%8C%85/RabbitMQ/erlang-21.3.8.21-1.el7.x86_64.rpm

开启web管理页面

rabbitmq-plugins enable rabbitmq_management

创建用户并且授权

rabbitmqctl add_user wang passwd
rabbitmqctl set_user_tags wang administrator

列出用户

rabbitmqctl list_users

给权限

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

拷贝

cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

修改配置文件

61 {lookback_users,[]}

重启

systemctl restart rabbitmq-server

常用端口

4369 -- erlang端口
5672 --程序连接端口
15672 -- 管理界面ui端口
25672 -- server间内部通信口

创建数据目录

mkdir -p /data/rabbitmq/data
mkdir -p /data/rabbitmq/logs
chmod 777 -R /data/rabbitmq
chmod 777 -R /data/rabbitmq/logs
chown rabbitmq.rabbitmq /data/ -R

新写一个env变量配置文件

vim /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs

其他两台机器要拷贝cookie

scp root@10.31.162.200:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/

加入集群的机器要关闭
被加入的master要开启

rabbitmqctl stop_app
chmod 400 .erlang.cookie
chown rabbitmq.rabbitmq .erlang.cookie
rabbitmqctl start_app

以内存加入,然后开启

rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
rabbitmqctl start_app

加入方式

(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
(2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type
disc(ram),前提是必须停掉rabbit应⽤

集群状态

rabbitmqctl cluster_status

页面查看

http://192.168.50.138:15672

镜像集群

一条命令即可

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

设置策略

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称,可以定义
Pattern: queue的匹配模式(正则表达式),也就是说会匹配一组。
Definition:镜像定义,包括ha-mode,ha-params,ha-sync-mode
    ha-mode:指明镜像队列的模式
        all:表示在集群中所有的节点上进行镜像
        exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
    ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
    ha-params:ha-mode模式需要用到的参数