在阿里云上的docker使用haproxy对rabbitmq集群进行负载均衡
安装rabbitmq
docker pull rabbitmq
等待自动安装结束,查看镜像
docker images
如图所示,我之前装了两个镜像,建议使用TAG为3-management的镜像,这样方便在web监控界面操作
rabbitmq集群的的设置如下
docker run -d --hostname rabbitmq1 --name rabbit1 -p 5673:5672 -p 15673:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3-management
docker run -d --hostname rabbitmq2 --name rabbit2 -p 5674:5672 -p 15674:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 rabbitmq:3-management
docker run -d --hostname rabbitmq3 --name rabbit3 -p 5675:5672 -p 15675:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 --link rabbit2:my-rabbit2 rabbitmq:3-management
注意这里的端口映射,集群的三个节点端口为5673,5674,5675,web监控页面的端口为15673,15674,15675,RABBITMQ_ERLANG_COOKIE要保证一致才能让三个节点互通
然后开始配置集群
顺序如下
节点1:
docker exec -it rabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
节点2:
docker exec -it rabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
exit
节点3:
docker exec -it rabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
exit
注意第一个节点和后续节点的配置不完全相同
然后配置镜像队列
docker exec -it rabbit1 bash
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
exi
接下来可以检查一下rabbitmq的三个节点是否启动完成
主机ip:15673
主机ip:15674
主机ip:15675
这就说明集群配置完成了,如果你的web页面打不开,可以尝试使用如下配置,三个节点都配置好后一般是可以正常显示的,前面也提到使用management版本的rabbitmq通常不会遇到这种问题
docker exec -it rabbit1 bash
rabbitmq-plugins enable rabbitmq_management
exit
安装haproxy
同样使用docker下载好镜像
docker pull haproxy
这个时候我们现在本机的home/haproxy目录下创建一个haproxy.cfg的配置文件(别的目录也行,本次的简单测试只保留haproxy.cfg这个文件就行)
vim /home/haproxy/haproxy.cfg
global
#日志
log 127.0.0.1 local0 info
maxconn 10240
daemon
defaults
log global
mode http
timeout connect 3000 #连接超时
timeout client 3000 #客户端超时
timeout server 3000 #服务器超时
timeout check 2000 #心跳检测超时
listen http_front #haproxy的监控页面
bind 0.0.0.0:8081#这个端口似乎也要开放防火墙
#firewall-cmd --zone=public --add-port=8081/tcp --permanent
#如果使用云服务器,最好也配置一下出入规则
mode http
option httplog
stats uri /hp
stats refresh 5s
stats enable
stats auth admin:123456
listen rabbitmq_admin#rabbit的监控页面
bind 0.0.0.0:8082
server rabbit_admin1 10.10.10.10:15673
server rabbit_admin2 10.10.10.10:15674
server rabbit_admin3 10.10.10.10:15675
listen haproxy #这里配置集群负载均衡
bind 0.0.0.0:5666 #对外提供的端口,访问这个端口就会根据配置的规则对集群下的节点进行相应的负载均衡
option tcplog
mode tcp
balance roundrobin #这是轮询算法,如有需要可以换成其他
#每次换一个节点进行使用
server rabbit1 10.10.10.10:5673 check inter 5000 rise 2 fall 2
server rabbit2 10.10.10.10:5674 check inter 5000 rise 2 fall 2
server rabbit3 10.10.10.10:5675 check inter 5000 rise 2 fall 2
保存后使用docker运行
建议先建立
/usr/local/etc/haproxy
这个目录
然后
docker run -d --name haproxy-rabbitmq -p 8081:8081 -p 5666:5666 -p 8082:8082 -v /home/haproxy:/usr/local/etc/haproxy:ro haproxy:latest
接着通过
10.10.10.10:8081
访问监控页面
同时通过
10.10.10.10:8081
也可以访问rabbitmq的监控页面
接着可以跑个项目看看,我这里使用的是java的SpringBoot框架
applicaiton.properties配置如下
server.port=8088
spring.rabbitmq.addresses=10.10.10.10:5666
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
注意这里rabbitmq的端口使用的是haproxy中配置的5666端口
测试后可以发现三个节点的队列都会收到消息