容器化运维:构建高可用RabbitMQ集群的Docker Compose指南

news2024/11/16 6:21:40

容器化运维:构建高可用RabbitMQ集群的Docker Compose指南

  • 前言
  • RabbitMQ相关知识点
    • ❓:Exchanges中的类型有什么区别
    • ❓:==policies==是什么
    • ❓:策略如何设置
  • docker-compose 搭建RabbitMQ的集群
    • 创建docker-compose.yml文件
    • 创建rabbitmq.conf文件
  • 项目中如何实现集群连接

前言

在计算机世界中,消息传递就像是一场神奇的旅行,消息在系统之间飞来飞去,就像是魔法传送一样。而今天,我们将进入一个充满奇幻冒险的领域——RabbitMQ集群的实现。

想象一下,RabbitMQ就是我们的信使兔子,它们不仅聪明灵活,还能够把消息从一个地方快速传递到另一个地方。而RabbitMQ集群就像是一支强大的兔子家族,它们紧密合作,确保消息永远不会丢失,就像是一场兔子魔法秀。

在这个奇幻的旅程中,我们将揭开RabbitMQ集群的面纱,一起探索如何构建一个强大的消息传递系统,它能够应对高负载、容错性强,就像是一支无所不能的魔法军团。

所以,准备好跟随我们的兔子朋友,踏上这段有趣而充满挑战的消息传递冒险吧!在这个奇妙的世界里,你将发现消息传递的魔法是无穷无尽的。

对于RabbitMQ可以先进行几个知识点的讲解

RabbitMQ相关知识点

❓:Exchanges中的类型有什么区别

  1. Direct Exchange(直连交换器):

    • 根据消息的 routing key(路由键)将消息发送到与之完全匹配的队列。
    • 只有当消息的路由键与绑定到交换器的队列的路由键完全匹配时,消息会被发送到该队列。
    • 适用于需要精确匹配路由键的情况。
  2. Topic Exchange(主题交换器):

    • 使用通配符匹配消息的路由键与绑定的队列。
    • 可以使用通配符 “*”(匹配一个单词)和 “#”(匹配多个单词)来定义路由键的模式。
    • 适用于需要灵活匹配路由键的情况,支持复杂的消息路由。
  3. Fanout Exchange(扇出交换器):

    • 将接收到的消息广播到绑定的所有队列,忽略消息的路由键。
    • 所有绑定到交换器的队列都会接收相同的消息副本。
    • 适用于需要消息广播到所有队列的情况。
  4. Headers Exchange(头交换器):

    • 使用消息的头部属性进行匹配,而不是使用路由键。
    • 你可以在消息的头部设置键值对属性,然后通过绑定队列时设置匹配的头部属性。
    • 适用于基于消息头部属性进行路由的情况。

选择合适的交换器类型取决于你的应用架构和消息传递需求。通常情况下,使用直连交换器和主题交换器可以满足大多数场景。如果你需要在多个队列之间广播消息,可以使用扇出交换器。如果需要基于消息头部属性进行匹配,可以使用头交换器。

要注意的是,交换器类型一旦设置后,通常是不可更改的。因此,在选择交换器类型时需要根据实际需求进行权衡和规划。

❓:policies是什么

在 RabbitMQ 中,“policies”(策略)是一种机制,用于自动化管理和配置交换器、队列和绑定的行为。策略允许你在 RabbitMQ 集群中定义一组规则,这些规则会自动应用于交换器、队列和绑定,从而在满足特定条件时执行预定义的操作。这样可以简化管理、提高效率,并确保一致性。
策略可以用于许多方面,包括队列的镜像、过期时间、消息最大长度、死信队列等。通过设置策略,你可以在集群中的多个节点上自动应用相同的配置,而不需要手动进行每个节点的配置更改。

以下是一些策略的常见作用:

  1. 镜像队列策略: 允许你在队列声明时自动将队列设置为镜像队列,从而实现消息冗余备份和高可用性。

  2. 队列过期策略: 允许你设置队列中的消息的过期时间,当消息过期时,RabbitMQ 会自动将其从队列中删除。

  3. 消息最大长度策略: 允许你限制队列中消息的最大长度,当队列中的消息数量达到设置的最大长度时,新的消息将被丢弃或处理为死信。

  4. 死信队列策略: 允许你将队列中无法被消费的消息自动发送到死信队列,以便进一步处理。

  5. 优先级队列策略: 允许你为消息设置优先级,并根据优先级将消息放入不同的队列中。

