RabbitMQ集群部署

RabbitMQ集群部署

简介
  • 消息中间件RabbitMQ,一般以集群方式部署, 主要提供消息的接受和发送,实现各微服务之间的消息异步。 以下将介绍RabbitMQ+HA方式进行部署。
原理介绍
  • cookie
    • ​ RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证来实现分布式,所以部署Rabbitmq分布式集群时要先安装Erlang,并把其中一个服务的cookie复制到另外的节点。
  • 内存节点和磁盘节点
    • ​ RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般都建立为磁盘节点,为了防止机器重启后的消息消失;
  • 普通模式和镜像模式
    • ​ RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过RabbitMQ HA镜像队列进行消息队列实体复制。
    • 普通模式
      • ​ 普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
    • 镜像模式
      • ​ 镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
环境要求
  • 1、所有节点需要再同一个局域网内;

  • 2、所有节点需要有相同的 erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。

  • 3、准备三台虚拟机,配置相同

    • 192.168.145.11 设置主机名 rabbitmq1
    • 192.168.145.12 设置主机名 rabbitmq2
    • 192.168.145.13 设置主机名 rabbitmq3
    • 操作系统:centos7.2以上
  • 4、集群中所有节点都需要hosts文件解析

    • [root@rabbitmq1 ~]# cat /etc/hosts 
      
      192.168.229.11 rabbitmq1
      192.168.229.12 rabbitmq2
      192.168.229.13 rabbitmq3
      
部署过程(每个节点都配置)
  • 1、所有节点配置 vim /etc/hosts

    • 192.168.145.11 rabbitmq1
    • 192.168.145.12 rabbitmq2
    • 192.168.145.13 rabbitmq3
  • 2、所有节点安装erLang和rabbitmq

    • 见linux系统中单机部署rabbitmq
yum -y install erlang

在这里插入图片描述

yum install -y rabbitmq-server

在这里插入图片描述

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

vim /etc/rabbitmq/rabbitmq.config

53行解注释
{
   
   loopback_users, [
部署 RabbitMQ 集群可以通过多种方式实现,包括传统的物理或虚拟机部署、使用 Docker 容器化部署以及结合 Kubernetes 进行容器编排部署。以下是基于不同环境的部署方法和步骤: ### 一、传统模式下的 RabbitMQ 集群部署 在传统模式下,RabbitMQ 节点之间通过 Erlang 分布式机制进行通信,所有节点共享相同的元数据(如队列定义、交换机类型等),但消息和队列仅存在于其声明所在的节点上。 #### 部署步骤: 1. **安装 Erlang 和 RabbitMQ** 在每台目标主机上安装相同版本的 Erlang 和 RabbitMQ,确保它们能够正常启动并运行。 2. **配置主机名与网络互通** 每个节点需要能够通过主机名解析到其他节点,并且开放必要的端口(如 4369、25672、5672、15672 等)[^3]。 3. **初始化第一个节点** 启动第一个节点作为磁盘节点: ```bash rabbitmq-server -detached rabbitmqctl join_cluster --ram rabbit@node1 ``` 4. **加入其他节点** 在第二个及后续节点上执行以下命令将其加入集群: ```bash rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@node1 rabbitmqctl start_app ``` 5. **验证集群状态** 使用以下命令查看集群状态: ```bash rabbitmqctl cluster_status ``` --- ### 二、Docker 环境下部署 RabbitMQ 集群 Docker 提供了轻量级的容器化部署能力,可以快速搭建多节点 RabbitMQ 集群。 #### 部署步骤: 1. **准备 Docker 环境** 确保所有节点已安装 Docker 并可正常运行容器。 2. **创建自定义网络** 创建一个自定义桥接网络以保证节点间通信: ```bash docker network create rabbitmq-net ``` 3. **启动第一个节点** 使用以下命令启动第一个 RabbitMQ 节点: ```bash docker run -d \ --hostname node1 \ --name rabbitmq-node1 \ -p 15672:15672 \ -p 5672:5672 \ -e RABBITMQ_ERLANG_COOKIE='secretcookie' \ -e RABBITMQ_NODENAME=rabbit@node1 \ --network rabbitmq-net \ rabbitmq:3-management ``` 4. **启动其他节点并加入集群** 第二个节点启动后加入集群: ```bash docker run -d \ --hostname node2 \ --name rabbitmq-node2 \ -p 15673:15672 \ -p 5673:5672 \ -e RABBITMQ_ERLANG_COOKIE='secretcookie' \ -e RABBITMQ_NODENAME=rabbit@node2 \ --network rabbitmq-net \ rabbitmq:3-management ``` 进入容器内部执行集群加入命令: ```bash docker exec -it rabbitmq-node2 bash rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@node1 rabbitmqctl start_app ``` 5. **验证集群状态** 访问任意节点的管理界面(如 `http://localhost:15672`)查看集群成员信息。 --- ### 三、Kubernetes 环境下部署 RabbitMQ 集群 Kubernetes 提供了强大的自动化编排能力,适合大规模部署 RabbitMQ 集群。 #### 部署步骤: 1. **创建命名空间** ```bash kubectl create ns rabbitmq ``` 2. **创建 RBAC 权限** 编写 ServiceAccount、Role 和 RoleBinding 的 YAML 文件,赋予相应的权限。 3. **配置持久化存储(如 NFS)** 创建 StorageClass 或直接使用 PersistentVolume 和 PersistentVolumeClaim 以确保数据持久化。 4. **编写 StatefulSet 和 Headless Service** StatefulSet 用于管理有状态应用,Headless Service 用于节点发现: ```yaml apiVersion: v1 kind: Service metadata: name: rabbitmq namespace: rabbitmq spec: clusterIP: None ports: - port: 5672 name: amqp - port: 15672 name: management selector: app: rabbitmq --- apiVersion: apps/v1 kind: StatefulSet metadata: name: rabbitmq namespace: rabbitmq spec: serviceName: rabbitmq replicas: 3 selector: matchLabels: app: rabbitmq template: metadata: labels: app: rabbitmq spec: containers: - name: rabbitmq image: rabbitmq:3-management ports: - containerPort: 5672 name: amqp - containerPort: 15672 name: management env: - name: RABBITMQ_ERLANG_COOKIE value: "secretcookie" - name: RABBITMQ_NODENAME valueFrom: fieldRef: fieldPath: metadata.name volumeMounts: - name: data mountPath: /var/lib/rabbitmq volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi ``` 5. **初始化集群** 使用 InitContainer 或 Job 执行集群初始化脚本,确保节点自动加入集群。 6. **验证部署** 查看 Pod 状态和日志,确认所有节点正常运行并组成集群: ```bash kubectl get pods -n rabbitmq kubectl logs <pod-name> -n rabbitmq ``` --- ### 四、注意事项 - **Erlang Cookie 一致性**:所有节点必须使用相同的 Erlang cookie,否则无法建立集群连接。 - **持久化存储**:为防止数据丢失,建议使用持久卷(Persistent Volume)进行数据持久化。 - **网络策略**:确保节点间的通信端口(如 4369、25672、5672)开放,特别是在 Kubernetes 中应合理配置网络策略。 - **资源限制**:根据业务负载合理设置 CPU 和内存资源请求与限制,避免资源争用导致性能下降。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值