rabbitmq选举集群搭建

Rabbitmq选举集群搭建


文章目录


前言

在生产环境中rabbitmq常常需要搭建集群,下面我就给大家分享一下rabbitmq选举集群的搭建过程,搭建环境为两台机器,1.6和1.89,在1.89上安装了docker,这样模拟出三个机器,组成最小集群。


基础知识介绍

rabbimq选举集群介绍

RabbitMQ 选举集群是自 RabbitMQ 3.8 版本引入,基于 Raft 一致性协议实现,旨在替代传统的镜像队列,因为传统的镜像队列有缺陷,估计后面官方会把镜像队列去除掉。

Raft 协议介绍

Raft 协议是一种专为分布式系统设计的共识算法,它的核心目标是让多个服务器节点在面对网络故障、机器宕机等异常情况时,依然能就"数据状态"达成一致。相比于早期的 Paxos 算法,Raft 最大的特点是易于理解和工程实现,Raft知识共识算法中的一种还有: Paxos、Zab、Gossip等算法。

核心运作机制

在 Raft 算法中,每个节点都有以下 3 个角色之一:

  • Leader(领导者):负责处理所有客户端的请求,并将这些请求作为日志,发送给所有的 Follower. Leader 会定期向所有 Follower 发送心跳消息,告诉他们 "我是领导,我还活着",防止 Follower 进入选举流程.
  • Follower(跟随者):跟随者 不直接处理客户端请求,而是接受 Leader 发送的日志,并使用这些信息.
  • Candidate(候选者):当 跟随者 在一段时间内没有收到 Leader 的心跳消息,就会变成 Candidate,并开始进入选举流程

常用命令

查看rabbitmq版本

shell 复制代码
sudo rabbtimqctl version

输出内容如下:

rabbitmq开启MQtt和管理端页面服务

powershell 复制代码
sudo rabbitmq-plugins enable rabbitmq_management
sudo rabbitmq-plugins enable rabbitmq_mqtt

查看集群状态

powershell 复制代码
rabbitmqctl cluster_status

查看Erlang版本

shell 复制代码
sudo erl

输出内容如下:

代码修改

默认情况下创建队列的时候rabbitmq x-queue-type值为classic,但是classic不支持Raft协议。需要在创建队列的时候把类型设置为quorum。这里需要注意如果是从classic改为quorum类型的时候如果之前业务里使用到了队列的优先级参数需要调整,classic支持10级,但是quorunm只有两级一种是普通一种是高优先级(1-4为普通;5-9高)这里说的是给 BasicProperties中Priority赋的值

classic和quorum队列对比

特性维度 Classic Queue (经典队列) Quorum Queue (仲裁队列)
核心设计 单机、非复制 FIFO 实现,追求高性能和低延迟。 分布式、强一致,基于 Raft 共识算法,数据安全是最高优先级。
数据安全 低,节点宕机会导致数据丢失(除非使用了已被移除的镜像队列)。 高,数据同步到集群多数节点后才确认,属于"持久化+复制"队列。
消息优先级 完全支持 (0-255级);需通过参数声明优先级数量,完全按优先级消费。 有限支持 (仅2级);从 4.0 开始支持,仅有高、普通两级,按 2:1 的比例混合投递。
适用场景 非关键数据、临时队列;例如:RPC 请求响应、非核心日志、可容忍偶尔丢失的后台任务。 关键数据、核心业务;例如:交易订单、支付消息、任何不能丢失的消息。
性能与资源 性能高、资源占用低;无复制开销,可以暂存于内存。 性能略低、资源消耗高;需写入磁盘+网络同步,至少需要 3 个节点建议。

集群搭建

目前企业级rabbitmq集群搭建方案主要采用:仲裁队列(Quorum Queues)+HAProxy+Keepalived

测试环境介绍:目前我们有两台机器:1.6和1.89

为了达成最小集群(3台机器)我们在1.89上安装一个docker模拟一台机器
注意 如果之前是单节点重新配置为集群之后会丢失掉之前rabbitmq创建的用户信息需要重新创建。

