docker-compose+HAProxy+Keepalived搭建高可用 RabbitMQ 集群

news2025/7/29 15:13:36

基础环境准备

系统环境:Centos7.6
Docker version: 1.13.1, build 7d71120/1.13.1
Docker Compose version: v2.2.2
三个节点:

10.10.11.79 (这一台做rabbitmq集群根节点)
10.10.11.80  (这台做haproxy+keepalived高可用 master节点)
10.10.11.81  (这台做haproxy+keepalived高可用 backup节点)

RabbitMQ 集群中节点包括内存节点(RAM)、 磁盘节点(Disk, 消息持久化), 集群中至少有一个 Disk 节点。

10.10.11.79,10.10.11.80做磁盘节点,10.10.11.81做内存节点。

下面开始先搭建普通集群模式,此方案只适用非持久化非持久化队列。

docker-compose安装rabbitmq:

三个节点都创建文件夹/home/rabbitmq,注意挂载目录的权限问题。

节点1 yaml文件(此节点作集群根节点):

version: '3'
services:
  rabbitmq:
    container_name: mcst-rabbitmq
    image: rabbitmq:3-management
    restart: always
    ports:
      - 4369:4369
      - 5671:5671
      - 5672:5672
      - 15672:15672
      - 25672:25672
    environment:
      - TZ=Asia/Shanghai
      - RABBITMQ_ERLANG_COOKIE=iweru238roseire
      - RABBITMQ_DEFAULT_USER=mcst_admin
      - RABBITMQ_DEFAULT_PASS=mcst_admin_123
      - RABBITMQ_DEFAULT_VHOST=mcst_vhost
    hostname: rabbitmq1
    extra_hosts:
      - rabbitmq1:10.10.11.79
      - rabbitmq2:10.10.11.80
      - rabbitmq3:10.10.11.81
    volumes:
      - ./data:/var/lib/rabbitmq

注意:三个节点 RABBITMQ_ERLANG_COOKIE 保持一致。一定要有 extra_hosts 配置,否则在搭建集群的过程中会连接不到其他 rabbitmq 节点服务。此节点作为集群根节点。

启动命令:

docker-compose -f mcst-rabbitmq-node1.yaml up -d

停止:

docker-compose -f mcst-rabbitmq-node1.yaml stop

节点2 yaml文件(从节点):

version: '3'
services:
  rabbitmq:
    container_name: mcst-rabbitmq
    image: rabbitmq:3-management
    restart: always
    ports:
      - 4369:4369
      - 5671:5671
      - 5672:5672
      - 15672:15672
      - 25672:25672
    environment:
      - TZ=Asia/Shanghai
      - RABBITMQ_ERLANG_COOKIE=iweru238roseire
      - RABBITMQ_DEFAULT_USER=mcst_admin
      - RABBITMQ_DEFAULT_PASS=mcst_admin_123
      - RABBITMQ_DEFAULT_VHOST=mcst_vhost
    hostname: rabbitmq2
    extra_hosts:
      - rabbitmq1:10.10.11.79
      - rabbitmq2:10.10.11.80
      - rabbitmq3:10.10.11.81
    volumes:
      - ./node2-rabbitmq.sh:/home/node2-rabbitmq.sh
      - ./data:/var/lib/rabbitmq

另外在同目录下面需要编辑一个脚本node2-rabbitmq.sh:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq1
rabbitmqctl start_app

在这里插入图片描述

启动命令:

docker-compose -f mcst-rabbitmq-node2.yaml up -d

停止:

docker-compose -f mcst-rabbitmq-node2.yaml stop

在这里插入图片描述
进入容器内部:

docker exec -it mcst-rabbitmq bash

执行脚本将当前节点添加到集群中(注意文件执行权限):

cd  home
sh node2-rabbitmq.sh

执行脚本的时候可能会报这个错误:

Error: unable to perform an operation on node 'rabbit@rabbitmq2'

没有ping通

把节点2的防火墙关闭:

systemctl stop firewalld

重启docker:

systemctl restart docker

重启容器:

docker start mcst-rabbitmq

进入容器重新执行脚本即可:
在这里插入图片描述

节点3 yaml文件(从节点):

version: '3'
services:
  rabbitmq:
    container_name: mcst-rabbitmq
    image: rabbitmq:3-management
    restart: always
    ports:
      - 4369:4369
      - 5671:5671
      - 5672:5672
      - 15672:15672
      - 25672:25672
    environment:
      - TZ=Asia/Shanghai
      - RABBITMQ_ERLANG_COOKIE=iweru238roseire
      - RABBITMQ_DEFAULT_USER=mcst_admin
      - RABBITMQ_DEFAULT_PASS=mcst_admin_123
      - RABBITMQ_DEFAULT_VHOST=mcst_vhost
    hostname: rabbitmq3
    extra_hosts:
      - rabbitmq1:10.10.11.79
      - rabbitmq2:10.10.11.80
      - rabbitmq3:10.10.11.81
    volumes:
      - ./rabbitmq-ram.sh:/home/rabbitmq-ram.sh
      - ./data:/var/lib/rabbitmq

