当前位置: 首页 > 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,…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...