rabbitmq配置

物理机上安装

powershell 复制代码
#!/bin/sh

sudo apt-get install curl gnupg apt-transport-https -y

## Team RabbitMQ's main signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
## Community mirror of Cloudsmith: modern Erlang repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
## Community mirror of Cloudsmith: RabbitMQ repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null

## Add apt repositories maintained by Team RabbitMQ
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main

# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main

## Provides RabbitMQ
##
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main

# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
EOF

## RabbitMQ Start
sudo apt-get install apt-transport-https
sudo apt-get install curl gnupg apt-transport-https -y

## Team RabbitMQ's signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Modern Erlang/OTP releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-erlang/ubuntu/noble noble main
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-erlang/ubuntu/noble noble main

## Provides modern RabbitMQ releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-server/ubuntu/noble noble main
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-server/ubuntu/noble noble main
EOF

## Update package indices
sudo apt-get update -y

## Install Erlang packages
sudo apt-get install -y erlang-base \
                        erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
                        erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
                        erlang-runtime-tools erlang-snmp erlang-ssl \
                        erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server=4.1.3-1 -y --fix-missing
## RabbitMQ End

修改host

powershell 复制代码
echo "192.168.1.6    rabbit-node-1" >> /etc/hosts
echo "192.168.1.89   rabbit-node-2" >> /etc/hosts

加入集群

powershell 复制代码
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit-node-1
rabbitmqctl start_app

docker中安装

  1. 修改镜像源
powershell 复制代码
sudo vi /etc/docker/daemon.json

把以下内容复制到这个配置文件里

powershell 复制代码
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://dockerproxy.com"
  ]
}

然后执行以下命令应用配置然后重启docker服务

powershell 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 拉取rabbitmq集群镜像
powershell 复制代码
docker pull rabbitmq:4.1.3-management

输出以下内容说明拉取成功

  1. 创建容器
    注意这里的'ASXZNAVZTXMWHMQZRGTO'是你是设置的erlang.cookie里的字符串
powershell 复制代码
docker run -d \
  --name rabbitmq-node3 \
  --hostname rabbit-docker-3 \
  --network bridge \
  -p 5673:5672 -p 15673:15672 -p 4370:4369 -p 25673:25672 -p 1888:1883\
  --add-host rabbit-node-1:192.168.1.6 \
  --add-host rabbit-node-2:192.168.1.89 \
  -e RABBITMQ_ERLANG_COOKIE='ASXZNAVZTXMWHMQZRGTO' \
  -v /var/lib/rabbitmq-docker:/var/lib/rabbitmq \
  rabbitmq:4.1.3-management
  1. docker加入以rabbit-node-1为leader的集群
powershell 复制代码
docker exec -it rabbitmq-node3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit-node-1
rabbitmqctl start_app
exit
  1. 开启页面服务和mqtt服务

进入容器

powershell 复制代码
 docker exec -it rabbitmq-node3 bash

开启服务

powershell 复制代码
 rabbitmq-plugins enable rabbitmq_mqtt
 rabbitmq-plugins enable rabbitmq_management
配置erlang.cookie

注意这一步需要安装了rabbitmq之后再操作

物理机上执行

powershell 复制代码
vi /var/lib/rabbitmq/.erlang.cookie

docker上执行

powershell 复制代码
docker exec -it <容器名> vi /var/lib/rabbitmq/.erlang.cookie

把所有机器上的值都设置为相同的一串字符串。

配置 keepalived

作用说明

Keepalived 的核心作用是解决 HAProxy 自身的单点故障问题,为负载均衡层提供高可用保障。

  • 提供虚拟 IP(VIP):Keepalived 会在多台 HAProxy 节点之间维护一个漂移的虚拟 IP。客户端只需连接这个 VIP,而非具体某个 HAProxy 的物理 IP
  • 主备自动切换:正常情况下,VIP 只在主 HAProxy 节点上生效。如果主节点宕机或服务异常,Keepalived 会自动将 VIP 漂移到备节点,整个过程对客户端无感知。
  • 健康检查联动:Keepalived 会持续检测 HAProxy 进程的状态(比如通过检查端口、进程或自定义脚本)。一旦发现 HAProxy 服务失效,会主动触发 VIP 切换,避免客户端被路由到已失效的负载均衡器。