同目录下建一个脚本rabbitmq-ram.sh:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app

在这里插入图片描述
启动命令:

docker-compose -f mcst-rabbitmq-node3.yaml up -d

在这里插入图片描述
进入容器内部:

docker exec -it mcst-rabbitmq bash

执行脚本, 把内存节点到集群中:

sh rabbitmq-ram.sh

如果第三个几点启动的时候报链接不上根节点:
在这里插入图片描述
把根节点(10.10.11.79)的网络端口打开:
查看端口是否开放
firewall-cmd --query-port=4369/tcp
开放端口
firewall-cmd --permanent --add-port=4369/tcp
重启防火墙
firewall-cmd --reload

重试:
在这里插入图片描述

查看集群状态:

查看:
http://10.10.11.79:15672 进入管理端查看集群状态。
这三节点的个ip 都可以访问,
用户:mcst_admin 密码:mcst_admin_123
在这里插入图片描述
将rabbitmq2,rabbitmq3的节点加入rabbitmq1中创建普通集群,集群就已经搭建好了。

Springboot链接一下:

这里使用addresses 链接多个ip。

spring:
  rabbitmq:
#    rabbitmq集群地址
    addresses: 10.10.11.79:5672,10.10.11.80:5672,10.10.11.81:5672
    username: test
    password: 123456
    #虚拟host
    virtual-host: mcst_vhost

在这里插入图片描述
在普通模式的基础上,还把需要的队列做成镜像队列,存在于多个节点来实现高可用(HA):haproxy+keepalived高可用集群

安装HAProxy

用 HAProxy 作为 RabbitMQ 集群的负载均衡。
因为79是集群的根节点,所以我们在80,81两个节点上建立文件夹/home/haproxy
需要创建两个文件,
在这里插入图片描述

1.创建启动容器的mcst-haproxy.yaml 文件:

version: '3'
services:
  haproxy:
    container_name: mcst-haproxy
    image: haproxy:2.1
    restart: always
    ports:
      - 8100:8100
      - 15670:5670
    environment:
      - TZ=Asia/Shanghai
    extra_hosts:
      - rabbitmq1:10.10.11.79
      - rabbitmq2:10.10.11.80
      - rabbitmq3:10.10.11.81
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro

设置 extra_hosts(rabbitmq 集群节点 ip) 和 volumes(使用自定义的配置文件

2.yaml文件同级目录下面创建haproxy 配置文件haproxy.cfg:

global
    log 127.0.0.1 local0 info
    maxconn 4096

defaults
    log     global
    mode    tcp
    option  tcplog
    retries 3
    option  redispatch
    maxconn 2000
    timeout connect 5s
    timeout client 120s
    timeout server 120s

# ssl for rabbitmq
# frontend ssl_rabbitmq
    # bind *:5673 ssl crt /root/rmqha_proxy/rmqha.pem
    # mode tcp
    # default_backend rabbitmq

# web 管理界面
listen stats
    bind *:8100
    mode http
    stats enable
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth admin:admin123
# 配置负载均衡
listen rabbitmq
    bind *:5670
    mode tcp
    balance roundrobin
    server  rabbitmq1 rabbitmq1:5672  check inter 5s rise 2 fall 3
    server  rabbitmq2 rabbitmq2:5672  check inter 5s rise 2 fall 3
    server  rabbitmq3 rabbitmq3:5672  check inter 5s rise 2 fall 3

两个节点使用相同的配置。

两个节点都要启动,部署命令:

docker-compose -f mcst-haproxy.yaml up -d

在这里插入图片描述

HAProxy Master:10.10.11.80
HAProxy Backup:10.10.11.81

登录 HAProxy 的管理端查看集群状态:

用户:admin
密码:admin123
http://10.10.11.80:8100/
在这里插入图片描述
为了防止 HAProxy 单点故障,用 Keepalived 将两个 HAProxy 节点做成一主一备。应用使用 VIP(虚拟IP) 访问 HAProxy 服务时,默认连接主机(Master)的 HAProxy,当主机(Master)上的 HAProxy 故障时,VIP 会漂移到备机(Backup)上,就会连接备机(Backup)上的 HAProxy 服务。

安装 Keepalived

如果其中一个节点的HAProxy 服务挂了,我们也要保证服务是可用的,这样就需要健康检测服务Keepalived,使用keepalived搭建双主热备。

yum安装:

yum clean all
yum install -y keepalived

keepalived常用命令:

systemctl  start  keepalived.service   #启动keepalived
systemctl  stop  keepalived.service   #停止keepalived   
systemctl  status  keepalived.service  #查看keepalived状态

Master (80节点)节点配置:

创建配置文件 /etc/keepalived/keepalived.conf:

vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # verify haproxy's pid existance
    interval 5                   # check every 2 seconds
    weight -2                    # if check failed, priority will minus 2
}
vrrp_instance VI_1 {
    # 主机: MASTER
    # 备机: BACKUP
    state MASTER
    # 实例绑定的网卡, 用ip a命令查看网卡编号
    interface ens192
    # 虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样
    virtual_router_id 51
    # 优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器
    priority 101
    # 虚拟IP地址,可以有多个,每行一个
    virtual_ipaddress {
        10.10.11.77
    }
    track_script {               # Scripts state we monitor
        chk_haproxy              
    }
}

