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

实验二:动态规划
1.双11的红包雨 问题描述 双11到了,据说这2天会下红包雨,每个红包有不同的价值,小k好开心,但有个规则,就只能接掉落在他身旁的10米范围内的红包(0-10这11个位置)。小k想尽可能的多抢红包&…...

华为机试 HJ27 查找兄弟单词
题目链接:https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68?tpId37&tqId21250&rp1&ru/exam/oj/ta&qru/exam/oj/ta&sourceUrl%2Fexam%2Foj%2Fta%3Fdifficulty%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26t…...

佩戴舒适的蓝牙耳机有哪些?佩戴舒适的蓝牙耳机推荐
音乐对许多人而言,都是一种抚慰生命的力量,特别是在上下班的时候,在熙熙攘攘的人流中,戴着耳机听一首动听的曲子,无疑会让人心情变得更加舒畅,要想获得出色的音乐体验,没有一副出色的耳机可不行…...

ESXI主机安装Zabbix 6.2
1:首先下载Zabbix Appliance 2:还需要下载VMware converter ,这个需要VMware的账号,或者从其他地方下载也可以。 3:vmdk格式的 image 可直接在 VMware Player、 Server 和 Workstation 产品中使用。要在 ESX,、ESXi 和 vSphere 中…...

【Linux 网络编程1】使用UDP/TCP编写套接字,多进程/多线程版本的TCP编写的套接字,将套接字封装
目录 1.学习网络编程前的一些基础知识 2.UDP(user datagram protocol)协议的特点 3.使用有UPD编写套接字 4.使用TCP编写套接字 4.2.TCP客服端 4.3.TCP服务器端 4.4.单进程版本(没有人会使用) 4.5.多进程版本 4.6.多线程版本 5.把套接字封装 1…...

滑动窗口求最大和最小
滑动窗口 要区分最小和最大滑窗,内层while循环的条件和更新结果的地方 核心: 关键的区别在于,最大滑窗是在迭代右移右边界的过程中更新结果,而最小滑窗是在迭代右移左边界的过程中更新结果。 最小滑窗 给定数组 nums࿰…...

跟ChatGPT学量化,菜鸟炒股也不怕
你是一个python资深量化开发工程师,请介绍量化交易的基本框架 量化交易的基本框架包括以下几个步骤: 数据获取:获取市场数据和公司财务数据等,可以使用API接口、爬虫等方式获取。数据清洗和预处理:对获取到的数据进行清…...

扬帆优配|2600亿新能源巨头狂飙!外资唱多中国:再涨15%
全国停摆的危机,正在迫临法国。 大停工正在将法国推向风险境地。法国政府估计,当地时间3月7日,将迸发全国大型停工游行。法国总工会宣告,到时将让全法国停摆。法国担任交通业务的部长级代表克莱蒙博讷正告称,7日将成为…...

ChatGPT技术与商业模式及产业发展布局方案
文章目录模块一:概念模块二:架构模块三:技术模块四:算力模块五:体验模块六:应用模块七:商业模块八:产业模块九:建议结语主要内容: 采用模块化教学方法&#x…...

CIMCAI port ai shipping ai artificial intelligence smart port
上海人工智能独角兽中集集团高科技中集飞瞳,是全球应用落地最广,规模最大,最先进的的港航人工智能高科技企业,工业级成熟港航人工智能产品全球规模化落地应用,全球前三大船公司及港口码头应用落地。上海人工智能独角兽…...