部署Docker RabbitMQ集群
集群:docker + RabbitMQ + nginx
创建目录

# docekr 部署三个rabbitMQdocker run -d --hostname rabbitmq01 --name rabbitmq01 -v /rabbitmqCluster/rabbit01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='123456' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --restart=unless-stopped rabbitmq:managementdocker run -d --hostname rabbitmq02 --name rabbitmq02 -v /rabbitmqCluster/rabbit02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='123456' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --restart=unless-stopped --link rabbitmq01:rabbitmq01 rabbitmq:managementdocker run -d --hostname rabbitmq03 --name rabbitmq03 -v /rabbitmqCluster/rabbit03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='123456' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --restart=unless-stopped --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management
命令说明:
-d:守护线程后台运行方式--hostname:容器的名称-p:容器和主机端口映射-e:环境配置-v:目录映射RABBITMQ_NODENAME:RABBITMQ_ERLANG_COOKIE:--restart=unless-stopped:docker 容器重启后重启MQRABBITMQ_DEFAULT_USER=admin:设置rabbitmq默认用户为adminRABBITMQ_DEFAULT_PASS=admin:设置rabbitmq默认密码为adminRABBITMQ_ERLANG_COOKIE:通过Erlang Cookie,相当于共享秘钥的概念,长度任意,只要所有容器都一致即可-h: 设置容器hostname名称–-link: 实现docker容器互联
其他linux 命令:
systemctl status firewalld.service查看防火墙systemctl stop firewalld.service关闭防火墙【本地测试】
部署好三个rabbitmq我们直接访问主机IP+端口即可看到,reabbitMq的web页面。【提前关闭防火墙/开放端口】

关闭防护墙,我们直接访问:主机IP +端口
登录我们设置的admin账户

我们发现这个时候并没有展示多个rabbitMQ节点
加入集群
- rabbitmq容器1
docker exec -it rabbitmq01 bash # 进入容器rabbitmq01 并且打开一个新的bsah## 执行命令#首先停止当前MQrabbitmqctl stop_app#resetMQrabbitmqctl reset#重新启动MQrabbitmqctl start_app退出容器exit
操作日志:

- rabbitmq容器2
# 进入容器docker exec -it rabbit02 bash#首先停止当前MQrabbitmqctl stop_app#resetMQrabbitmqctl reset#和rabbit01的消息队列建立关系rabbitmqctl join_cluster --ram rabbit@rabbitmq01#重新启动MQrabbitmqctl start_app退出容器exit
操作日志:


- rabbitmq容器3
# 进入容器docker exec -it rabbit02 bash#首先停止当前MQrabbitmqctl stop_app#resetMQrabbitmqctl reset#和rabbit01的消息队列建立关系(--ram:内存存储方式,默认磁盘存储)rabbitmqctl join_cluster --ram rabbit@rabbitmq01#重新启动MQrabbitmqctl start_app退出容器exit
结果,在任意节点查看集群:

其它命令:
//其他基本操作// 在另外其他节点上操作要移除的集群节点rabbitmqctl forget_cluster_node master73@master73//集群名称(默认为第一个node名称)修改(任意节点):rabbitmqctl set_cluster_name rabbitmq_cluster1//查看集群状态(任意节点)rabbitmqctl cluster_status
镜像集群
实现镜像集群:
进入任意rabbitmq容器中:
# 进入容器docker exec -it rabbitmq01 bash# 执行策略命令rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'#退出容器exit

- 可以使用
rabbitmqctl list_policies -p /; 查看vhost/下面的所有policy - 在cluster中任意节点启动策略,策略会自动同步到集群节点
- 可以使用
rabbitmqctl set_policy-p/ha-all"^" ‘{“ha-mode”:“all”}’ - 策略模式all即复制到所有节点,包含新增节点,策略正则表达式为
"^"表示所有匹配


配置成功
负载均衡方案
方式一 nginx 负载均衡
进入已经提前创建好的nginx文件夹,放nginx配置文件
nginx_rabbitmq_1.conf
user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events {worker_connections 1024;}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;#mq管理界面负载均衡配置upstream mqweb{server 10.133.46.129:15673;server 10.133.46.129:15674;server 10.133.46.129:15675;}server{listen 15676;server_name 192.168.45.129;location / {proxy_pass http://mqweb;}}include /etc/nginx/conf.d/*.conf;}#mq tcp连接负载均衡配置。注意!!!tcp配置需要在stream模块内,跟http模块同级,不在http模块里边,且不需要server_name和locationstream{upstream mqtcp{server 10.133.46.129:5673 max_fails=2 fail_timeout=5s;server 10.133.46.129:5674 max_fails=2 fail_timeout=5s;server 10.133.46.129:5675 max_fails=2 fail_timeout=5s;}server{listen 5676;proxy_pass mqtcp;}}
上传到nginx目录;
启动docker nginx容器:
docker run -it -d --name nginxmq -p 15676:15676 -p 5676:5676 --restart always -v /rabbitmqCluster/nginx/nginx_rabbitmq_1.conf:/etc/nginx/nginx.conf --privileged nginx
访问nginx端口15676:同样显示rabbitmq的管理页面

刷新多次,可以发现Cluster 在切换观察时间已经cluster的变化


方式二 HaProxy负载均衡【未实现】
介绍
HaProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HaProxy特别适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理。HaProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以简单安全整合进您当前框架中,同时可以保护你的web服务器不被暴露到网络上
部署HaProxy
- 创建文件夹haproxy

- HaProxy 配置文件
- 上传到目录haproxy下
- 启动容器
