当前位置: 首页 > news >正文

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里…...

工业物联网“杀手级”应用—预测性维护

一、预测性维护的必要性 随着新一轮科技革命和产业变革的兴起,工业物联网、大数据、人工智能等技术正与经济社会各领域加速渗透融合。由于市场竞争对精细化成本管控的要求,设备的重要性越来越凸显,设备的维护对策也必然从响应式维护&#xf…...

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月,百度将区块链项目超级链&#xff0…...

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)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 面试测试工程师的时…...

【iOS】—— 浅看block源码

block 文章目录block如何通过终端clang生成源码cpp文件block实质截获自动变量全局变量和静态变量的截获__block说明符iOS开发“强弱共舞”——weak和strong配套使用解决block循环引用问题如何通过终端clang生成源码cpp文件 之前在学习block中学习的比较浅&#xff0c;只看了oc…...

I.MX6ULL_Linux_系统篇(23) busybox文件系统构建

Linux“三巨头”已经完成了 2 个了&#xff0c;就剩最后一个 rootfs(根文件系统)了&#xff0c;本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是 Linux 移植的最后一步&#xff0c;根文件系统构建好以后就意味着我们已经拥有了一个完整的、可以运行的最小系…...

shpjs将.zip文件转成geoJson

一、npm install shpjs二、import shp from shpjs三、async setLayerSource() {const geoJsonData await shp(dataUrl)}一直报错&#xff1a;是因为Buffer这个插件一直没找到Uncaught Error: nodebuffer is not supported by this browser解决办法npm install node-polyfill-w…...

eBay是不是一定要养号?是的

相信每个运营过eBay的用户遇到过这个棘手的问题&#xff0c;eBay个人账户的刊登数量是有限的&#xff0c;尤其是新账户只有5个sku&#xff0c;所以一开始的运营会比较艰难。想要快点走上正轨的话&#xff0c;就一定要去注重这个“养号”。eBay运营模式 1.拍卖 eBay最开始是一个…...

宝塔(二):升级JDK版本

目录 背景 一、下载JDK17 二、配置环境变量 三、配置新的JDK路径 背景 宝塔的软件商店只有JDK8&#xff0c;不满足我当前项目所需的JDK版本&#xff0c;因此想对JDK版本进行升级&#xff0c;升级为JDK17。 一、下载JDK17 先进入 /usr/lib/jvm 目录 点击终端&#xff0c;进…...

【LeetCode】螺旋矩阵 [M](数组)

54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...