部署Docker RabbitMQ集群
集群:docker + RabbitMQ + nginx
创建目录
# docekr 部署三个rabbitMQ
docker 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:management
docker 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:management
docker 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
## 执行命令
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#重新启动MQ
rabbitmqctl start_app
退出容器
exit
操作日志:
- rabbitmq容器2
# 进入容器
docker exec -it rabbit02 bash
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#和rabbit01的消息队列建立关系
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
#重新启动MQ
rabbitmqctl start_app
退出容器
exit
操作日志:
- rabbitmq容器3
# 进入容器
docker exec -it rabbit02 bash
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#和rabbit01的消息队列建立关系(--ram:内存存储方式,默认磁盘存储)
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
#重新启动MQ
rabbitmqctl 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和location
stream{
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下
- 启动容器