Docker中搭建RabbitMQ集群

news2024/11/20 20:17:57

Docker中搭建RabbitMQ集群

    • 1、启动三个RabbitMQ容器
    • 2、为容器设置节点
      • 2.1、设置Erlang Cookie
      • 2.2、设置节点1
      • 2.3、设置节点2
      • 2.4、设置节点3
      • 2.5、预览结果
    • 3、配置镜像队列
      • 3.1、配置镜像的原因
      • 3.2、搭建步骤


1、启动三个RabbitMQ容器

服务器IP端口hostname管理界面地址
192.168.13.1005673rabbitmq-node1192.168.13.100:15673
192.168.13.1005674rabbitmq-node2192.168.13.100:15674
192.168.13.1005675rabbitmq-node3192.168.13.100:15675
  1. 新版本已经不建议通过环境变量设置 Erlang Cookie 了,建议在 home 目录下新建 .erlang.cookie 文件,在 每个节点的 .erlang.cookie 写入一致的字符串,注意 .erlang.cookie 文件的权限应该为 400。

  2. 所以为了便于修改ErlangCookie,启动容器时要做好容器数据卷的映射。

  3. 因为/var/lib/rabbitmq 是 RabbitMQ home 目录和 data 目录,所以需要映射到宿主机

启动第一个容器:


docker run -d --hostname rabbitmq-node1 --name rabbitmq-node1 -p15673:15672 -p5673:5672 --privileged=true -v /app/RabbitMQ/rabbitmq-node1:/var/lib/rabbitmq rabbitmq:latest

启动第二个容器:


docker run -d --hostname rabbitmq-node2 --name rabbitmq-node2 -p15674:15672 -p5674:5672 --link rabbitmq-node1:rabbitmq-node1 --privileged=true -v /app/RabbitMQ/rabbitmq-node2:/var/lib/rabbitmq rabbitmq:latest

启动第三个容器:


docker run -d --hostname rabbitmq-node3 --name rabbitmq-node3 -p15675:15672 -p5675:5672 --link rabbitmq-node1:rabbitmq-node1 --link rabbitmq-node2:rabbitmq-node2 --privileged=true -v /app/RabbitMQ/rabbitmq-node3:/var/lib/rabbitmq rabbitmq:latest

启动完成之后,使用 docker ps命令查看RabbitMQ是否启动成功

在这里插入图片描述

RabbitMQ容器启动成功后,我们需要在容器中开启Web端的管理插件,具体启动教程在我的《docker中安装并启动rabbitMQ》中有详细的步骤,这里不再赘述。

2、为容器设置节点

2.1、设置Erlang Cookie

因为Erlang节点间通过认证Erlang cookie的方式来允许互相通信,所以RABBITMQ_ERLANG_COOKIE必须设置为同一个值。

RabbitMQ容器映射在宿主机上的文件:

在这里插入图片描述

首先进入宿主机的 /app/RabbitMQ/rabbitmq-node1(这里是rabbitmq-node1容器映射到宿主机的目录)目录下,使用 vim 命令打开 .erlang.cookie 文件,将Cookie值复制到另外两个容器的 .erlang.cookie 文件中。

在这里插入图片描述

在这里插入图片描述

复制完成后重新启动 rabbitmq-node1rabbitmq-node2 容器,确保宿主机中修改后的 erlang cookie 的值能够被映射到这两个容器中。

2.2、设置节点1

docker exec -it rabbitmq-node1 bash
rabbitmqctl stop_app
# (rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务)
rabbitmqctl reset
rabbitmqctl start_app(只启动应用服务)
exit

2.3、设置节点2

docker exec -it rabbitmq-node2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app(只启动应用服务)
exit

2.4、设置节点3

docker exec -it rabbitmq-node3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app(只启动应用服务)
exit

2.5、预览结果

节点设置完成之后,在浏览器访问192.168.13.100:15673、192.168.13.100:15674和192.168.13.100:15675中任意一个来查看RabbitMQ Management:

在这里插入图片描述
至此,RabbitMQ集群搭建完毕。

3、配置镜像队列

3.1、配置镜像的原因

如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并 且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但 是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一 个短暂却会产生问题的时间窗。通过 publisherconfirm(发布确认) 机制能够确保客户端知道哪些消息己经存入磁盘,尽 管如此,一般不希望遇到因单点故障导致的服务不可用。

引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中 的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。

3.2、搭建步骤

  1. 启动三台集群节点

  2. 随便找一个节点添加 policy(策略)

在这里插入图片描述

说明:

  • Name:新建的策略的名字(按照自己的需求进行设置即可)
  • Pattern:会按照设置的规则进行镜像设置(例如本例中设置为 ^mirror,则会为开头是 mirror 的队列进行镜像备份)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wtcyV529-1687606030431)(RabbitMQ.assets/image-20230624165903183.png)]

  1. 在 rabbitmq-node1 上创建一个队列发送一条消息,队列存在镜像队列

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwCTEr0w-1687606030432)(RabbitMQ.assets/image-20230624170028904.png)]

  2. 停掉 rabbitmq-node1 之后发现 rabbitmq-node2 成为镜像队列

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKSog5vt-1687606030432)(RabbitMQ.assets/image-20230624191815607.png)]

  3. 就算整个集群只剩下一台机器了 依然能消费队列里面的消息 说明队列里面的消息被镜像队列传递到相应机器里面

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IoC容器的设计(利用反射、注解和工厂模式实现)

1.实验要求 利用注解、反射和工厂模式设计一个简单的IoC容器该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解: 注解含义Component标注BeanAutowired标注需要被注入的对…

如何写好一份企业直播主题策划?

写一份好的直播主题策划,需要考虑包括目标受众、目的、内容、形式、互动等,下面是写企业直播主题策划的一些关注点,希望能帮到您。 定位您直播的目标受众 明确你的直播主题适合的目标受众是谁,他们的兴趣、需求和期望是什么。了解…

OAuth2,jwt,springsecurity之间的区别和联系

OAuth 2.0、JWT (JSON Web Token) 和 Spring Security 是安全相关的概念和技术,它们有着不同的功能和用途。 OAuth 2.0(开放授权): OAuth 2.0 是一种授权框架,用于授权第三方应用程序访问用户资源,而无需共…

【OpenCV DNN】Flask 视频监控目标检测教程 10

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 10 3.10 OpenCV DNNFlask实时监控目标检测1、加载MobileNet SSD模型2、导入分类名称文件3、处理视频帧进行目标检测4、新建一个Flask项目5、Python 程序文件6、视频流的网…

linux系统addr ip以及ifconfig查询不到ip地址解决方法,没有ens33

先看使用情况 网上一堆垃圾博文解决方案都是你抄我我抄你,一点用没有,都说使用 vi /etc/sysconfig/network-scripts/ifcfg-ens33 来更改配置ONBOOT为yes,改个屁,给你们看看我目前的配置,劳资本身就是yes,还…

Elasticsearch 基本使用(二)简单查询 嵌套查询

