使用Docker搭建RabbitMQ集群并用HAProxy实现负载均衡

文章目录

        • 1、Docker安装
        • 2、RabbitMQ集群搭建
          • 2.1、RabbitMQ集群基础知识
            • 2.1.1、集群中的节点
            • 2.1.2、集群模式
          • 2.2、创建RabbitMQ容器
          • 2.3、将节点添加到集群中
          • 2.4、建置镜像模式集群
          • 2.5、其他说明
        • 3、HAProxy实现负载均衡

1、Docker安装

Docker安装过程,这里使用的是Docker Desktop,直接在官网下载完以后安装就好;具体的过程就不介绍了,与安装其他软件差不太多。

2、RabbitMQ集群搭建

2.1、RabbitMQ集群基础知识
2.1.1、集群中的节点

Rabbit MQ集群中的节点分为内存节点(RAM)磁盘节点(disk,消息持久化),每一个集群中都至少有一个磁盘节点;

2.1.2、集群模式

RabbitMQ的集群有两种模式:普通模式(默认)镜像模式

普通模式
集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点,对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。

适合于消息无需持久化的场景,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。
缺点:无法解决单点故障问题。

镜像模式
与普通模式不同之处时消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;镜像集群模式可以保证集群只要不全部宕机,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。

2.2、创建RabbitMQ容器

Docker Desktop安装完以后,就可以在PowerShell中执行Docker脚本了,这里创建三个RabbitMQ的节点,使用Docker来拉取镜像,创建容器的过程如下:

# RabbitMQ01
docker run --name rabbitmq01 --hostname rabbitmq01 -v rabbimq01:/var/lib/rabbitmq  -d  -p 15672:15672 -p 5672:5672  -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
# RabbitMQ02
docker run --name rabbitmq02 --hostname rabbitmq02 -v rabbimq02:/var/lib/rabbitmq -d  -p 15673:15672 -p 5673:5672 --link rabbitmq01:rabbitmq01  -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
# RabbitMQ03
docker run --name rabbitmq03 --hostname rabbitmq03 -v rabbimq03:/var/lib/rabbitmq -d  -p 15674:15672 -p 5674:5672 --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02  -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management

Note:

a、创建时要注意使用--hostname来创建主机名称;
b、RABBITMQ_ERLANG_COOKIE 起到节点认证的作用,且集群内所有节点的值必须相同,集群部署时需要同步该值;
c、--link(docker容器间互联的方法):单方向的互联,先启动的容器只能用IP地址连接后启动的容器,后启动的容器可通过IP地址、容器名、别名进行连接。

完成以上的内容以后三个RabbitMQ的节点就算时创建完成了。

2.3、将节点添加到集群中

将节点添加到集群的命令如下:

	#进入rabbitmq01容器,重新初始化一下,如果是新安装则reset可以忽略重置。
	docker exec -it rabbitmq01 bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	rabbitmqctl start_app
	exit

	#进入rabbitmq02容器,重新初始化一下,将02节点加入到集群中
	docker exec -it rabbitmq02 bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。  rabbit@rabbitmq01 为设置的主节点rabbitmq01
	rabbitmqctl start_app
	exit

	#进入rabbitmq03容器,重新初始化一下,将03节点加入到集群中
	docker exec -it rabbitmq03 bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01
	rabbitmqctl start_app
	exit

完成以上步骤以后,一个普通模式的集群就已经搭建完成了。

2.4、建置镜像模式集群

接下来将集群变更为镜像模式,使用的命令如下:

#随便进入一个容器
docker exec -it rabbitmq01 bash
#设置策略匹配所有名称是amp开头的队列都存储在2个节点上的命令如下
rabbitmqctl set_policy -p / ha "^amp*" '{"ha-mode":"exactly","ha-params":2}'
#或者
#设置策略匹配所有名称的队列都进行高可用配置
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
#查询策略
rabbitmqctl list_policies -p / #查看vhost下的所有的策略(policies )

# 使用set policy 命令设置镜像队列策略:
rabbitmqctl set_policy -p [virtualhost] [Name] [Pattern] [Definition]  [Priority]
# virtualhost: 虚拟机名称
# Name:策略名称
# Pattern:正则表达式
# Definition:策略定义
# Priority:优先级

