基于Docker的RabbitMQ集群搭建作业
1. 目标
搭建一个拥有三个节点的RabbitMQ集群
2. 准备工作
3. 部署RabbitMQ集群
使用docker部署RabbitMQ非常方便,本作业使用带web管理界面的镜像rabbitmq:management。
基于构建集群的目的,相对于部署一个单独的RabbitMQ节点,需要注意以下两点:
- 节点间通过域名相互查找,所以需要设置好域名解析。如:hosts文件实现,详细参见官网Cluster Formation Requirements。
RabbitMQ nodes address each other using domain names, either short or fully-qualified (FQDNs). Therefore hostnames of all cluster members must be resolvable from all cluster nodes, as well as machines on which command line tools such as rabbitmqctl might be used.
- 所有节点都需要设置相同的ErLang Cookie。
RabbitMQ nodes and CLI tools (e.g. rabbitmqctl) use a cookie to determine whether they are allowed to communicate with each other. For two nodes to be able to communicate they must have the same shared secret called the Erlang cookie. The cookie is just a string of alphanumeric characters up to 255 characters in size.
3.1 部署RabbitMQ应用
- 本作业使用docker networking方案进行域名解析,所以首先创建一个名为rabbit_net的网络
$ docker network create rabbit_net
- 部署三个RabbitMQ节点,分别为rabbitmq-node0、rabbitmq-node1、rabbitmq-node2,设置相同的ErLang Cooike,并加入到rabbit_net中。因为Unix*下RABBITMQ_NODENAME的默认配置是rabbit@$HOSTNAME,所以本作业保持容器名和hostname一致,使RabbitMQ的HOSTNAME和rabbit_net中的hostname相同。
$ docker run -d --name rabbitmq-node0 \
-h rabbitmq-node0 \
--publish 5671:5671 \
--publish 5672:5672 \
--publish 25672:25672 \
--publish 15672:15672 \
-e RABBITMQ_ERLANG_COOKIE='JOLLYCHICFOURIER' \
--net=rabbit_net \
rabbitmq:management
$ docker run -d --name rabbitmq-node1 \
-h rabbitmq-node1 \
--publish 5681:5671 \
--publish 5682:5672 \
--publish 25682:25672 \
--publish 15682:15672 \
-e RABBITMQ_ERLANG_COOKIE='JOLLYCHICFOURIER' \
--net=rabbit_net \
rabbitmq:management
$ docker run -d --name rabbitmq-node2 \
-h rabbitmq-node2 \
--publish 5691:5671 \
--publish 5692:5672 \
--publish 25692:25672 \
--publish 15692:15672 \
-e RABBITMQ_ERLANG_COOKIE='JOLLYCHICFOURIER' \
--net=rabbit_net \
rabbitmq:management
RabbitMQ各端口的功能:
4369 (epmd)
5672, 5671 (AMQP 0-9-1 without and with TLS)
15672 (if management plugin is enabled)
25672 (Erlang distribution)
61613, 61614 (if STOMP is enabled)
1883, 8883 (if MQTT is enabled)
所以按照默认端口配置,部署完以后就可以登录 http://宿主机IP:15672 就能进入管理页面。rabbitmq默认用户名及密码:guest/guest。
3.2 集群配置
基于上述部署的节点,RabbitMQ的集群配置相对简单。由于节点都在同一个网络,并且设置了相同的ErlangCookie。所以登录到任何一个节点,通过rabbitmqctl就能操作集群中的其他所有节点。
- 使用docker登录到rabbitmq-node0
$ docker exec -it rabbitmq-node0 /bin/sh
- 在rabbitmq-node0中进行集群配置。
$ rabbitmqctl -n rabbit@rabbitmq-node1 stop_app
$ rabbitmqctl -n rabbit@rabbitmq-node1 join_cluster rabbit@rabbitmq-node0
$ rabbitmqctl -n rabbit@rabbitmq-node1 start_app
$ rabbitmqctl -n rabbit@rabbitmq-node2 stop_app
$ rabbitmqctl -n rabbit@rabbitmq-node2 join_cluster rabbit@rabbitmq-node0
$ rabbitmqctl -n rabbit@rabbitmq-node2 start_app
至此,作业完成。