前言
随着高可用和云计算的发展,容器化和集群化已经成为现代Web应用的标配。而作为基于AMQP协议的消息中间件,RabbitMQ的性能和稳定性在分布式应用中发挥着越来越重要的作用。因此,本文将介绍如何在Docker容器中搭建RabbitMQ集群。
RabbitMQ 集群介绍
RabbitMQ是一个基于AMQP协议的消息中间件,可以实现高效的消息传递和消息队列的功能。在分布式应用中,RabbitMQ主要用于解决消息生产者和消费者间的异步通信问题。而在大型Web应用中,尤其是电商和社交网站,RabbitMQ的作用更为明显。
RabbitMQ集群是指多个RabbitMQ节点之间通过网络连接,实现相互协作,共同承载消息的负载和稳定性。通过搭建RabbitMQ集群,可以实现消息的高可用和负载均衡,从而提升整个分布式应用的性能和稳定性。
Docker 简介
Docker是一个开源的应用容器引擎,可以实现快速部署、运行和管理容器应用。在Docker中,应用程序和依赖项可以通过镜像保存和部署,提高了应用程序的可移植性和可重复性。Docker的另一个重要特性是容器化技术,可以将应用程序隔离运行,从而提高了安全性和稳定性。
1. 拉取 RabbitMQ 镜像
首先,我们需要从Docker Hub上拉取RabbitMQ镜像。可以通过以下命令来拉取最新的RabbitMQ官方镜像:
docker pull rabbitmq:management
这个管理插件中,包含了web界面,我们通过web界面可以操作集群
2. 创建 RabbitMQ 集群网络
通过以下命令创建RabbitMQ集群网络:
docker network create rabbitmq-cluster-network
3. 启动 RabbitMQ 容器
使用以下命令启动第一个RabbitMQ容器:
docker run -d --name rabbitmq1 --hostname rabbitmq1 --network rabbitmq-cluster-network -p 5672:5672 -p 15672:15672 rabbitmq:management
-d
参数表示后台运行容器。--name rabbitmq1
设置容器的名称为rabbitmq1。--hostname rabbitmq1
设置容器的主机名为rabbitmq1。--network rabbitmq-cluster-network
将容器加入到RabbitMQ集群网络中。-p 5672:5672 -p 15672:15672
对外映射容器的5672(AMQP)和15672(RabbitMQ管理界面)端口。rabbitmq:management
使用rabbitmq:management镜像运行容器。
运行上述命令后,会在后台启动一个名为rabbitmq1的容器,并将其加入到RabbitMQ集群网络中。我们可以通过以下命令查看docker容器运行状态:
docker ps
4. 启动其它 RabbitMQ 容器
接下来,我们需要在RabbitMQ集群中启动另外两个节点,使用以下命令:
docker run -d --name rabbitmq2 --hostname rabbitmq2 --network rabbitmq-cluster-network -e RABBITMQ_ERLANG_COOKIE='rabbitmqcluster' rabbitmq:management docker run -d --name rabbitmq3 --hostname rabbitmq3 --network rabbitmq-cluster-network -e RABBITMQ_ERLANG_COOKIE='rabbitmqcluster' rabbitmq:management
这里,我们需要传入RABBITMQ_ERLANG_COOKIE参数来保证三个容器之间的通信和认证,这里使用了'rabbitmqcluster'作为RABBITMQ_ERLANG_COOKIE的值。这三个容器之间的关系是:
+-----+ +-----+ +-----+ | rmq1|───────| rmq2|───────| rmq3| +-----+ +-----+ +-----+
5. 配置 RabbitMQ 集群
执行以下命令,将第二个和第三个节点添加到rabbitmq1节点:
docker exec -it rabbitmq2 rabbitmqctl stop_app docker exec -it rabbitmq3 rabbitmqctl stop_app docker exec -it rabbitmq2 rabbitmqctl join_cluster rabbit@rabbitmq1 docker exec -it rabbitmq3 rabbitmqctl join_cluster rabbit@rabbitmq1 docker exec -it rabbitmq2 rabbitmqctl start_app docker exec -it rabbitmq3 rabbitmqctl start_app
这里,我们使用 rabbitmqctl join_cluster
命令将第二个和第三个容器添加到集群中,rabbit@rabbitmq1
是第一个节点的名称和主机名。最后,我们需要启动第二个和第三个节点的RabbitMQ服务。
我们可以通过以下命令检查RabbitMQ集群的状态:
docker exec -it rabbitmq1 rabbitmqctl cluster_status
cluster_status 返回的状态中,如果 disc
这一项的值为 true
,说明该节点是启动后自动加入的;否则说明 stop_app
命令没有执行成功,可以再试一次,或者检查容器内部问题。
6. RabbitMQ 集群测试
现在,我们可以使用RabbitMQ Web管理界面或RabbitMQ命令行工具测试集群的发送和接收消息的能力了。
打开浏览器,在地址栏中输入:http://docker-ip:15672,即可打开RabbitMQ Web管理界面,使用默认的用户名密码:guest/guest。
然后,我们可以在界面上创建一个新的消息队列,发送一条消息,并检查是否能够被三个节点都收到。
另外,我们还可以使用RabbitMQ命令行工具测试集群的消息发送和接收能力:
docker exec -it rabbitmq1 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
这条命令将在RabbitMQ集群中启用全局的高可用性策略,然后我们可以测试发送和接收消息的能力:
docker exec -it rabbitmq1 rabbitmqctl set_user_tags guest administrator docker exec -it rabbitmq1 rabbitmqctl set_permissions -p / guest ".*" ".*" ".*" docker exec -it rabbitmq1 rabbitmqctl cluster_status
这里使用 rabbitmqctl set_user_tags
命令将默认的 guest
用户标记为了管理员,这样就可以使用guest账户权限接收和发送消息了。而 rabbitmqctl set_permissions
则设置了读写权限。最后,我们可以使用 rabbitmqctl cluster_status
命令检查RabbitMQ集群的状态。
结论
通过以上步骤,我们可以在Docker容器中搭建基于RabbitMQ的集群。并且通过Docker的高可用性和容器化技术,可以有效提高应用程序的可移植性和可重复性。通过使用RabbitMQ集群,可以提高消息生产和消费的效率和稳定性,从而增强了整个分布式应用的性能和稳定性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677495466d66e0f9aaee5ed4