通常会是这样的 2 + N 模式:

  • 两台服务器部署 HAProxy + Keepalived 组合,形成主备关系,对外暴露一个虚拟 IP。

  • 三台或更多服务器部署 RabbitMQ 仲裁队列集群。

安装

我们目前的情景时有两台机器(1.6、1.89)加上一个(1.89)上的docker组成集群;这里我选择1.6作为主服务器;1.89就做备用服务器。

在1.6和1.89上执行以下语句进行安装

powershell 复制代码
sudo apt install keepalived

验证是否安装成功

powershell 复制代码
keepalived -version

输出如下图:

创建健康检查脚本

这里主节点(1.6)备用节点(1.89)上都需要创建

它主要是负责检查HAproxy是否正常,如果不正常的话就Keepalived就需要做漂移,把请求转到另一个正常的HAproxy上去。

powershell 复制代码
vi /etc/keepalived/check_haproxy.sh

把以下内容写入文件

powershell 复制代码
#!/bin/bash
if pgrep haproxy > /dev/null; then
    exit 0
fi
# 尝试重启
systemctl start haproxy
sleep 2
if pgrep haproxy > /dev/null; then
    exit 0
else
    # 重启失败,停止 keepalived 释放 VIP
    systemctl stop keepalived
    exit 1
fi

授予执行权限

powershell 复制代码
chmod +x /etc/keepalived/check_haproxy.sh
配置Master(192.168.1.6)的Keepalived

执行以下命令

powershell 复制代码
vim /etc/keepalived/keepalived.conf

把以下内容复制到文件内
注意以下配置文件中'eno1'为网卡名称,需要改为自己机器上的网卡名称

查看网卡名称命令

powershell 复制代码
ip link show
powershell 复制代码
global_defs {
    router_id RABBIT1
    script_user root
    enable_script_security
}

vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eno1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        chk_haproxy
    }
}
配置Backup (192.168.1.89)的Keepalived

执行以下命令

powershell 复制代码
vim /etc/keepalived/keepalived.conf

注意以下配置文件中'ens160'为网卡名称,需要改为自己机器上的网卡名称

查看网卡名称命令

powershell 复制代码
ip link show

配置文件内容

powershell 复制代码
global_defs {
    router_id RABBIT2
    script_user root
    enable_script_security
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass maiyuan!2#
    }
    virtual_ipaddress {
        192.168.1.100/24 dev ens160
    }
    track_script {
        chk_haproxy
    }
}
启动服务

这里两台机器上都要执行

powershell 复制代码
systemctl enable keepalived
systemctl restart keepalived
systemctl status keepalived

当服务启动成功之后外部应用要访问rabbitmq就可以通过192.186.1.100+5670 进行访问了

验证服务是否正常

验证 VIP 是否已绑定
注意以下命令中'eno1'为网卡名称,需要改为自己机器上的网卡名称

powershell 复制代码
ip addr show eno1 | grep 192.168.1.100

当配置完成之后就可以通过我们指定的ip去访问mq服务了

配置 HAproxy

安装

执行以下命令进行安装

powershell 复制代码
sudo apt install -y haproxy
配置

这里因为我配置了pgsql的集群所有配置文件有pgsql集群的数据,如果不需要可以把多余的删除掉,只保留rabbitmq的相关配置

powershell 复制代码
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log global
        mode tcp                # 使用 TCP 模式,这是 PostgreSQL 协议所必需的
        option tcplog
        retries 3
        timeout connect 10s
        timeout client 1m
        timeout server 1m
        # 确保长连接不会因空闲而被断开
        timeout client 1h
        timeout server 1h
        #errorfile 400 /etc/haproxy/errors/400.http
        #errorfile 403 /etc/haproxy/errors/403.http
        #errorfile 408 /etc/haproxy/errors/408.http
        #errorfile 500 /etc/haproxy/errors/500.http
        #errorfile 502 /etc/haproxy/errors/502.http
        #errorfile 503 /etc/haproxy/errors/503.http
        #errorfile 504 /etc/haproxy/errors/504.http


