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 等有地址路径的设置时,提示没法创建文件、目录

原文地址:https://www.cnblogs.com/hujunmin/p/15769757.html