至此,集群的镜像模式也搭建完成。
这时访问http://localhost:15673以后就可以显示如下的画面,所有的节点信息都会显示
在这里插入图片描述

2.5、其他说明

以上的操作完成了RabbitMQ集群的搭建,但是在SpringBoot中对于集群的访问时,是按照配置的顺序执行的,只有第一个建立连接的节点挂掉以后才会去与第二个建立连接。如果要实现节点之间的负载均衡,就需要用到下面提到的代理工具HAProxy。

3、HAProxy实现负载均衡

建置HAProxy的过程如下,首先进行HAProxy配置文档的配置:

#logging options
global
	log 127.0.0.1 local0 info
	maxconn 5120
	chroot /usr/local/etc/haproxy
	uid 99
	gid 99
	daemon
	pidfile /var/run/haproxy.pid

defaults
	log global
	#使用4层代理模式,”mode http”为7层代理模式
	mode tcp
	#if you set mode to tcp,then you nust change tcplog into httplog
	option tcplog
	option dontlognull
	retries 3
	maxconn 2000
	timeout connect 5s
    #客户端空闲超时时间为 60秒 则HA 发起重连机制
    timeout client 60s
    #服务器端链接超时时间为 15秒 则HA 发起重连机制
    timeout server 15s
	#front-end IP for consumers and producters

listen rabbitmq_cluster
	bind 0.0.0.0:5679
	#配置TCP模式
	mode tcp
	#简单的轮询
	balance roundrobin
	#rabbitmq集群节点配置 
	#inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
	# 192.168.1.19 是主机的地址
    server rabbitmq02 192.168.1.19:5673 check inter 5000 rise 2 fall 2
    server rabbitmq03 192.168.1.19:5674 check inter 5000 rise 2 fall 2
	server rabbitmq01 192.168.1.19:5675 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
	bind 0.0.0.0:8100
	mode http
	option httplog
	stats enable
	#设置haproxy监控地址为http://127.0.0.1:8100/rabbitmq-stats
	stats uri /rabbitmq-stats
	stats refresh 5s
	stats auth admin:123456

关于HAProxy配置相关的更多内容可以参考:HAproxy的配置详解

建置HAProxy容器:

docker run -d --name haproxy8100 -p 5679:5679 -p 8100:8100 -v d:/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg  haproxy:1.9.6

然后在浏览器中输入http://localhost:8100/rabbitmq-stats 访问,画面如下:
在这里插入图片描述
这样就可以看到配置的三个节点以及当前的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/9278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue开发常用的工具有哪些?

相比其他大型框架,Vue更加灵活,开发者既可以选择使用Vue来开发一个全新项目,也可以将Vue引入到一个现有的项目中。代码简洁、上手容易,深受开发者青睐。本节我们将对Vue的开发环境以及常用工具的使用进行讲解。 1.Visual Studio …

Fabric 超级账本学习【9】基于Go语言自己手动实现简单区块链

文章目录项目结构block.goblockchain.goserver.go 封装接口供简单调用向区块链中区块写入数据读取区块链中的区块数据项目结构 block.go package coreimport ("crypto/sha256""encoding/hex""time" )type Block struct {Index int64 /…

基于html+css的盒子内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

数学分析:多元微积分1

卓里奇的数学分析的好处在于直接从多元函数来入手多元微积分,引出矩阵,十分自然。 紧集的概念,感觉直接用闭集去理解就行,(对于图形学来说)。 多元函数的极限,其实和单元函数并没有什么区别。 这…

chatGPT所在地区不支持怎么解决-需要下载ChatGPT吗

ChatGPT国内能下载吗 ChatGPT是基于云端的人工智能交互服务,无需下载即可使用。因此,您不需要在国内下载ChatGPT,只需要在网络环境联通的情况下,通过浏览器访问ChatGPT官网或合作伙伴提供的ChatGPT服务即可使用。当然&#xff0c…

自学大数据第14天NoSQL~MongoDB及其命令

这几天主要是看了一下mongodb的一些知识,网上也有一些教程,今天主要是复习一下mongodb 启动mongodb 在连接mongodb前首先要创建数据存放目录与日志存放目录,还得保证当前用户对这两个目录有相应的读写操作 mongod --dbpath/usr/local/mongodb/data/db/ --logpath/usr/lcoal/mon…

Web 攻防之业务安全:Response状态值修改测试(修改验证码返回值为 true)

Web 攻防之业务安全:Response状态值修改测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台(操作系统、数据库,中间件等)、业务系统自身(软件或设备)、业务…

蓝桥杯基础12:BASIC-3试题 字母图形

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDC…

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala 前言 【本文适合有一定计算机基础/半年工作经验的读者食用。立个Flg,愿天下不再有肤浅的SQL Boy】 谈到大数据开发,占据绝大多数人口的就是SQL Boy,不接受反驳,毕竟大…

2023年PMP报考时间安排攻略!

1.2023年PMP考试时间 PMP一年开考4次,分别为3月、6月、9月、12月,预计2023年PMP第一次考试时间在2023年3月左右,具体以基金会官方通知为准。 1)为什么考PMP? 大部分人考 PMP 无非以下几个原因,总的来说&…

ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介