等等。

要设置策略,你可以使用 RabbitMQ Management 插件的管理界面,也可以使用命令行工具(如 rabbitmqctl)。通过设置策略,你可以实现自动化管理和配置,减少手动操作的需要,提高系统的可靠性和可维护性。

❓:策略如何设置

image.png
参数说明:

  1. Pattern(匹配模式):

    • 这是一个用于匹配交换器、队列和绑定的模式。可以使用通配符 *#
    • 例如,你可以使用 amq.* 匹配所有以 amq. 开头的交换器。
  2. Definition(定义):

    • 这是一个包含策略定义的 JSON 对象。具体的参数和值取决于你想要配置的策略类型。
    • 例如,如果要创建一个镜像队列策略,可以定义 ha-mode 和其他相关参数。
    1. ha-mode(镜像队列模式):

      • 用法:ha-mode = allha-mode = exactlyha-mode = nodes
      • 作用:定义队列是否为镜像队列,从而实现消息冗余备份和高可用性。
      • all:将队列设置为镜像队列,在所有节点上创建队列的镜像。
      • exactly:将队列设置为镜像队列,并指定要创建的镜像节点数量。
      • nodes:将队列设置为镜像队列,指定要在哪些节点上创建镜像。
    2. ha-params(镜像队列参数):

      • 用法:ha-params = ["node1", "node2"]
      • 作用:用于 ha-mode = nodes,指定创建队列镜像的节点列表。
    3. expires(消息过期时间):

      • 用法:expires = 3600000(毫秒)
      • 作用:定义队列中消息的过期时间,过期的消息将被自动删除。
    4. message-ttl(消息存活时间):

      • 用法:message-ttl = 60000(毫秒)
      • 作用:定义消息在队列中的存活时间,超过该时间的消息将被自动删除。
    5. max-length(最大消息数量):

      • 用法:max-length = 1000
      • 作用:限制队列中消息的最大数量,当队列中的消息数量达到指定值时,新的消息将被丢弃或处理为死信。
    6. dead-letter-exchange(死信交换器):

      • 用法:dead-letter-exchange = dlx_exchange
      • 作用:指定死信队列中的消息应该发送到的交换器。
    7. dead-letter-routing-key(死信路由键):

      • 用法:dead-letter-routing-key = dlx_routing_key
      • 作用:指定死信队列中的消息应该使用的路由键。
    8. max-length-bytes(最大消息字节数):

      • 用法:max-length-bytes = 102400
      • 作用:限制队列中消息的总字节数,当队列中消息的总字节数达到指定值时,新的消息将被丢弃或处理为死信。
    9. lazy-mode(延迟模式):

      • 用法:lazy-mode = onlazy-mode = off
      • 作用:启用或禁用延迟模式,用于将队列中的消息保存到磁盘以降低内存使用。
    10. queue-mode(队列模式):

      • 用法:queue-mode = lazyqueue-mode = default
      • 作用:定义队列的工作模式,lazy 表示延迟模式,default 表示默认模式。
  3. Priority(优先级):

    • 用于指定策略的优先级,当有多个策略匹配时,优先级较高的策略会覆盖较低的策略。
    • 优先级通常使用整数表示,值越小表示优先级越高。
  4. Apply to(应用于):

    • 用于指定策略应该应用于哪些对象(交换器、队列、绑定)。
    • 可以选择 “exchanges”、“queues” 或 “all”。

之所以说上面的东西,主要是为了实现我们的集群,也就是我添加的策略,因为如果单独创建队列的话,它是默认只属于当前的节点的,所以需要依靠镜像,或者说这种策略实现

docker-compose 搭建RabbitMQ的集群

创建docker-compose.yml文件

version: '3'
services:
  rabbitmq-node1:
    image: rabbitmq:3.9.22-management
    container_name: rabbitmq-node1
    hostname: rabbitmq-node1
    # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60
    entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node1.pid"
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_DELAYED_MESSAGE_ENABLED=true
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node1  # 节点名称
      # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。
    networks:
      - rabbitmq-network
  rabbitmq-node2:
    image: rabbitmq:3.9.22-management
    container_name: rabbitmq-node2
    hostname: rabbitmq-node2
    entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node2.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1"
    # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60
    ports:
      - "5673:5672"
      - "15673:15672"
    volumes:
      - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_DELAYED_MESSAGE_ENABLED=true
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node2  # 节点名称
      # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。
    networks:
      - rabbitmq-network
    depends_on:
      - rabbitmq-node1
  rabbitmq-node3:
    image: rabbitmq:3.9.22-management
    container_name: rabbitmq-node3
    hostname: rabbitmq-node3
    # command: rabbitmq-server --erlang-cookie=97c78681-3394-208f-9d04-b86cb68f9c60
    entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node3.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1"
    ports:
      - "5674:5672"
      - "15674:15672"
    volumes:
      - ./rabbitmq_delayed_message_exchange-3.9.0.ez:/plugins/rabbitmq_delayed_message_exchange-3.9.0.ez
      - ./.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
      - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    environment:
      - RABBITMQ_DELAYED_MESSAGE_ENABLED=true
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=123456
      - RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange
#被废弃了  - RABBITMQ_ERLANG_COOKIE=97c78681-3394-208f-9d04-b86cb68f9c60 # 为了确保集群节点通信,需要设置相同的 erlang-cookie
      - RABBITMQ_NODENAME=rabbit@rabbitmq-node3  # 节点名称
      # - RABBITMQ_USE_LONGNAME=true #它用于告诉 RabbitMQ 是否使用长节点名称。
    networks:
      - rabbitmq-network
    depends_on:
      - rabbitmq-node1
networks:
  rabbitmq-network:
    driver: bridge

⚠:这里使用的挂载,第一个是实现的延迟队列插件,第二个是挂载所需的cookie,这个cookie可以是任意的,第三个是配置文件

上面部分语句说明如下

  1. entrypoint: /bin/bash -c "rabbitmq-server rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@rabbitmq-node3.pid && rabbitmqctl join_cluster rabbit@rabbitmq-node1":等待并加入集群
  2. RABBITMQ_PLUGINS=--offline rabbitmq_delayed_message_exchange:指定要加载的插件,且加载预先下载好的
  3. RABBITMQ_DELAYED_MESSAGE_ENABLED=true:启动消息延迟功能

创建rabbitmq.conf文件

# 配置内容
# 这个配置的作用是禁用 "guest" 用户对本地(loopback)的访问。
loopback_users.guest = false
listeners.tcp.default = 5672
# 这个配置指定了集群节点之间的发现机制。`rabbit_peer_discovery_classic_config` 表示使用经典配置方式来进行节点发现。
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
# 这个配置指定了集群中的节点,`rabbit@rabbitmq-node1` 表示第一个节点的名称和主机地址。
cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1
cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2
cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3

⚠:上面的文件要处于同级目录

项目中如何实现集群连接

如果是实现集群连接的话,这个在go与java中还是有所不同的,但是我们可以是用nginx来做一下负载均衡来实现,或者说RabbitMQ它也有自己的实现

⚠:nginx模块中需要添加stream模块,才可以实现,和连接mysql是一样的

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

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

相关文章

Docker——认识并安装Docker(上篇)

Docker 一、Docker认识二、Docker功能1、更快速的交付和部署2、更高效的虚拟化3、更轻松的迁移和扩展4、更简单的管理Docker 和 VM 三、学习Docker前的必备知识1、环境配置2、虚拟化部署方式3、虚拟化优点4、虚拟化局限性5、容器与虚拟机的区别6、Docker为什么比VM快&#xff1…

CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程

## CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程 文章目录 ## [CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程](https://my.oschina.net/u/3986411/blog/4714780) 通过如下命令查看mariadb的安装包 rpm -qa | grep mariadb通过如下命令卸载mariad…

ARTS 第一期

Algorithm 本周刷的算法是:57. 插入区间 这道算法对我来说很有意义,为什么? 因为这一道算法让我意识到我之前写的算法都是「混」过来的,理解根本不到位,怎么解决?重复的刷之前写过的重要的算法&#xff0…

ppt 作图 如何生成eps格式

需求 ppt中画的图,按照eps格式导出。 环境 软件: ppt, Gsview(用来将ps格式转成eps), Adobe 操作系统: win11 思路 直接在ppt里选择adobe打印机,将图片以文件形式打印到ps格式的文件中,再由gsview转化成eps。 建议在本身就…

程序员去银行咋样?

Q:秦老师长期在金融比如银行领域。能不能从市场和行业情况给大家做一下分析。30-35岁的程序员如何做选择,加入甲方还是乙方?有哪些考量纬度? A:谢邀,简单讲讲我在银行IT领域工作了十来年的一些经验心得。 …

Windows10电脑环境变量(path)怎么进行列表显示?

