RabbitMQ集群部署

本文详细介绍了如何部署RabbitMQ集群的镜像模式,包括安装RabbitMQ和Erlang,配置环境变量,同步ErlangCookie,创建并加入集群,以及设置镜像队列和权限。通过此过程,可以实现高可用性的RabbitMQ集群部署。

强烈推荐: 推荐好用便宜的辣鸡 VPS 服务器,适合学生党学习研究,建个小站挂个主页或简历什么的,本人用了3年了,便宜实惠还稳定
https://my.hostyun.com/page.aspx

RabbitMQ集群镜像模式部署

rabbitmq集群模式有2种

  • 普通集群模式(无高可用性): 默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。

  • 镜像集群模式(高可用性): 最常用的集群模式,把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。

RabbitMQ集群镜像模式部署过程

部署包含三个节点node1,node2和node3的集群。

以 node1 节点为基准,将 node2,node3 节点 加入 node1 节点的集群中。这3个节点是平等的

一. 安装Rabbitmq软件(node1,node2,node3)

1.下载Erlang源码并安装

wget https://github.com/erlang/otp/releases/download/OTP-24.0/otp_src_24.0.tar.gz
tar zxvf otp_src_24.0.tar.gz
cd otp_src_24.0
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-java

make
make install  

可能提示错误:configure: error: No curses library functions found
原因:缺少ncurses依赖库
安装ncurses:

wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz
tar -zxvf ncurses-6.1.tar.gz
cd ncurses-6.1
./configure --with-shared --without-debug --without-ada --enable-overwrite  
make
make install

2.下载Rabbitmq源码并安装

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.19/rabbitmq-server-generic-unix-3.8.19.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.8.19.tar.xz
mv rabbitmq_server-3.8.19 /usr/local/

3.添加环境变量配置

cat >> /etc/profile << -'EOF'
export PATH=$PATH:/usr/local/erlang/bin:/usr/local/rabbitmq_server-3.8.19/sbin
-EOF

source /etc/profile

4.验证各节点rabbitmq

# 启动rabbitmq,-detached代表后台守护进程方式启动。
rabbitmq-server -detached

# 查看状态,确定rabbitmq已经成功运行
rabbitmqctl status

# 先暂停各节点
rabbitmqctl stop

二. 部署Rabbitmq集群

1.统一认证Erlang Cookie

设置不同节点间同一认证的Erlang Cookie,采用从某个节点copy的方式保持Cookie的一致性。

启动rabbitmq之后会在~/.erlang.cookie/var/lib/rabbitmq/下生成一个.erlang.cookie隐藏文件,即使你把这个文件给删除了运行rabbitmq-server也会再次生成新的.erlang.cookie。

将node1的.erlang.cookie文件覆盖node2,node3节点上的.erlang.cookie文件(先暂停各节点的rabbitmq服务)。

# 复制 node1节点的.erlang.cookie文件到node2,node3
node1: scp ~/.erlang.cookie {node2_host_or_ip}:~/.erlang.cookie
node1: scp ~/.erlang.cookie {node3_host_or_ip}:~/.erlang.cookie
 
# 重新启动
node1: rabbitmq-server -detached
node2: rabbitmq-server -detached
node3: rabbitmq-server -detached  

2.创建并部署集群(在node2,node3上执行):

# node2
node2:rabbitmqctl stop_app
node2:rabbitmqctl reset
# 将node2加入node1节点所在集群
node2:rabbitmqctl join_cluster rabbit@{node1_host_or_ip}
node2:rabbitmqctl start_app
node2:rabbitmqctl cluster_status

# node3
node3:rabbitmqctl stop_app
node3:rabbitmqctl reset
# 将node3加入node1节点所在集群
node3:rabbitmqctl join_cluster rabbit@{node1_host_or_ip}
node3:rabbitmqctl start_app
node3:rabbitmqctl cluster_status

在node1上执行:rabbitmqctl cluster_status 查看节点是否成功加入集群

新建 virtualhost,并创建administrator权限的用户名和密码
# 创建名为 demo 的 VirtualHost
rabbitmqctl add_vhost demo

# 添加用户,密码
rabbitmqctl add_user your_username your_password

# 设置your_username为administrator权限
rabbitmqctl set_user_tags your_username administrator

# 使用户your_username具有demo这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
rabbitmqctl set_permissions -p demo your_username '.*' '.*' '.*'

将 队列 镜像到所有的rabbitmq集群中
rabbitmqctl set_policy -p demo ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

其他

常用操作命令:

# 查看状态
rabbitmqctl status  

# 关闭服务:
rabbitmqctl stop

# 关闭应用(关闭当前启动的节点)
rabbitmqctl stop_app

# 启动应用,和stop_app关闭命令配合使用,达到清空队列的目的
rabbitmqctl start_app

# 创建VirtualHost
rabbitmqctl add_vhost demo

# 启动web管理插件
rabbitmq-plugins enable rabbitmq_management

# 列出角色:
rabbitmqctl list_users

# 添加用户,密码
rabbitmqctl add_user patrick pwd123

# 设置patrick为administrator权限
rabbitmqctl set_user_tags patrick administrator

# 使用以下命令集群状态,目前相互独立,没有形成集群
rabbitmqctl cluster_status

# rabbitmq设置内存限制系数, 内存限制大小=机器内存 * 系数,eg: 1G = 4G * 0.25
rabbitmqctl set_vm_memory_high_watermark 0.4

# 剔除集群某个节点NodeX
NodeX: rabbitmqctl stop_app
NodeX: rabbitmqctl reset
NodeX: rabbitmqctl start_app
部署 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 和内存资源请求与限制,避免资源争用导致性能下降。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pushiqiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值