RabbitMQ高可用集群需完成环境准备、集群组建、镜像队列配置,并结合负载均衡与幂等处理,确保消息可靠与系统稳定。
一、环境准备与基础配置
1. 服务器规划与依赖安装
-
服务器信息(3节点示例):
主机名 IP地址 部署服务 rabbit-node1 192.168.0.12 RabbitMQ、HAProxy、KeepAlived rabbit-node2 192.168.0.14 RabbitMQ、HAProxy、KeepAlived rabbit-node3 192.168.0.15 RabbitMQ -
安装步骤:
bash# 安装Erlang(版本需与RabbitMQ匹配,如Erlang 26.2.3 + RabbitMQ 3.13.0) sudo rpm -ivh erlang-26.2.3-1.el7.x86_64.rpm # 安装RabbitMQ sudo rpm -ivh rabbitmq-server-3.13.0-1.el8.noarch.rpm # 启动并设置开机自启 sudo systemctl start rabbitmq-server && sudo systemctl enable rabbitmq-server
2. 主机解析与Cookie同步
-
配置hosts(所有节点):
bashsudo vim /etc/hosts # 添加 192.168.0.12 rabbit-node1 192.168.0.14 rabbit-node2 192.168.0.15 rabbit-node3 -
同步Erlang Cookie(集群认证密钥):
bash# 在rabbit-node1执行,拷贝Cookie到其他节点 sudo scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-node2:/var/lib/rabbitmq/ sudo scp /var/lib/rabbitmq/.erlang.cookie root@rabbit-node3:/var/lib/rabbitmq/ # 设置权限(所有节点) sudo chmod 600 /var/lib/rabbitmq/.erlang.cookie
---
二、集群搭建与高可用配置
1. 组建普通集群
-
加入集群(在rabbit-node2和rabbit-node3执行):
bash# 停止应用→重置节点→加入集群→启动应用 rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@rabbit-node1 # 以rabbit-node1为基准节点 rabbitmqctl start_app -
验证集群状态:
bashrabbitmqctl cluster_status # 应显示3个节点,状态为running
2. 配置镜像队列(核心高可用步骤)
-
设置镜像策略(所有队列同步至所有节点):
bashrabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode":"automatic"}' # 参数说明: # ha-all:策略名称 # "^":匹配所有队列(正则表达式) # ha-mode: all:镜像到集群所有节点 # ha-sync-mode: automatic:自动同步队列数据
---
三、负载均衡与故障转移
1. HAProxy负载均衡
-
安装与配置 (在rabbit-node1和rabbit-node2部署):
bashsudo yum install haproxy -y sudo vim /etc/haproxy/haproxy.cfg
配置示例 :inilisten rabbitmq_cluster bind 0.0.0.0:5672 # 对外服务端口 mode tcp balance roundrobin # 轮询负载均衡 server rabbit-node1 192.168.0.12:5672 check inter 5s rise 2 fall 3 server rabbit-node2 192.168.0.14:5672 check inter 5s rise 2 fall 3 server rabbit-node3 192.168.0.15:5672 check inter 5s rise 2 fall 3
2. KeepAlived故障转移
- 配置虚拟IP(VIP),确保HAProxy高可用,客户端通过VIP访问集群。
---
四、消息幂等处理
1. 唯一ID + 去重表
-
创建去重表:
sqlCREATE TABLE message_idempotency ( id VARCHAR(36) PRIMARY KEY, # 消息唯一ID(UUID) create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -
Java代码实现:
javapublic class IdempotencyService { // 检查消息是否已处理 public boolean isProcessed(String msgId) { // 查询数据库,存在则返回true } // 标记消息为已处理 public void markProcessed(String msgId) { // 插入数据库 } }