Backup(81节点)节点配置:

创建配置文件 /etc/keepalived/keepalived.conf:

vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # verify haproxy's pid existance
    interval 5                   # check every 2 seconds
    weight -2                    # if check failed, priority will minus 2
}
vrrp_instance VI_1 {
    # 主机: MASTER
    # 备机: BACKUP
    state BACKUP
    # 实例绑定的网卡, 用ip a命令查看网卡编号
    interface ens192
    # 虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样
    virtual_router_id 51
    # 优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器
    priority 100
    # 虚拟IP地址,可以有多个,每行一个
    virtual_ipaddress {
        10.10.11.77
    }
    track_script {               # Scripts state we monitor
        chk_haproxy              
    }
}

创建完配置,两个节点都要启动 keepalived:

systemctl restart keepalived

通过虚拟ip访问:

http://10.10.11.77:15672
用户:mcst_admin 密码:mcst_admin_123
在这里插入图片描述

springboot链接测试:

使用keepalived的虚拟ip链接

spring:
  rabbitmq:
    #rabbitmq集群虚拟ip地址
    host: 10.10.11.77
    port: 5672
    username: test
    password: 123456
    #虚拟host
    virtual-host: mcst_vhost


如果链接不上,检查一下下面几个地方:
在这里插入图片描述

1.mq的端口号,是5672,不是访问浏览器时候的15672
2.不要使用默认账户,新建用户添加相关的权限
3.Springboot链接配置种是否配置了virtual-host
4.ip+5672 查看一下服务器网络端口是不是开放了

显示链接成功了:
在这里插入图片描述

在这里插入图片描述
RabbitMQ 高可用 集群就搭建好了,想试试的动手操作一下吧,整个流程还是比较快的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S Pod健康检查

因为 k8s 中采用大量的异步机制、以及多种对象关系设计上的解耦,当应用实例数 增加/删除、或者应用版本发生变化触发滚动升级时,系统并不能保证应用相关的 service、ingress 配置总是及时能完成刷新。在一些情况下,往往只是新的 Pod 完成自身…

Python|蓝桥杯进阶第二卷——贪心

