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

cpdown:精准下载Git仓库文件,告别克隆整个项目的低效操作

1. 项目概述与核心价值最近在整理本地开发环境&#xff0c;发现一个高频痛点&#xff1a;从各种代码托管平台&#xff08;比如 GitHub、GitLab、Gitee&#xff09;下载单个文件或特定目录时&#xff0c;总是特别麻烦。要么得克隆整个仓库&#xff0c;动辄几百兆&#xff0c;浪费…...

BurstGPT:大语言模型驱动高性能计算,实现自然语言科学仿真

1. 项目概述&#xff1a;当大语言模型遇上高性能计算最近在AI和HPC&#xff08;高性能计算&#xff09;的交叉领域&#xff0c;一个名为BurstGPT的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会觉得有点“缝合怪”的味道——Burst通常指代计算资源的突发式使用或高性…...

FPGA新手避坑指南:用SPWM驱动电机时,你的死区时间加对了吗?

FPGA电机驱动实战&#xff1a;SPWM死区时间设计的核心要点与避坑策略 在数字电源和电机控制领域&#xff0c;FPGA因其并行处理能力和精确时序控制而备受青睐。许多工程师在成功实现SPWM信号生成后&#xff0c;往往忽略了驱动电路中最致命的一环——死区时间设置。我曾亲眼见证过…...

NLP基石:从n-gram到现代语言模型的演进之路

1. 语言模型的起源与核心思想 语言模型这个概念最早可以追溯到上世纪中叶的信息论研究。当时科学家们试图用数学方法描述人类语言的规律性&#xff0c;于是提出了"用概率衡量句子合理性"的基本思路。想象一下&#xff0c;当你听到"今天天气真好"和"天…...

Bebas Neue 开源字体技术解析:几何美学与多平台兼容性实现

Bebas Neue 开源字体技术解析&#xff1a;几何美学与多平台兼容性实现 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue 是一款基于 SIL Open Font License 1.1 许可证的开源显示字体&#xff0c;专为标…...

网易技术岗校招通关秘籍:从需求画像到Offer收割(实战篇)

1. 网易技术岗校招需求画像解析 第一次参加大厂校招的同学&#xff0c;往往会被各种岗位JD绕晕。去年我带过一个浙大的学弟&#xff0c;他同时投了网易的Java和后端开发岗&#xff0c;结果发现笔试题目完全不同。后来才知道&#xff0c;网易不同业务线对"后端开发"的…...

WpfDesigner终极指南:5分钟掌握WPF可视化设计工具,告别手写XAML代码

WpfDesigner终极指南&#xff1a;5分钟掌握WPF可视化设计工具&#xff0c;告别手写XAML代码 【免费下载链接】WpfDesigner The WPF Designer from SharpDevelop 项目地址: https://gitcode.com/gh_mirrors/wp/WpfDesigner 还在为复杂的WPF界面设计而烦恼吗&#xff1f;W…...

从入门到精通:泉盛UV-K5/K6开源固件的无线通信革命

从入门到精通&#xff1a;泉盛UV-K5/K6开源固件的无线通信革命 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 想象一下&#xff0c;你手中的百元…...

构建企业级日志监控:免费Syslog服务器部署方案

构建企业级日志监控&#xff1a;免费Syslog服务器部署方案 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog 在分布式系统架构中&#xff0c;网络设备、服务器和应…...

群晖相册AI识别深度解析:无GPU设备开启人脸识别的技术方案

群晖相册AI识别深度解析&#xff1a;无GPU设备开启人脸识别的技术方案 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch Synology Photos Face Patch 是…...