# 用于管理界面的后端配置
frontend stats
        mode http
        bind *:7000
        stats enable
        stats uri /stats
        stats refresh 10s
        stats admin if LOCALHOST

# ---------------------------------------------------------------------
# 1.pgsql 读写端口:只路由到主库
# ---------------------------------------------------------------------
frontend postgres_master_frontend
        bind *:5431
        default_backend postgres_master_backend

backend postgres_master_backend
        option httpchk GET /primary HTTP/1.1
        http-check send hdr Host 192.168.1.6
        #default-server check-ssl verify none
        # 注意:master 节点必须通过 Patroni REST API 的 8008 端口进行健康检查
        server pg-node1 192.168.1.6:5433 check port 8008 inter 3s fall 3 rise 2

# ---------------------------------------------------------------------
# 2.pgsql 只读端口:路由到所有健康副本 (Replicas)
# ---------------------------------------------------------------------
frontend postgres_replica_frontend
        bind *:5430
        default_backend postgres_replica_backend

backend postgres_replica_backend
    option httpchk GET /replica HTTP/1.1
    http-check send hdr Host 192.168.1.89
    #default-server check-ssl verify none
    server pg-node2 192.168.1.89:5433 check port 8008 inter 3s fall 3 rise 2
# ---------------------------------------------------------------------
# RabbitMQ 负载均衡核心配置
# ---------------------------------------------------------------------
# RabbitMQ AMQP 代理配置
listen rabbitmq_cluster
    bind *:5670
    mode tcp
    balance roundrobin
    # 后端集群节点配置,将IP替换为你的实际IP和端口
    server rabbit-node-1 192.168.1.6:5672 check inter 5000 rise 2 fall 3
    server rabbit-node-2 192.168.1.89:5672 check inter 5000 rise 2 fall 3
    server rabbit-docker-3 192.168.1.89:5673 check inter 5000 rise 2 fall 3
# RabbitMQ MQTT 代理配置
listen rabbitmq_mqtt
    bind *:1880                # 1. 监听 MQTT 默认端口
    mode tcp                   # 2. 使用四层代理模式
    balance roundrobin         # 3. 采用轮询负载均衡算法
    # 4. 后端服务器列表,配置你的RabbitMQ节点
    server rabbit-node-1 192.168.1.6:1883 check inter 5000 rise 2 fall 3
    server rabbit-node-2 192.168.1.89:1883 check inter 5000 rise 2 fall 3
    server rabbit-docker-3 192.168.1.89:1888 check inter 5000 rise 2 fall 3

修改配置之后执行以下命令应用最新配置

powershell 复制代码
sudo systemctl reload haproxy

验证是否配置成功

访问:http://192.168.1.100:7000/stats


相关推荐
无心水4 小时前
【分布式利器:金融级】金融级分布式架构开源框架全景解读
人工智能·分布式·金融·架构·开源·wpf·金融级框架
BIG_PEI4 小时前
如何判断Linux服务器上是否安装了rabbitmq
linux·服务器·rabbitmq
Swift社区5 小时前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
无心水5 小时前
【分布式利器:SOAF】蚂蚁开源的金融级微服务全家桶:SOFAStack 核心架构与实战选型对比
人工智能·分布式·微服务·金融·架构·开源·分布式利器
深蓝电商API5 小时前
分布式电商爬虫架构:Scrapy-Redis+消息队列的集群部署
分布式·爬虫·架构
阿正的梦工坊5 小时前
RabbitMQ 消息队列详解:从原理到实战
分布式·rabbitmq
敖正炀19 小时前
高并发系统的降级预案与容错策略
分布式·架构
敖正炀19 小时前
稳定性监控与告警体系:SLI/SLO/SLA 实践
分布式·架构
敖正炀20 小时前
故障演练与混沌工程:ChaosBlade 到 Litmus
分布式·架构