欢迎交流学习~~ 专栏: 蓝桥杯Python组刷题日寄 蓝桥杯进阶系列: 🏆 Python | 蓝桥杯进阶第一卷——字符串 🔎 Python | 蓝桥杯进阶第二卷——贪心 💝 Python | 蓝桥杯进阶第三卷——动态规划(待续&#xf…

关于信息安全认证CISP、PTE对比分析

CISP 注册信息安全专业人员 CISP-PTE 注册渗透测试工程师(以下简称PTE) 1 、发证机构 CISP与PTE的发证机构都是中国信息安全测评中心,政府背景给认证做背书,学员信息都在中国政府可控的机构手中; 如果想在政府、国…

TryHackMe-Tardigrade(应急响应)

Tardigrade 您能否在此 Linux 端点中找到所有基本的持久性机制? 服务器已遭到入侵,安全团队已决定隔离计算机,直到对其进行彻底清理。事件响应团队的初步检查显示,有五个不同的后门。你的工作是在发出信号以使服务器恢复生产之前…

MyBatis源码分析(七)MyBatis与Spring的整合原理与源码分析

文章目录写在前面一、SqlSessionFactoryBean配置SqlSessionFactory1、初识SqlSessionFactoryBean2、实现ApplicationListener3、实现InitializingBean接口4、实现FactoryBean接口5、构建SqlSessionFactory二、SqlSessionTemplate1、初始SqlSessionTemplate2、SqlSessionTemplat…

这个WPF DataGrid组件,可以让业务数据管理更轻松!(Part 2)

DevExpress WPF的DataGrid组件是专用于WPF平台的高性能XAML网格控件,该组件附带了几十个具有高影响力的功能,使开发者可以轻松地管理数据并根据也无需要在屏幕上显示数据。在上文中(点击这里回顾>>)为大家介绍了DevExpress …

HTTPS详解(原理、中间人攻击、CA流程)

摘要我们访问浏览器也经常可以看到https开头的网址,那么什么是https,什么是ca证书,认证流程怎样?这里一一介绍。原理https就是httpssl,即用http协议传输数据,数据用ssl/tls协议加密解密。具体流程如下图&am…

企业级信息系统开发学习笔记1.8 基于Java配置方式使用Spring MVC

文章目录零、本节学习目标一、基于Java配置与注解的方式使用Spring MVC1、创建Maven项目 - SpringMVCDemo20202、在pom.xml文件里添加相关依赖3、创建日志属性文件 - log4j.properties4、创建首页文件 - index.jsp5、创建Spring MVC配置类 - SpringMvcConfig6、创建Web应用初始…

C++基础了解-02-C++ 数据类型

C 数据类型 一、C 数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当创建一个变量时,就会在内存中保留一些空间。 可能需要存储各种数据类型(比如字符型、宽…

JDK如何判断自己是什么公司的

0x00 前言 因为一些事情,遇到了这样一个问题,JDK如何判断自己是什么公司编译的。因为不同的公司编译出来,涉及到是否商用收费的问题。 平时自己使用的时候,是不会考虑到JDK的编译公司是哪一个,都是直接拿起来用&#…

windows下安装emqx Unable to load emulator DLL@if ===/ SET data_dir=“

1.报错内容 I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\bin>emqx start Unable to load emulator DLL (I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\erts-12.3.2.9\bin\beam.smp.dll) 此时不应有 SET。 I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\bin&…

格密码学习笔记(四):格上公认难题

文章目录最短向量问题最近向量问题最短线性无关向量问题基于格的可靠信息传输CVP问题的两种版本ADD问题规约到SIVP问题上致谢最短向量问题 格的每个量都定义了一个对应的计算问题。对于第一连续极小λ1\lambda_1λ1​而言,其对应的计算问题为最短向量问题。 定义 …

idea 2020 常用配置

激活步骤 本机环境信息如下 名称版本操作系统MacOS Mojave 10.14.6IDEAUltimate 2020.3激活时间2023/03/07 更新 Reposity 【Intellij IDEA】- 【Preferences…】- 【Plugins】- 【Manage Plugin Repositories】 添加新的repository https://plugins.zhile.io下载 Eval Re…

java进阶—线程安全问题

线程安全问题,就涉及到一个资源共享,资源共享很好理解,就是多个线程同时操作一个资源池 就比如,快五一了,12306 购票,假设从北京到上海的 高铁票 一共只有200 张,现在3个人同时在线抢票&#x…

【ONE·C || 程序编译简述】

总言 C语言:程序编译相关。    文章目录总言1、程序的翻译环境和运行环境1.1、简述1.2、翻译环境:程序编译与链接1.2.1、简介:程序如何从.c文件形成.exe可执行程序1.2.2、过程说明1.3、运行环境2、预处理详解2.1、预定义符号2.2、#define2.…

参考文献怎么查找,去哪里查找?一篇文章讲明白这些问题

在我们撰写论文查找参考文献时,往往不知道从哪里入手,本文小编就针对下面这三个方面给大家详细讲解下: 一、查找参考文献方法 二、参考文献资料查找网站 三、参考文献格式规范 一、查找参考文献方法: 1、知网全球最大的中文数据…

DBeaver连接mysql、oracle数据库

1. DBeaver连接mysql 1) 下载DBeaver https://dbeaver.io/download/,并安装 2) 新建数据库连接 3)选择mysql驱动程序 4)填写连接设置内容 5)点击 “编辑驱动设置”,并填写相关信息 6)选择本地…

九龙证券|朝着双向开放稳步前进――从沪深港通全面扩容看资本市场对外开放

2023年春天的资本商场,高水平双向敞开的步履益发铿锵。 伴随着沪深买卖所互联互通股票标的规划扩展规矩正式对外发布,3月13日,内地与香港资本商场行将迎来史上最大规划双向扩容——沪深股通标的股票合计将添加1034只,调整后沪股通…

Web前端学习:六 -- 练习小总结

1、背景颜色透明度写法: background:rgba(R,G,B,Alpha透明度) 透明度范围:0–1,1完全不透明,0完全透明 2、伪类 hovar: 当鼠标接触该元素是,显示另一种样…

安恒信息java实习面经

目录1.Java ME、EE、SE的区别,Java EE相对于SE多了哪些东西?2.jdk与jre的区别3.说一下java的一些命令,怎么运行一个jar包4.简单说一下java数据类型及使用场景5.Map跟Collection有几种实现?6.面向对象的特性7.重载和重写的区别8.重…