docker-compose+HAProxy+Keepalived搭建高可用 RabbitMQ 集群
基础环境准备
系统环境: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-rabbitmqimage: rabbitmq:3-managementrestart: alwaysports:- 4369:4369- 5671:5671- 5672:5672- 15672:15672- 25672:25672environment:- TZ=Asia/Shanghai- RABBITMQ_ERLANG_COOKIE=iweru238roseire- RABBITMQ_DEFAULT_USER=mcst_admin- RABBITMQ_DEFAULT_PASS=mcst_admin_123- RABBITMQ_DEFAULT_VHOST=mcst_vhosthostname: rabbitmq1extra_hosts:- rabbitmq1:10.10.11.79- rabbitmq2:10.10.11.80- rabbitmq3:10.10.11.81volumes:- ./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-rabbitmqimage: rabbitmq:3-managementrestart: alwaysports:- 4369:4369- 5671:5671- 5672:5672- 15672:15672- 25672:25672environment:- TZ=Asia/Shanghai- RABBITMQ_ERLANG_COOKIE=iweru238roseire- RABBITMQ_DEFAULT_USER=mcst_admin- RABBITMQ_DEFAULT_PASS=mcst_admin_123- RABBITMQ_DEFAULT_VHOST=mcst_vhosthostname: rabbitmq2extra_hosts:- rabbitmq1:10.10.11.79- rabbitmq2:10.10.11.80- rabbitmq3:10.10.11.81volumes:- ./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-rabbitmqimage: rabbitmq:3-managementrestart: alwaysports:- 4369:4369- 5671:5671- 5672:5672- 15672:15672- 25672:25672environment:- TZ=Asia/Shanghai- RABBITMQ_ERLANG_COOKIE=iweru238roseire- RABBITMQ_DEFAULT_USER=mcst_admin- RABBITMQ_DEFAULT_PASS=mcst_admin_123- RABBITMQ_DEFAULT_VHOST=mcst_vhosthostname: rabbitmq3extra_hosts:- rabbitmq1:10.10.11.79- rabbitmq2:10.10.11.80- rabbitmq3:10.10.11.81volumes:- ./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:5672username: testpassword: 123456#虚拟hostvirtual-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-haproxyimage: haproxy:2.1restart: alwaysports:- 8100:8100- 15670:5670environment:- TZ=Asia/Shanghaiextra_hosts:- rabbitmq1:10.10.11.79- rabbitmq2:10.10.11.80- rabbitmq3:10.10.11.81volumes:- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
设置 extra_hosts(rabbitmq 集群节点 ip) 和 volumes(使用自定义的配置文件
)
2.yaml文件同级目录下面创建haproxy 配置文件haproxy.cfg:
globallog 127.0.0.1 local0 infomaxconn 4096defaultslog globalmode tcpoption tcplogretries 3option redispatchmaxconn 2000timeout connect 5stimeout client 120stimeout server 120s# ssl for rabbitmq
# frontend ssl_rabbitmq# bind *:5673 ssl crt /root/rmqha_proxy/rmqha.pem# mode tcp# default_backend rabbitmq# web 管理界面
listen statsbind *:8100mode httpstats enablestats realm Haproxy\ Statisticsstats uri /stats auth admin:admin123
# 配置负载均衡
listen rabbitmqbind *:5670mode tcpbalance roundrobinserver rabbitmq1 rabbitmq1:5672 check inter 5s rise 2 fall 3server rabbitmq2 rabbitmq2:5672 check inter 5s rise 2 fall 3server 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 existanceinterval 5 # check every 2 secondsweight -2 # if check failed, priority will minus 2
}
vrrp_instance VI_1 {# 主机: MASTER# 备机: BACKUPstate 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 monitorchk_haproxy }
}
Backup(81节点)节点配置:
创建配置文件 /etc/keepalived/keepalived.conf:
vrrp_script chk_haproxy {script "killall -0 haproxy" # verify haproxy's pid existanceinterval 5 # check every 2 secondsweight -2 # if check failed, priority will minus 2
}
vrrp_instance VI_1 {# 主机: MASTER# 备机: BACKUPstate 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 monitorchk_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.77port: 5672username: testpassword: 123456#虚拟hostvirtual-host: mcst_vhost
如果链接不上,检查一下下面几个地方:

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


RabbitMQ 高可用 集群就搭建好了,想试试的动手操作一下吧,整个流程还是比较快的。
相关文章:
docker-compose+HAProxy+Keepalived搭建高可用 RabbitMQ 集群
基础环境准备 系统环境: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 (这台做haproxyke…...
自动化框架如何搭建?让10年阿里自动化测试老司机帮你搞定!自动化测试脚本怎么写?
一、何为框架?何为自动化测试框架? 无论是日常技术交流,还是在自动化测试实践中,经常会听到一个词叫:框架。之前对“框架”这个词知其然不知其所以然。现在看过一些资料以及加上我自己的一些实践有了我自己的一些看法…...
剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数 难度:easy\color{Green}{easy}easy 题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).…...
CHAPTER 3 磁盘管理
磁盘管理1 磁盘管理1.1 块设备信息(lsblk)1.2 挂载硬盘1.2.1 挂载单个硬盘(mkfs、mount)1.2.2 磁盘分区工具(fdisk)1.2.3 创建分区1.2.4 相关命令1. df2. partprobe3. mkfs1.3 逻辑卷管理器(LVM)1. 涉及概念2. 使用LVM流程1.4 磁盘检测及修复(fsck)1 磁盘…...
MS python学习(7)
Managing Keys - dotenv Managing keys usage of .env module 项目地址:https://github.com/theskumar/python-dotenv Reads the key,value pair from .env and adds them to environment variable. 将key明文(hard code)形式写在script里…...
工业物联网“杀手级”应用—预测性维护
一、预测性维护的必要性 随着新一轮科技革命和产业变革的兴起,工业物联网、大数据、人工智能等技术正与经济社会各领域加速渗透融合。由于市场竞争对精细化成本管控的要求,设备的重要性越来越凸显,设备的维护对策也必然从响应式维护…...
Java代码弱点与修复之——Explicit null dereferenced(显式空间接引用)
弱点描述 Explicit null dereferenced, 显示空间接引用。是 Coverity 静态代码分析工具检测到的一种中风险缺陷。这种缺陷通常发生在尝试使用空指针引用调用对象上的方法或访问属性时。 Explicit null dereferenced的缺陷可能会导致程序崩溃或产生不可预测的结果。 在Java语…...
一元导数与多元求导数总结
前序:文章结构 1.一元导数 ①一般函数求导 因为太简单的原因,事实上一般函数求导不会单独出现,大多数都是出现在各种特殊的求导过程中。只要掌握16个基本求导公式没问题。 ②复合函数求导(主要链式法则) 这种一般是…...
通过堆栈分析深拷贝、浅拷贝、赋值的差异
前言数据类型分为:基本数据类型String、Number、Boolean、Null、Undefined、Symbol对象数据类型Object、Array基本数据类型的特点:直接存储在栈(stack)中的数据引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内…...
网络割接概述
网络割接概述割接背景企业网络的变化割接概述割接难点割接的操作流程情景模拟及解决方案常见的割接场景割接背景 随着企业业务的不断发展,企业网络为了适应业务的需求不断的改造和优化。无论是硬件的扩容、软件的升级、配置的变更,凡是影响现网运行业务…...
开放开源开先河(下)
目录 1.唯一性定义品牌 2.打造爆款塑造品牌 3.生态系统传播品牌 打造爆款塑造品牌 目前全球100多个开源基金会大部分都在美国,已成功孵化了800多个项目。而开放原子开源基金会现有136家捐赠单位,2020年9月,百度将区块链项目超级链࿰…...
maven的学习
为啥要用maven 1、不用认为添加jar包所依赖的其他jar包 2、能在本地仓库只保留一份jar包,避免了多个工程使用相同jar包,需要重复导入的问题,减少冗余 3、能够规范添加jar包,在下载需要的jar包时有多种方法,但是不能保…...
从前端到后端全面解析文件上传
从前端到后端全面解析文件上传1.前端准备(vueelement-ui)2.后端准备(SpringBootminiomysql)2.1解决跨域2.2配置minio与mysql2.3controller层2.4service层1.前端准备(vueelement-ui) <!DOCTYPE html> <html lang"en"> <head><meta charset"…...
全网火爆,软件测试面试题大全,接口测试题+回答 (18k+的offer)
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 面试测试工程师的时…...
【iOS】—— 浅看block源码
block 文章目录block如何通过终端clang生成源码cpp文件block实质截获自动变量全局变量和静态变量的截获__block说明符iOS开发“强弱共舞”——weak和strong配套使用解决block循环引用问题如何通过终端clang生成源码cpp文件 之前在学习block中学习的比较浅,只看了oc…...
I.MX6ULL_Linux_系统篇(23) busybox文件系统构建
Linux“三巨头”已经完成了 2 个了,就剩最后一个 rootfs(根文件系统)了,本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是 Linux 移植的最后一步,根文件系统构建好以后就意味着我们已经拥有了一个完整的、可以运行的最小系…...
shpjs将.zip文件转成geoJson
一、npm install shpjs二、import shp from shpjs三、async setLayerSource() {const geoJsonData await shp(dataUrl)}一直报错:是因为Buffer这个插件一直没找到Uncaught Error: nodebuffer is not supported by this browser解决办法npm install node-polyfill-w…...
eBay是不是一定要养号?是的
相信每个运营过eBay的用户遇到过这个棘手的问题,eBay个人账户的刊登数量是有限的,尤其是新账户只有5个sku,所以一开始的运营会比较艰难。想要快点走上正轨的话,就一定要去注重这个“养号”。eBay运营模式 1.拍卖 eBay最开始是一个…...
宝塔(二):升级JDK版本
目录 背景 一、下载JDK17 二、配置环境变量 三、配置新的JDK路径 背景 宝塔的软件商店只有JDK8,不满足我当前项目所需的JDK版本,因此想对JDK版本进行升级,升级为JDK17。 一、下载JDK17 先进入 /usr/lib/jvm 目录 点击终端,进…...
【LeetCode】螺旋矩阵 [M](数组)
54. 螺旋矩阵 - 力扣(LeetCode) 一、题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
