Docker中搭建RabbitMQ集群
- 1、启动三个RabbitMQ容器
- 2、为容器设置节点
- 2.1、设置Erlang Cookie
- 2.2、设置节点1
- 2.3、设置节点2
- 2.4、设置节点3
- 2.5、预览结果
- 3、配置镜像队列
- 3.1、配置镜像的原因
- 3.2、搭建步骤
1、启动三个RabbitMQ容器
服务器IP | 端口 | hostname | 管理界面地址 |
---|---|---|---|
192.168.13.100 | 5673 | rabbitmq-node1 | 192.168.13.100:15673 |
192.168.13.100 | 5674 | rabbitmq-node2 | 192.168.13.100:15674 |
192.168.13.100 | 5675 | rabbitmq-node3 | 192.168.13.100:15675 |
新版本已经不建议通过环境变量设置 Erlang Cookie 了,建议在 home 目录下新建 .erlang.cookie 文件,在 每个节点的 .erlang.cookie 写入一致的字符串,注意 .erlang.cookie 文件的权限应该为 400。
所以为了便于修改ErlangCookie,启动容器时要做好容器数据卷的映射。
因为
/var/lib/rabbitmq
是 RabbitMQ home 目录和 data 目录,所以需要映射到宿主机
启动第一个容器:
docker run -d --hostname rabbitmq-node1 --name rabbitmq-node1 -p15673:15672 -p5673:5672 --privileged=true -v /app/RabbitMQ/rabbitmq-node1:/var/lib/rabbitmq rabbitmq:latest
启动第二个容器:
docker run -d --hostname rabbitmq-node2 --name rabbitmq-node2 -p15674:15672 -p5674:5672 --link rabbitmq-node1:rabbitmq-node1 --privileged=true -v /app/RabbitMQ/rabbitmq-node2:/var/lib/rabbitmq rabbitmq:latest
启动第三个容器:
docker run -d --hostname rabbitmq-node3 --name rabbitmq-node3 -p15675:15672 -p5675:5672 --link rabbitmq-node1:rabbitmq-node1 --link rabbitmq-node2:rabbitmq-node2 --privileged=true -v /app/RabbitMQ/rabbitmq-node3:/var/lib/rabbitmq rabbitmq:latest
启动完成之后,使用 docker ps
命令查看RabbitMQ是否启动成功
RabbitMQ容器启动成功后,我们需要在容器中开启Web端的管理插件
,具体启动教程在我的《docker中安装并启动rabbitMQ》中有详细的步骤,这里不再赘述。
2、为容器设置节点
2.1、设置Erlang Cookie
因为Erlang节点间通过认证Erlang cookie的方式来允许互相通信,所以RABBITMQ_ERLANG_COOKIE必须设置为同一个值。
RabbitMQ容器映射在宿主机上的文件:
首先进入宿主机的 /app/RabbitMQ/rabbitmq-node1(这里是rabbitmq-node1容器映射到宿主机的目录)目录下
,使用 vim
命令打开 .erlang.cookie
文件,将Cookie值复制到另外两个容器的 .erlang.cookie
文件中。
复制完成后重新启动 rabbitmq-node1
和 rabbitmq-node2
容器,确保宿主机中修改后的 erlang cookie
的值能够被映射到这两个容器中。
2.2、设置节点1
docker exec -it rabbitmq-node1 bash
rabbitmqctl stop_app
# (rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务)
rabbitmqctl reset
rabbitmqctl start_app(只启动应用服务)
exit
2.3、设置节点2
docker exec -it rabbitmq-node2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app(只启动应用服务)
exit
2.4、设置节点3
docker exec -it rabbitmq-node3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app(只启动应用服务)
exit
2.5、预览结果
节点设置完成之后,在浏览器访问192.168.13.100:15673、192.168.13.100:15674和192.168.13.100:15675中任意一个来查看RabbitMQ Management:
至此,RabbitMQ集群搭建完毕。
3、配置镜像队列
3.1、配置镜像的原因
如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并 且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但 是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一 个短暂却会产生问题的时间窗。通过 publisherconfirm(发布确认) 机制能够确保客户端知道哪些消息己经存入磁盘,尽 管如此,一般不希望遇到因单点故障导致的服务不可用。
引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中 的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。
3.2、搭建步骤
-
启动三台集群节点
-
随便找一个节点添加 policy(策略)
说明:
- Name:新建的策略的名字(按照自己的需求进行设置即可)
- Pattern:会按照设置的规则进行镜像设置(例如本例中设置为
^mirror
,则会为开头是mirror
的队列进行镜像备份)
-
在 rabbitmq-node1 上创建一个队列发送一条消息,队列存在镜像队列
-
停掉 rabbitmq-node1 之后发现 rabbitmq-node2 成为镜像队列
-
就算整个集群只剩下一台机器了 依然能消费队列里面的消息 说明队列里面的消息被镜像队列传递到相应机器里面