Docker多主机搭建RabbitMQ集群

简介: 本文通过docker swarm建立多主机的Rabbitmq集群,自带配置文件,无需再次配置,直接启动即可3台主机,分别为:test01:192.168.1.10,角色:managertest02:192.168.1.20,角色:workertest03:192.168.1.30,角色:worker配置好各自的hostname

Docker多主机搭建RabbitMQ集群
本文通过docker swarm建立多主机的Rabbitmq集群,自带配置文件,无需再次配置,直接启动即可
3台主机,分别为:
test01:192.168.1.10,角色:manager
test02:192.168.1.20,角色:worker
test03:192.168.1.30,角色:worker
配置好各自的hostname
docker swarm
创建docker swarm集群
docker swarm init --advertise-addr 192.168.1.10Swarm initialized: current node (z2n633mty5py7u9wyl423qnq0) is now a manager. To add a worker to this swarm, run the following command: # 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥) docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.1.10:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。
因此,其它两个节点加入集群的话,只需要按照提示,输入:
docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.1.10:2377
即可加入docker swarm集群
在manager服务器中确认新的两个workers已经加入
[root@test01 docker]# docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONsdhq8qsmvptdge76nxe3shrug * test01 Ready Active Leader 19.03.1394gn5oj2so67wi63smjhdss69 test02 Ready Active 19.03.13lkl3pcqmuh43iwi4fjccmgg9r test03 Ready Active 19.03.13
创建网络
创建一个overlay的网络
docker network create -d overlay rabbitmq-cluster
如果已经有这个网络了先删除:bashdocker network rm rabbitmq-cluster
查看已创建好的网络
docker network ls
NETWORK ID NAME DRIVER SCOPE4fb77484d00e bridge bridge localfe2fe4e230f3 docker_gwbridge bridge local392f51dce275 host host localxyiiys695y3q ingress overlay swarme7e48d381800 none null localun13usga59lw rabbitmq-cluster overlay swarm
配置文件
我将项目目录规划在/docker/rabbitmq中,先建立持久化存储目录/docker/rabbitmq/data
在manager上创建rabbitmq的配置文件路径:/docker/rabbitmq/rabbitmq.conf,内容如下:
loopback_users.guest = falselisteners.tcp.default = 5672hipe_compile = falsedefault_user = admindefault_pass = admincluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_configcluster_formation.classic_config.nodes.1 = rabbit@rabbit1cluster_formation.classic_config.nodes.2 = rabbit@rabbit2cluster_formation.classic_config.nodes.3 = rabbit@rabbit3cluster_formation.node_type = ram
后面的cluster_formation.node_type = ram表示创建的是ram集群,如果不写,就是默认的disc集群。
创建docker config
docker config create rabbitmq-config /docker/rabbitmq/rabbitmq.conf
创建部署文件,我将它放在/docker/swarm/rabbitmq_swarm.yml
version: "3.7"services: rabbit1: image: rabbitmq:3.8.2-management hostname: rabbit1 environment: RABBITMQ_ERLANG_COOKIE: "liaoxingchen_test" volumes: - "/docker/rabbitmq/data:/var/lib/rabbitmq" configs: - source: rabbitmq-config target: /etc/rabbitmq/rabbitmq.conf ports: - "4369:4369" - "5671:5671" - "5672:5672" - "15671:15671" - "15672:15672" - "25672:25672" deploy: replicas: 1 placement: constraints: - node.hostname==test01 rabbit2: image: rabbitmq:3.8.2-management hostname: rabbit2 depends_on: - rabbit1 environment: RABBITMQ_ERLANG_COOKIE: "liaoxingchen_test" volumes: - "/docker/rabbitmq/data:/var/lib/rabbitmq" configs: - source: rabbitmq-config target: /etc/rabbitmq/rabbitmq.conf deploy: replicas: 1 placement: constraints: - node.hostname==test02 rabbit3: image: rabbitmq:3.8.2-management hostname: rabbit3 depends_on: - rabbit1 environment: RABBITMQ_ERLANG_COOKIE: "liaoxingchen_test" volumes: - "/docker/rabbitmq/data:/var/lib/rabbitmq" configs: - source: rabbitmq-config target: /etc/rabbitmq/rabbitmq.conf deploy: replicas: 1 placement: constraints: - node.hostname==test03networks: default: external: name: rabbitmq-clusterconfigs: rabbitmq-config: external: true
其中,RABBITMQERLANGCOOKIE,可以自定义,只需要保证3个service一样,即可。
启动集群
在test01上使用如下命令启动集群:
docker stack deploy -c /docker/swarm/rabbitmq_swarm.yml rabbitmq
此时,你可以使用任何一个节点的15672端口,来访问Rabbitmq集群
无配置文件
如果不带配置文件,也可启动集群后,手动配置。
将yaml文件中configs:相关内容去掉,再启动集群,然后进入test02和test03,进入容器,输入如下命令:
rabbitmqctl stop_apprabbitmqctl resetrabbitmqctl join_cluster --ram rabbit@rabbit1rabbitmqctl start_app
效果是一样的,而且也会持久化到映射的data目录中。
补充
查看集群状态
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS8rlyppvidvjy rabbit_rabbit1 replicated 1/1 rabbitmq:3.8.2-management :4369->4369/tcp,:5671-5672->5671-5672/tcp, :15671-15672->15671-15672/tcp, :25672->25672/tcpjicd2n9dh0rd rabbit_rabbit2 replicated 1/1 rabbitmq:3.8.2-managementms4h7ljutm5n rabbit_rabbit3 replicated 1/1 rabbitmq:3.8.2-management
查看某一个service的状态,如,rabbit1
docker service ps rabbit_rabbit1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSsdih8hbhadfc rabbit_rabbit1.1 rabbitmq:3.8.2-management test01 Running Running 2 hours ago
删除服务,你可以挨个删除service,因为你同时启动了3个service,
docker service rm rabbit_rabbit1docker service rm rabbit_rabbit2docker service rm rabbit_rabbit3
也可以利用stack同时删除
docker stack rm rabbit
番外补充
Spring Boot 应用连接 RabbitMQ 集群配置
spring.rabbitmq.addresses=node1:5672,node2:5672,node3:5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin

相关实践学习
消息队列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月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
2月前
|
消息中间件 Docker 容器
消息中间件RabbitMQ---Docker安装RabbitMQ、以及RabbitMQ的基本使用【二】
这篇文章提供了RabbitMQ的安装和基本使用教程,包括如何使用Docker拉取RabbitMQ镜像、创建容器、通过浏览器访问管理界面,以及如何创建交换机、队列、绑定和使用direct、fanout和topic三种类型的交换器进行消息发布和接收的测试。
消息中间件RabbitMQ---Docker安装RabbitMQ、以及RabbitMQ的基本使用【二】
|
2月前
|
消息中间件 存储 负载均衡
|
2月前
|
负载均衡 调度 Docker
|
2月前
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
31 2
|
2月前
|
canal Kubernetes Docker
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
|
2月前
|
Kubernetes Ubuntu Linux
基于Kubernetes v1.25.0和Docker部署高可用集群(02部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(02部分)
|
2月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
56 0
|
2月前
|
消息中间件 API 数据安全/隐私保护
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
就软件研发问题之RocketMQ ACL 2.0加强集群组件间访问控制的问题如何解决
|
2月前
|
NoSQL Linux Redis
使用docker-compose搭建redis-cluster集群
使用docker-compose搭建redis-cluster集群
228 0
下一篇
无影云桌面