[TOC]
主机名 | 控制台端口 | AMQP通信端口 |
---|---|---|
mq1 | 8081 ---->15672 | 8071---->5672 |
mq2 | 8082 ---->15672 | 8072---->5672 |
mq3 | 8083 ---->15672 | 8073---->5672 |
RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。 要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。 每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。
docker run -d -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root --name mq --hostname mq -p 8074:5672 -p 8084:15672 rabbitmq
docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie
DFPDFJPEQOYLQYMOSKNE
docker rm -f mq
/rabbitmq
来存放集群的配置文件:rabbitmq.conf
:cd /rabbitmq
# 创建文件
touch rabbitmq.conf
loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3
# 创建cookie文件
touch .erlang.cookie
# 写入cookie
echo "DFPDFJPEQOYLQYMOSKNE" > .erlang.cookie
# 修改cookie文件的权限
chmod 600 .erlang.cookie
然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:
# 进入/rabbitmq
cd /rabbitmq
# 拷贝
cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3
docker network create mq-net
rabbitmq:3.13-rc-management 可替换新版本,但是必须是包含
management
的版本。
docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.13-rc-management
docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
--name mq2 \
--hostname mq2 \
-p 8072:5672 \
-p 8082:15672 \
rabbitmq:3.13-rc-management
docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=root \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.13-rc-management
docker ps
用户名:root
密码:root
docker exec -it mq1 rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
- docker exec -it mq1:对mq1容器做操作
- rabbitmqctl set_policy:固定写法
- ha-two:策略名称,自定义
- "^two.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以two.开头的队列名称
- '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}': 策略内容
- "ha-mode":"exactly":策略模式,此处是exactly模式,指定副本数量
- "ha-params":2:策略参数,这里是2,就是副本数量为2,1主1镜像
- "ha-sync-mode":"automatic":同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销。