Docker+RabbitMQ+HAProxy 集群镜像模式实现高可用
一、RabbitMQ 基础知识
RabbitMQ 吞吐量测试工具:http://www.javashuo.com/article/p-rwgevhno-ez.html
RabbitMQ 集群配置:https://www.cnblogs.com/vipstone/p/9362388.html
二、RabbitMQ 搭建
1.创建一个桥接网络
docker network create rabbtimanet
2.查看网络
docker network ls
3.创建 RabbitMQ 容器
docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -p 1883:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --net=rabbtimanet rabbitmq:3.9.11-management docker run -d --hostname rabbit2 --name myrabbit2 -p 15673:15672 -p 5673:5672 -p 1884:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --net=rabbtimanet rabbitmq:3.9.11-management docker run -d --hostname rabbit3 --name myrabbit3 -p 15674:15672 -p 5674:5672 -p 1885:1883 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --net=rabbtimanet rabbitmq:3.9.11-management
端口 15672: RabbitMQ 的管理后台端口
端口 5672:RabbitMQ 的端口
端口 1883:RabbitMQ 的 MQTT 插件端口
4.启用管理界面
docker exec -it myrabbit1 rabbitmq-plugins enable rabbitmq_management docker exec -it myrabbit2 rabbitmq-plugins enable rabbitmq_management docker exec -it myrabbit3 rabbitmq-plugins enable rabbitmq_management
5.启用 MQTT 插件
docker exec -it myrabbit1 rabbitmq-plugins enable rabbitmq_mqtt docker exec -it myrabbit2 rabbitmq-plugins enable rabbitmq_mqtt docker exec -it myrabbit3 rabbitmq-plugins enable rabbitmq_mqtt
6.配置集群
#容器1 docker exec -it myrabbit1 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit #容器2 docker exec -it myrabbit2 bash rabbitmqctl stop_app rabbitmqctl reset #容器2加入集群 rabbitmqctl join_cluster --ram rabbit@rabbit1 //(--ram:内存存储方式,默认磁盘存储) rabbitmqctl start_app exit #容器3 docker exec -it myrabbit3 bash rabbitmqctl stop_app rabbitmqctl reset #容器3加入集群 rabbitmqctl join_cluster --ram rabbit@rabbit1 //(--ram:内存存储方式,默认磁盘存储) rabbitmqctl start_app exit
三、HAProxy 搭建
参考地址:https://www.freesion.com/article/1132374240/
1.创建目录
mkdir /data/docker/haproxy/8100 mkdir /data/docker/haproxy/8101
2.配置 haproxy.cfg
global #工作目录 #chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info log 127.0.0.1 local5 info #守护进程运行 daemon defaults log global mode http #日志格式 option httplog #日志中不记录负载均衡的心跳检测记录 option dontlognull #连接超时(毫秒) timeout connect 5000 #客户端超时(毫秒) timeout client 50000 #服务器超时(毫秒) timeout server 50000 #监控界面 listen admin_stats #监控界面的访问的IP和端口 bind 0.0.0.0:8100 #访问协议 mode http #URI相对地址 stats uri /stats #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:abc123456 #mqtt 服务端负载均衡 listen rabbitmq_server #访问的IP和端口(前面ip=0代表任何ip都可访问) bind 0.0.0.0:1887 #网络协议 mode tcp #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测 #option mysql-check user haproxy server myrabbit1 192.168.137.200:1883 check weight 1 maxconn 2000 server myrabbit2 192.168.137.200:1884 check weight 1 maxconn 2000 server myrabbit3 192.168.137.200:1885 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka #rabbitmq 服务端负载均衡 listen rabbitmq_server #访问的IP和端口(前面ip=0代表任何ip都可访问) bind 0.0.0.0:5677 #网络协议 mode tcp #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测 #option mysql-check user haproxy server myrabbit1 192.168.137.200:5672 check weight 1 maxconn 2000 server myrabbit2 192.168.137.200:5673 check weight 1 maxconn 2000 server myrabbit3 192.168.137.200:5674 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka #rabbitmq 管理界面负载均衡 listen rabbitmq_admin #访问的IP和端口(前面ip=0代表任何ip都可访问) bind 0.0.0.0:8000 #网络协议 mode http #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测 #option mysql-check user haproxy server myrabbit1 192.168.137.200:15672 check weight 1 maxconn 2000 server myrabbit2 192.168.137.200:15673 check weight 1 maxconn 2000 server myrabbit3 192.168.137.200:15674 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka
3.创建容器
docker run -it -d -p 5677:5677 -p 8100:8100 -p 8000:8000 -p 1887:1887 -v /data/docker/haproxy/8100:/usr/local/etc/haproxy --name haproxy01 --privileged --net=rabbtimanet haproxy
端口 8100 :HAProxy 管理界面
端口 8000:RabbitMQ 管理界面
端口 5677:RabbitMQ 服务
端口 1887:RabbitMQ 的 MQTT 插件服务
到此,已经配置完毕。
效果图如下:
遇到的问题:
1.目前 haproxy 是只是单机,需要考虑集群?
2.Docker 安装 haproxy 时,提示 global 中配置了 chroot 等有地址路径的设置时,提示没法创建文件、目录