使用 docker-compose 部署多机 RabbitMQ 集群

简介: 本文介绍 RabbitMQ 集群的 Docker 化部署,最开始是想通过 DockerSwarm 方式来部署的,但是 RabbitMQ 节点加入集群时一直失败,在网上找了很多办法,始终没有解决这个问题,无奈只能放弃。所以最终采用配置 hosts 文件方式来保证节点之间的通信,下面来进行详细说明。

本文介绍 RabbitMQ 集群的 Docker 化部署,最开始是想通过 DockerSwarm 方式来部署的,但是 RabbitMQ 节点加入集群时一直失败,在网上找了很多办法,始终没有解决这个问题,无奈只能放弃。所以最终采用配置 hosts 文件方式来保证节点之间的通信,下面来进行详细说明。


部署环境


  • 系统:CentOS8
  • 两台服务器:10.1.1.1/10.1.1.2


docker-compose 文件


version: '3'
services:
  rabbit1:
    container_name: rabbit1
    image: rabbitmq:3.7-management-alpine
    restart: always
    hostname: rabbit1
    extra_hosts:
      - "rabbit1:10.1.1.1"
      - "rabbit2:10.1.1.2"
    environment:
      - RABBITMQ_ERLANG_COOKIE=MY_COOKIE
      - RABBITMQ_DEFAULT_USER=MY_USER
      - RABBITMQ_DEFAULT_PASS=MY_PASS
    ports:
      - "4369:4369"
      - "5671:5671"
      - "5672:5672"
      - "15671:15671"
      - "15672:15672"
      - "25672:25672"
复制代码


这样,10.1.1.1 上的 docker-compose 文件就写好了,部署另一台时,只要将 rabbit1 改成 rabbit2 就可以了。如果是更多台服务器的话,也是同样的道理,将 IP 配置到 extra_hosts 参数下即可。


启动服务


在两台服务器上分别执行:


# docker-compose up -d
复制代码


加入集群


如果将 rabbit1 作为主节点的话,需要在 rabbit2 上执行命令,将其加入到集群,如下:


# docker exec -it rabbit2 /bin/bash
rabbit2# rabbitmqctl stop_app
rabbit2# rabbitmqctl reset
rabbit2# rabbitmqctl join_cluster rabbit@rabbit1
rabbit2# rabbitmqctl start_app
复制代码


默认情况下,RabbitMQ 启动后是磁盘节点,如果想以内存节点方式加入,可以加 --ram 参数。


如果想要修改节点类型,可以使用命令:


# rabbitmqctl change_cluster_node_type disc(ram)
复制代码


修改节点类型之前需要先 rabbitmqctl stop_app

通过下面命令来查看集群状态:


# rabbitmqctl cluster_status
复制代码


注意,由于 RAM 节点仅将内部数据库表存储在内存中,因此在内存节点启动时必须从其他节点同步这些数据,所以一个集群必须至少包含一个磁盘节点。


HAProxy 负载均衡


ha 同样采用 Docker 方式来部署,先看一下 haproxy.cfg 配置文件:


# Simple configuration for an HTTP proxy listening on port 80 on all
# interfaces and forwarding requests to a single backend "servers" with a
# single server "server1" listening on 127.0.0.1:8000
global
    daemon
    maxconn 256
defaults
    mode http
    timeout connect 5000ms
    timeout client 5000ms
    timeout server 5000ms
listen rabbitmq_cluster
    bind 0.0.0.0:5677
    option tcplog
    mode tcp
    balance leastconn
    server  rabbit1 10.1.1.1:5672 weight 1 check inter 2s rise 2 fall 3
    server  rabbit2 10.2.2.2:5672 weight 1 check inter 2s rise 2 fall 3
listen http_front
    bind 0.0.0.0:8002
    stats uri /haproxy?stats
listen rabbitmq_admin
    bind 0.0.0.0:8001
    server rabbit1 10.1.1.1:15672
    server rabbit2 10.1.1.2:15672
复制代码


再看一下 docker-compose 文件:


version: '3'
services:
  haproxy:
    container_name: rabbit-haproxy
    image: haproxy
    restart: always
    hostname: haproxy
    network_mode: rabbitmq_default
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    ports:
      - "5677:5677"
      - "8001:8001"
      - "8002:8002"