Windows10电脑环境变量(path)怎么进行列表显示? 环境变量是一行显示 今天配置环境变量的时候,发现环境变量是一行显示,惊呆了,电脑配置的东西太多,如果修改之前的环境变量,需要一个字…

Prometheus-监控Mysql进阶用法(1)(安装配置)

阿丹: 在开发和生产环境中有可能会出现慢mysql等问题,那么这里就需要我们优秀的程序员来进行监控和解决,那么如何借助云原生的监控系统来完成这个操作呢? 环境描述: 使用一台空白的阿里云服务器2核4G。 服务器基本安装…

uni-app:循环数据点击事件获取每行指定数据(获取参数)

效果 页面样式 点击首行控制台输出信息 代码 :data-id"item.id":定义id信息,在点击事件时e.currentTarget.dataset.id获取点击行的id :data-index"index":定义index信息,在点击事件时e.currentTarget.datase…

Spring实例化源码解析之ClassPathBeanDefinitionScanner(五)

Spring实例化源码解析之ClassPathBeanDefinitionScanner(五) 上一章我们分析了ComponentScanAnnotationParser,主要就是分析了ComponentScan注解内的属性和属性的作用,而注解解析的信息会交给ClassPathBeanDefinitionScanner扫描器使用,也就…

运动控制:步进电机

在机械设计中,我们经常用到步进电机。 比如,用步进电机驱动同步带轴,实现直线运动。 再比如,用步进电机驱动滚珠丝杠轴,也可以把旋转运动转换为直线运动。 因为不需要反馈系统,所以步进电机的最大优点是…

【ESP32 + Edge Impulse平台】运行AI算法模拟多传感器数据融合实现异常检测

本篇博文主要以ESP32+MQ Sensor 气体传感器为例,通过连接 Edge Impulse 平台,实现数据的实时采集和训练,进而实现在嵌入式设备上部署 ML 机器学习。本教程介绍如何使用 Edge Impulse 和机器学习来实现ESP32 异常检测系统,系统使用一个机器学习模型,检测气体何时出现异常。…

基于自动化设备和现代化仓储精益管理思想开发的仓库管理系统

一、开源项目简介 立体仓库WMS deer-wms是基于自动化输送线、机械臂、点数机、提升机、堆垛机等自动化设备和现代化仓储精益管理思想开发出来的仓库管理系统。通过对接工厂的EBS(erp中一种)、MES(生产执行系统)、deer-wcs(设备调度系统&…

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结…

tortoiseSVN树冲突解决方案

方案一: 手动导出 trunk 上的文件(夹),把本地目录文件(夹)删了并替换成 trunk上的,再点击测试合并方案二: 如果执行了方案一还是冲突,确认本地和trunk文件一致后,可以跳过冲突的revision

numpy中的keepdims参数

numpy.mean,sum,max,min等函数中都有keepdims这个参数,这个参数的作用: 当 keepidmsTrue,保持其二维或者三维的特性,(结果保持其原来维数) 默认为 False,不保持其二维或者三维的特性.(结果不保持其原来维数) 假设我们有一个二维数组A,其中A的…

什么人适合学NPDP产品经理认证?

NPDP产品经理认证,最适合学的就是产品经理了,但是证书没有局限性,适用于所有与产品开发相关的行业和领域,特别是那些需要提高产品成功率和效率的团队成员。就是一句话,只要你觉得有用,都可以考。 通过学习N…

k8s的入门和项目部署

1、k8s简介 1.1 k8s是什么 kubernetes,希腊文中舵手的意思,简称K8s,是Google开源的容器编排引擎。在Docker容器引擎的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规…

打造卓越摄影作品,尽享专业级编辑体验——DxO PhotoLab 7 for Mac

DxO PhotoLab 7 for Mac 是一款功能强大的专业照片编辑软件,为摄影爱好者和专业摄影师提供了优秀的工具和功能,让您能够轻松打造卓越的摄影作品并实现专业级的编辑效果。 DxO PhotoLab 7 提供了一套先进的图像处理算法,能够准确地还原照片的…

最近很火的AIGC人工智能之AI赋能运营(巧用ChatGPT轻松上手新媒体)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

打造香港最安全便捷的银行,众安银行发布首份技术白皮书

作者:林海宾&李龙 作为香港金融科技的代表,香港虚拟银行通过科技驱动,为客户提供了安全、便捷、普惠的金融服务。在八间持牌的虚拟银行中,众安银行目前在用户数量、存款、资产和收入规模上均处于领先水平。最快120秒线上开户…