部署Docker RabbitMQ集群

集群:docker + RabbitMQ + nginx

创建目录

部署Docker RabbitMQ集群 - 图1

  1. # docekr 部署三个rabbitMQ
  2. 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
  3. 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
  4. 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 容器重启后重启MQ
  • RABBITMQ_DEFAULT_USER=admin:设置rabbitmq默认用户为admin
  • RABBITMQ_DEFAULT_PASS=admin:设置rabbitmq默认密码为admin
  • RABBITMQ_ERLANG_COOKIE:通过Erlang Cookie,相当于共享秘钥的概念,长度任意,只要所有容器都一致即可
  • -h: 设置容器hostname名称
  • –-link: 实现docker容器互联

其他linux 命令:

  1. systemctl status firewalld.service 查看防火墙
  2. systemctl stop firewalld.service 关闭防火墙【本地测试】

部署好三个rabbitmq我们直接访问主机IP+端口即可看到,reabbitMq的web页面。【提前关闭防火墙/开放端口】

部署Docker RabbitMQ集群 - 图2

关闭防护墙,我们直接访问:主机IP +端口

登录我们设置的admin账户

部署Docker RabbitMQ集群 - 图3

我们发现这个时候并没有展示多个rabbitMQ节点

加入集群

  1. rabbitmq容器1
  1. docker exec -it rabbitmq01 bash # 进入容器rabbitmq01 并且打开一个新的bsah
  2. ## 执行命令
  3. #首先停止当前MQ
  4. rabbitmqctl stop_app
  5. #resetMQ
  6. rabbitmqctl reset
  7. #重新启动MQ
  8. rabbitmqctl start_app
  9. 退出容器
  10. exit

操作日志:

部署Docker RabbitMQ集群 - 图4

  1. rabbitmq容器2
  1. # 进入容器
  2. docker exec -it rabbit02 bash
  3. #首先停止当前MQ
  4. rabbitmqctl stop_app
  5. #resetMQ
  6. rabbitmqctl reset
  7. #和rabbit01的消息队列建立关系
  8. rabbitmqctl join_cluster --ram rabbit@rabbitmq01
  9. #重新启动MQ
  10. rabbitmqctl start_app
  11. 退出容器
  12. exit

操作日志:

部署Docker RabbitMQ集群 - 图5

部署Docker RabbitMQ集群 - 图6

  1. rabbitmq容器3
  1. # 进入容器
  2. docker exec -it rabbit02 bash
  3. #首先停止当前MQ
  4. rabbitmqctl stop_app
  5. #resetMQ
  6. rabbitmqctl reset
  7. #和rabbit01的消息队列建立关系(--ram:内存存储方式,默认磁盘存储)
  8. rabbitmqctl join_cluster --ram rabbit@rabbitmq01
  9. #重新启动MQ
  10. rabbitmqctl start_app
  11. 退出容器
  12. exit

结果,在任意节点查看集群:

部署Docker RabbitMQ集群 - 图7

其它命令:

  1. //其他基本操作
  2. // 在另外其他节点上操作要移除的集群节点
  3. rabbitmqctl forget_cluster_node master73@master73
  4. //集群名称(默认为第一个node名称)修改(任意节点):
  5. rabbitmqctl set_cluster_name rabbitmq_cluster1
  6. //查看集群状态(任意节点)
  7. rabbitmqctl cluster_status

镜像集群

实现镜像集群:

进入任意rabbitmq容器中:

  1. # 进入容器
  2. docker exec -it rabbitmq01 bash
  3. # 执行策略命令
  4. rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
  5. #退出容器
  6. exit

部署Docker RabbitMQ集群 - 图8

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

部署Docker RabbitMQ集群 - 图9

部署Docker RabbitMQ集群 - 图10

配置成功

负载均衡方案

方式一 nginx 负载均衡

进入已经提前创建好的nginx文件夹,放nginx配置文件

nginx_rabbitmq_1.conf

  1. user nginx;
  2. worker_processes 1;
  3. error_log /var/log/nginx/error.log warn;
  4. pid /var/run/nginx.pid;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include /etc/nginx/mime.types;
  10. default_type application/octet-stream;
  11. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  12. '$status $body_bytes_sent "$http_referer" '
  13. '"$http_user_agent" "$http_x_forwarded_for"';
  14. access_log /var/log/nginx/access.log main;
  15. sendfile on;
  16. #tcp_nopush on;
  17. keepalive_timeout 65;
  18. #gzip on;
  19. #mq管理界面负载均衡配置
  20. upstream mqweb{
  21. server 10.133.46.129:15673;
  22. server 10.133.46.129:15674;
  23. server 10.133.46.129:15675;
  24. }
  25. server{
  26. listen 15676;
  27. server_name 192.168.45.129;
  28. location / {
  29. proxy_pass http://mqweb;
  30. }
  31. }
  32. include /etc/nginx/conf.d/*.conf;
  33. }
  34. #mq tcp连接负载均衡配置。注意!!!tcp配置需要在stream模块内,跟http模块同级,不在http模块里边,且不需要server_name和location
  35. stream{
  36. upstream mqtcp{
  37. server 10.133.46.129:5673 max_fails=2 fail_timeout=5s;
  38. server 10.133.46.129:5674 max_fails=2 fail_timeout=5s;
  39. server 10.133.46.129:5675 max_fails=2 fail_timeout=5s;
  40. }
  41. server{
  42. listen 5676;
  43. proxy_pass mqtcp;
  44. }
  45. }

上传到nginx目录;

启动docker nginx容器:

  1. 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的管理页面

部署Docker RabbitMQ集群 - 图11

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

部署Docker RabbitMQ集群 - 图12

部署Docker RabbitMQ集群 - 图13

方式二 HaProxy负载均衡【未实现】

介绍

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

部署HaProxy

  1. 创建文件夹haproxy

部署Docker RabbitMQ集群 - 图14

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