复制代码


启动之后,就可以通过 ha 的地址来访问 RabbitMQ 集群管理页面了。

如果公司内部有现成的负载均衡,比如 LVS,那么也可以省略这一步。

其实到这里,集群就可以正常使用了,但还有很重要的一点需要做些说明。


集群模式


普通模式


  • 对于 Queue 来说,消息实体只存在于其中一个节点,A、B 两个节点仅有相同的元数据,即队列结构。
  • 当消息进入 A 节点的队列中后,消费者从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给消费者。
  • 所以,消费者应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理队列,否则,无论消费者连 A 或者连 B,出口总在 A,会产生瓶颈。
  • 该模式还存在一个问题就是当 A 节点故障后,B 节点无法取到 A 节点中还未消费的消息实体。
  • 如果做了消息持久化,那么得等 A 节点恢复,才可被消费;如果没有持久化的话,消息会丢失。


镜像模式


  • 该模式解决了上述问题,其和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在消费者取数据时临时拉取。
  • 该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
  • 所以,在对可靠性要求较高的场合中适用于该模式。

个人感觉,在生产环境中,还是使用镜像模式比较保险。

要想使用镜像模式,不管是通过管理页面,还是命令行方式,只需要简单配置即可完成。管理页面方式就不过多介绍了,下面说说如何通过命令行来设置,一条命令就搞定。


添加:


# rabbitmqctl set_policy -p testvhost testha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Setting policy "testha" for pattern "^" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "testvhost" ...
复制代码


清除:


# rabbitmqctl clear_policy -p testvhost testha
Clearing policy "testha" on vhost "testvhost" ...
复制代码


查看:


# rabbitmqctl list_policies -p testvhost
Listing policies for vhost "testvhost" ...
vhost   name    pattern apply-to        definition      priority
testvhost       testha  ^       all     {"ha-mode":"all","ha-sync-mode":"automatic"}    0
复制代码


参数说明:

  • Virtual host:策略应用的 vhost。
  • Name:为策略名称,可以是任何名称,但建议使用不带空格的基于 ASCII 的名称。
  • Pattern:与一个或多个 queue(exchange) 名称匹配的正则表达式,可以使用任何正则表达式。只有一个 ^ 代表匹配所有,^test 为匹配名称为 "test" 的 exchanges 或者 queue。
  • Apply to:Pattern 应用对象。
  • Priority:配置多个策略时的优先级,值越大,优先级越高。没有指定优先级的消息会以 0 优先级对待,对于超过队列所定最大优先级的消息,优先级以最大优先级对待。
  • Definition:键/值对,将被插入匹配 queues and exchanges 的可选参数映射中。ha-mode:策略键,分为 3 种模式:
  • all :所有的 queue。
  • exctly :部分(需配置 ha-params 参数,此参数为 int 类型。比如 3,众多集群中的随机 3 台机器)。
  • nodes :指定(需配置 ha-params 参数,此参数为数组类型。比如 ["rabbit@rabbit2", "rabbit@rabbit3"] 这样指定为 rabbit2 与 rabbit3 这两台机器)。
  • ha-sync-mode:队列同步:
  • manual:手动(默认模式)。新的队列镜像将不会收到现有的消息,它只会接收新的消息。
  • automatic:自动同步。当一个新镜像加入时,队列会自动同步。队列同步是一个阻塞操作。

以上就是本篇全部内容,欢迎大家留言交流。


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
162 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
3天前
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
24 2
|
1月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
608 11
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
22天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
21天前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
24 2
|
3天前
|
消息中间件 RocketMQ
2024最全RocketMQ集群方案汇总
在研究RocketMQ集群方案时,发现网上存在诸多不一致之处,如组件包含NameServer、Broker、Proxy等。通过查阅官方文档,了解到v4.x和v5.x版本的差异。v4.x部署模式包括单主、多主、多主多从(异步复制、同步双写),而v5.x新增Local与Cluster模式,主要区别在于Broker和Proxy是否同进程部署。Local模式适合平滑升级,Cluster模式适合高可用需求。不同模式下,集群部署方案大致相同,涵盖单主、多主、多主多从等模式,以满足不同的高可用性和性能需求。
13 0
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
140 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
27天前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
41 3
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理