目录 1, Introduction to Arm Compiler 6 1.1 armclang 1.2 armasm 1.3 armlink 1.4 armar 1.5 fromelf 1.6 Arm C libraries 1.7 Arm C libraries 1,8 Application development ,ARM程序开发流程 2,ARM 编译器 5和ARM 编译器 6的兼容性 3&…

Python 虚拟环境迁移到其他电脑

一、背景介绍 在 Python 项目开发过程中,根据不同的项目场景,需要切换不同的 Python 版本。 因此,我们经常会对不同的项目,创建特定的 Python 虚拟环境,实现项目环境间的“物理隔离”。 本地创建 Python 虚拟环境&…

2023最新8个电脑必装软件,新电脑装完好用又高效

新买的笔记本电脑到手了,需要安装什么软件?不会真的有人这样问吧,万一真的有人不知道需要安装什么软件呢?好吧,提醒一下各位,新电脑不要乱安装软件啊,不然电脑很容易中病毒的。根据我多次换电脑…

AttributeError: module ‘torch‘ has no attribute ‘compile‘

ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device pytorch包的版本太低,需要大于2.0 升级 pip install --upgrade torch升级报错 空间不够no space left on device 查看磁盘空间: du -h --max-de…

HTML5 <head> 标签、HTML5 <i> 标签

HTML5 <head> 标签 实例 HTML5 <head> 标签表示文档的头部&#xff0c;其中包含了与该文档有关的信息&#xff01; 一份在头部带有 <title> 标签的 HTML 文档&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8&…

数据结构之线性表3

我们的目标&#xff1a; 1、了解线性结构的特点 掌握顺序表的定义、查找、插入和删除。 2、掌握链表的定义、创建、查找、插入和删除。 3、能够从时间和空间复杂度的角度比较两种存储结构的不同特点及其适用场合。&#xff08;持续更新&#xff09; 前言 本章节内容主要介绍…

【中级软件设计师】—操作系统考点总结篇(二)

【中级软件设计师】—操作系统考点总结篇&#xff08;二&#xff09; 1.操作系统概述 1.1操作系统的功能 1.2 特殊的操作系统 1.3 进程的概念和状态 进程与程序的区别&#xff1a; 进程是程序的一次执行过程&#xff0c;没有程序就没有进程 程序是一个静态的概念&#xff0c;…

蓝桥杯嵌入式第十二届初赛题目解析

把蓝桥杯嵌入式第十二届的题目写完了&#xff0c;拿出来和大家一起分享。 目录 客观题 程序设计题 题目解析&#xff1a; CubeMX配置 代码演示 客观题 收集的一些历年的比赛客观题和解析&#xff0c;以及程序设计题的PDF&#xff0c;在这里分享给大家。 链接&#xff…

SHELL函数可课后作业

一、题目 1、编写函数&#xff0c;实现打印绿色OK和红色FAILED 判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数&#xff0c;返回最…

使用Schrödinger Python API系列教程 -- 介绍 (一)

使用Schrdinger Python API系列教程 – 介绍 (一) 本文档可从Schrdinger网站www.schrodinger.com/pythonapi访问。 从Python文档字符串生成的完整API文档可以在这里访问 介绍 在最高级别上&#xff0c;Schrdinger Python API提供了一个基本的分子结构类&#xff0c;并允许与…
最新文章