查询数据 简单查询按id查询单条记录查询所有数据设置排序filter 过滤查询数组内的值查询 嵌套查询查询一个外层字段 内的嵌套字段查询多个字段,其中有嵌套字段 简单查询 按id查询单条记录 GET bank/_doc/1查询所有数据 默认只查询10条记录 GET bank/_search {&q…

Linux任务调度、磁盘分区、挂载

一、任务调度介绍 任务调度是指系统在某个时间执行的特定的命令或程序 任务调度分为两类: 1.系统工作:有些重要的工作必须周而复始的执行,比如病毒扫描 2,个别用户工作:个别用户可能希望执行某些程序,比如…

canvas自定义绘制顺序解决遮挡问题

canvas自定义绘制顺序解决遮挡问题 1. 问题场景2. 解决思路3. 实现代码 1. 问题场景 使用canvas绘制进行要素叠加时,往往会出现不是按照先画的在下面,后画的在最上面这样的顺序进行叠加显示。原因就是由于图片大小不同导致绘制或加载的时间不一样&#…

合宙Air724UG Cat.1模块硬件设计指南--LCD专用SPI接口

概述 Air724UG支持一路LCD专用SPI接口,用于驱动SPI LCD屏幕,不能作为通用SPI使用 特性: 最大支持320240分辨率,30帧 内置图像处理单元GOUDA 支持格式: YUV4 : 2 : 0 ;YUV4 : 2 : 2;RGB565; ARGB8888 目前只支持4线8bi…

MySQL - 第8节 - MySQL复合查询

1.基本查询回顾 准备测试表: • 下面给出三张表,分别是员工表(emp)、部门表(dept)和工资等级表(salgrade)。 • 后续所要进行的查询操作都将以这三张表作为数据源,包括基…

【论文笔记】BEIT:BERT PRE-TRAINING OF IMAGE TRANSFORMERS

GitHub 1.介绍 1.1 挑战 视觉转换器的输入单元,即图像补丁,没有预先存在的词汇。预测遮罩面片的原始像素往往会在预训练短程依赖性和高频细节上浪费建模能力 1.2 回顾一下Bert的基本架构和流程 输入编码:通过tokenizer将输入的文本中的每…

gmpy2

简介 gmpy2是一个Python扩展模块,是对GMP的封装,它的前身是gmpy。 GMP(即GNU高精度算术运算库),它是一个开源的高精度运算库,其中不但有普通的整数、实数、浮点数的高精度运算,还有随机数生成&a…

【promptulate专栏】使用ChatGPT和XMind快速构建思维导图

本文节选自笔者博客:https://www.blog.zeeland.cn/archives/ao302950h3j 💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客&#…

Go语言基础:标识符、关键字、变量、常量、iota

一、标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。 二、关键字 关键字是指编程语言中预先定义好的具有特殊含义的标识符…

ThreadPoolExecutor的应用和源码分析

前面描述的线程池的创建方式大都是Executors类中创建出来,基于ThreadPoolExecutor去new出来实现的。 我们为什么要自定义线程池 在线程池ThreadPoolExecutor中提供了7个参数,都作为非常核心的属性,在线程池去执行任务的时候,每个…

【Docker】容器化和虚拟化基础

Docker发展史 Jail(监狱)时代 1979 年 贝尔实验室发明 chroot chroot的设计原理是:把一个进程的文件系统隔离起来。 ​ chroot 系统调用可以将进程及其子进程的根目录更改为文件系统中的新位置。隔离以后,该进程无法访问到外面的文件,因此这…

管理类联考——逻辑——知识篇——论证推理——二、加强——haimian

考点分析 加强 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量213325356 主要问法 以下哪项如果为真,最能加强上述结论的说服力?以下哪项如果为真,最能支持题干的论证? 解题思路 阅读问题,确定是否为加强题型&…

进程参数编程

问题 execve(...) 的参数分别是什么?有什么意义? 第一个参数是程序路径,第二个参数是进程参数,第三个参数是环境变量 再论 execve(...) main 函数 (默认进程入口) int main(int argc, char* argv[]) argc - 命令行参数个数argv…

java——jdbc编程

文章目录 JDBC的概念JDBC的常用APIJDBC示例代码PreparedStatementCallableStatement JDBC(Java Database Connectivity)是Java的一种数据库访问标准,它提供了一套API,使得我们可以通过Java程序来访问和操作各种关系型数据库。 下面…

从零开始手搓一个STM32与机智云的小项目——GPIO模拟时序控制外设2

文章目录 前言模块简介硬件介绍硬件连接通信时序DHT11的数据帧格式信号时序1. 起始信号2.应答信号(响应信号)3.接收数据0与14.获取数据5结束信号 输入输出切换实际效果 总结 前言 在上一篇中介绍了,使用GPIO模拟WS2812B的控制时序来实现对RGB灯的控制,本…