一、构建rabbitmq集群
1.启动多个rabbitmq节点
rabbit01: #节点1主节点
image: rabbitmq:3.8.5-management-alpine
ports: #端口映射
- "5672:5672"
- "15672:15672"
hostname: rabbit01 #这个要记住,后面加入集群的时候会用到
volumes:
- ./logs/rabbitmq/rabbit01:/var/log/rabbitmq #挂载日志目录
# - ./data/rabbitmq/rabbit01:/var/lib/rabbitmq #数据挂载
environment: #设置环境变量(配置文件参数),虚拟主机,用户名,密码
RABBITMQ_DEFAULT_VHOST: "/"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "123456"
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
# 由于rabbitmq节点间通过认证cookie的方式来允许互相通信,所以RABBITMQ_ERLANG_COOKIE必须设置为相同的。
rabbit02:
image: rabbitmq:3.8.5-management-alpine
ports: #端口映射
- "5673:5672"
hostname: "rabbit02"
links: #关联主节点的hostname,方便容器内互相访问
- rabbit01
volumes:
- ./logs/rabbitmq/rabbit02:/var/log/rabbitmq
# - ./data/rabbitmq/rabbit02:/var/lib/rabbitmq
environment:
RABBITMQ_DEFAULT_VHOST: "/"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "123456"
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
rabbit03:
image: rabbitmq:3.8.5-management-alpine
ports: #端口映射
- "5674:5672"
hostname: "rabbit03"
links: #关联主节点的hostname,方便容器内互相访问
- rabbit01
volumes:
- ./logs/rabbitmq/rabbit03:/var/log/rabbitmq
# - ./data/rabbitmq/rabbit03:/var/lib/rabbitmq
environment:
RABBITMQ_DEFAULT_VHOST: "/"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "123456"
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
2.加入集群
说明
- 加入集群需要选择内存节点还是磁盘节点
- 保证至少有一个节点是磁盘节点(镜像集群情况下)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5785c0f19d9d haproxy:1.8.26-alpine "/docker-entrypoint.…" 24 hours ago Up 4 minutes 0.0.0.0:5666->5666/tcp, 0.0.0.0:8888->8888/tcp rabbitmqcluster_rabhaproxy_1ß
f34f27f1b2d6 rabbitmq:3.8.5-management-alpine "docker-entrypoint.s…" 24 hours ago Up About a minute 4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp rabbitmqcluster_rabbit03_1
20458e4712fd rabbitmq:3.8.5-management-alpine "docker-entrypoint.s…" 24 hours ago Up 4 minutes 4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp rabbitmqcluster_rabbit02_1
7890dd48e558 rabbitmq:3.8.5-management-alpine "docker-entrypoint.s…" 24 hours ago Up 4 minutes 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbitmqcluster_rabbit01_1
设置节点1
docker exec -it rabbitmqcluster_rabbit01_1 sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
设置节点2
docker exec -it rabbitmqcluster_rabbit02_1 sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit02
rabbitmqctl start_app
exit
设置节点3
docker exec -it rabbitmqcluster_rabbit03_1 sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit03
rabbitmqctl start_app
exit
二、 部署Haproxy
启动 1.Haproxy
rabhaproxy:
image: haproxy:1.8.26-alpine
ports: #端口映射
- "8888:8888"
- "5666:5666"
hostname: "rabhaproxy"
volumes:
- ./config/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg #挂载日志目录
links: #关联主节点的hostname,方便容器内互相访问
- rabbit01
- rabbit02
- rabbit03
2.配置haproxy.cfg
global
#日志输出配置,所有日志都记录在本机,通过local0输出
log 127.0.0.1 local0 info
#最大连接数
maxconn 10240
#以守护进程方式运行
daemon
defaults
#应用全局的日志配置
log global
mode http
#超时配置
timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 2000
## 管理web
listen http_front
bind 0.0.0.0:8888
mode http
option httplog
stats uri /haproxy
stats auth admin:123456
stats refresh 5s
stats enable
#绑定配置(rabbitmq集群)
listen rabbitmq_cluster
# 集群连接地址
bind 0.0.0.0:5666
option tcplog
#防止消费者连接超时(默认毫秒 3h 小时)
timeout client 10000
timeout server 10000
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#RabbitMQ集群节点配置
server rabbit01 rabbit01:5672 check inter 5000 rise 2 fall 2
server rabbit02 rabbit02:5672 check inter 5000 rißse 2 fall 2
server rabbit03 rabbit03:5672 check inter 5000 rise 2 fall 2
三、配置镜像队列
说明
镜像队列工作原理:在非镜像队列的集群中,消息会路由到指定的队列。当配置为镜像队列之后,消息除了按照路由规则投递到相应的队列外,还会投递到镜像队列的拷贝。也可以想象在镜像队列中隐藏着一个fanout交换器,将消息发送到镜像的队列的拷贝。
#进入主节点执行(节点1)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
四、docker文件
- docker-compose.yml
version: "3.1"
services:
rabbit01: #节点1主节点
image: rabbitmq:3.8.5-management-alpine
ports: #端口映射
- "5672:5672"
- "15672:15672"
hostname: rabbit01 #这个要记住,后面加入集群的时候会用到
volumes:
- ./logs/rabbitmq/rabbit01:/var/log/rabbitmq #挂载日志目录
# - ./data/rabbitmq/rabbit01:/var/lib/rabbitmq #数据挂载
environment: #设置环境变量(配置文件参数),虚拟主机,用户名,密码
RABBITMQ_DEFAULT_VHOST: "/"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "123456"
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
# 由于rabbitmq节点间通过认证cookie的方式来允许互相通信,所以RABBITMQ_ERLANG_COOKIE必须设置为相同的。
rabbit02:
image: rabbitmq:3.8.5-management-alpine
ports: #端口映射
- "5673:5672"
hostname: "rabbit02"
links: #关联主节点的hostname,方便容器内互相访问
- rabbit01
volumes:
- ./logs/rabbitmq/rabbit02:/var/log/rabbitmq
# - ./data/rabbitmq/rabbit02:/var/lib/rabbitmq
environment:
RABBITMQ_DEFAULT_VHOST: "/"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "123456"
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
rabbit03:
image: rabbitmq:3.8.5-management-alpine
ports: #端口映射
- "5674:5672"
hostname: "rabbit03"
links: #关联主节点的hostname,方便容器内互相访问
- rabbit01
volumes:
- ./logs/rabbitmq/rabbit03:/var/log/rabbitmq
# - ./data/rabbitmq/rabbit03:/var/lib/rabbitmq
environment:
RABBITMQ_DEFAULT_VHOST: "/"
RABBITMQ_DEFAULT_USER: "admin"
RABBITMQ_DEFAULT_PASS: "123456"
RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
rabhaproxy:
image: haproxy:1.8.26-alpine
ports: #端口映射
- "8888:8888"
- "5666:5666"
hostname: "rabhaproxy"
volumes:
- ./config/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg #挂载日志目录
links: #关联主节点的hostname,方便容器内互相访问
- rabbit01
- rabbit02
- rabbit03
- 构建命令 docker-compose -f docker-compose.yml up
- 删除命令 docker-compose -f docker-compose.yml down
- 启动命令 docker-compose -f docker-compose.yml up start
- 停止命令 docker-compose -f docker-compose.yml up stop