docker部署haproxy负载均衡rabbitmq集群

标签: 部署  rabbitmq  

一、构建rabbitmq集群

1.启动多个rabbitmq节点

  rabbit01: #节点1主节点
    image:  rabbitmq:3.8.5-management-alpine
    ports:  #端口映射
      - "5672:5672"
      - "15672:15672"
    hostname: rabbit01  #这个要记住,后面加入集群的时候会用到
    volumes:
      - ./logs/rabbitmq/rabbit01:/var/log/rabbitmq #挂载日志目录
    #      - ./data/rabbitmq/rabbit01:/var/lib/rabbitmq #数据挂载
    environment:    #设置环境变量(配置文件参数),虚拟主机,用户名,密码
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "123456"
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
      # 由于rabbitmq节点间通过认证cookie的方式来允许互相通信,所以RABBITMQ_ERLANG_COOKIE必须设置为相同的。
  rabbit02:
    image:  rabbitmq:3.8.5-management-alpine
    ports:  #端口映射
      - "5673:5672"
    hostname: "rabbit02"
    links:   #关联主节点的hostname,方便容器内互相访问
      - rabbit01
    volumes:
      - ./logs/rabbitmq/rabbit02:/var/log/rabbitmq 
    #      - ./data/rabbitmq/rabbit02:/var/lib/rabbitmq
    environment:
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "123456"
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
  rabbit03:
    image:  rabbitmq:3.8.5-management-alpine
    ports:  #端口映射
      - "5674:5672"
    hostname: "rabbit03"
    links:   #关联主节点的hostname,方便容器内互相访问
      - rabbit01
    volumes:
      - ./logs/rabbitmq/rabbit03:/var/log/rabbitmq
    #      - ./data/rabbitmq/rabbit03:/var/lib/rabbitmq
    environment:
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "123456"
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX

2.加入集群

说明

  • 加入集群需要选择内存节点还是磁盘节点
  • 保证至少有一个节点是磁盘节点(镜像集群情况下)
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
5785c0f19d9d        haproxy:1.8.26-alpine              "/docker-entrypoint.…"   24 hours ago        Up 4 minutes        0.0.0.0:5666->5666/tcp, 0.0.0.0:8888->8888/tcp                                               rabbitmqcluster_rabhaproxy_1ß
f34f27f1b2d6        rabbitmq:3.8.5-management-alpine   "docker-entrypoint.s…"   24 hours ago        Up About a minute   4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp                       rabbitmqcluster_rabbit03_1
20458e4712fd        rabbitmq:3.8.5-management-alpine   "docker-entrypoint.s…"   24 hours ago        Up 4 minutes        4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp                       rabbitmqcluster_rabbit02_1
7890dd48e558        rabbitmq:3.8.5-management-alpine   "docker-entrypoint.s…"   24 hours ago        Up 4 minutes        4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbitmqcluster_rabbit01_1

设置节点1

docker exec -it rabbitmqcluster_rabbit01_1 sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

设置节点2

docker exec -it rabbitmqcluster_rabbit02_1 sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit02
rabbitmqctl start_app
exit

设置节点3

docker exec -it rabbitmqcluster_rabbit03_1 sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit03
rabbitmqctl start_app
exit

在这里插入图片描述

二、 部署Haproxy

启动 1.Haproxy

  rabhaproxy:
    image:  haproxy:1.8.26-alpine
    ports:  #端口映射
      - "8888:8888"
      - "5666:5666"
    hostname: "rabhaproxy"
    volumes:
      - ./config/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg #挂载日志目录
    links:   #关联主节点的hostname,方便容器内互相访问
      - rabbit01
      - rabbit02
      - rabbit03

2.配置haproxy.cfg

global
#日志输出配置,所有日志都记录在本机,通过local0输出
log 127.0.0.1 local0 info
#最大连接数
maxconn 10240
#以守护进程方式运行
daemon

defaults
#应用全局的日志配置
log global
mode http
#超时配置
timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 2000

## 管理web
listen http_front
bind 0.0.0.0:8888
mode http
option httplog
stats uri /haproxy
stats auth admin:123456
stats refresh 5s
stats enable

#绑定配置(rabbitmq集群)
listen rabbitmq_cluster
# 集群连接地址
bind 0.0.0.0:5666 
option tcplog
#防止消费者连接超时(默认毫秒 3h 小时)
timeout client  10000
timeout server  10000
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#RabbitMQ集群节点配置
server rabbit01 rabbit01:5672 check inter 5000 rise 2 fall 2
server rabbit02 rabbit02:5672 check inter 5000 rißse 2 fall 2
server rabbit03 rabbit03:5672 check inter 5000 rise 2 fall 2

在这里插入图片描述

三、配置镜像队列

说明

镜像队列工作原理:在非镜像队列的集群中,消息会路由到指定的队列。当配置为镜像队列之后,消息除了按照路由规则投递到相应的队列外,还会投递到镜像队列的拷贝。也可以想象在镜像队列中隐藏着一个fanout交换器,将消息发送到镜像的队列的拷贝。

#进入主节点执行(节点1)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

在这里插入图片描述

四、docker文件

  • docker-compose.yml
version: "3.1"
services:
 rabbit01: #节点1主节点
    image:  rabbitmq:3.8.5-management-alpine
    ports:  #端口映射
      - "5672:5672"
      - "15672:15672"
    hostname: rabbit01  #这个要记住,后面加入集群的时候会用到
    volumes:
      - ./logs/rabbitmq/rabbit01:/var/log/rabbitmq #挂载日志目录
    #      - ./data/rabbitmq/rabbit01:/var/lib/rabbitmq #数据挂载
    environment:    #设置环境变量(配置文件参数),虚拟主机,用户名,密码
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "123456"
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
      # 由于rabbitmq节点间通过认证cookie的方式来允许互相通信,所以RABBITMQ_ERLANG_COOKIE必须设置为相同的。
  rabbit02:
    image:  rabbitmq:3.8.5-management-alpine
    ports:  #端口映射
      - "5673:5672"
    hostname: "rabbit02"
    links:   #关联主节点的hostname,方便容器内互相访问
      - rabbit01
    volumes:
      - ./logs/rabbitmq/rabbit02:/var/log/rabbitmq 
    #      - ./data/rabbitmq/rabbit02:/var/lib/rabbitmq
    environment:
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "123456"
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
  rabbit03:
    image:  rabbitmq:3.8.5-management-alpine
    ports:  #端口映射
      - "5674:5672"
    hostname: "rabbit03"
    links:   #关联主节点的hostname,方便容器内互相访问
      - rabbit01
    volumes:
      - ./logs/rabbitmq/rabbit03:/var/log/rabbitmq
    #      - ./data/rabbitmq/rabbit03:/var/lib/rabbitmq
    environment:
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "admin"
      RABBITMQ_DEFAULT_PASS: "123456"
      RABBITMQ_ERLANG_COOKIE: LZJADKXKLULIXFKAALGX
   rabhaproxy:
    image:  haproxy:1.8.26-alpine
    ports:  #端口映射
      - "8888:8888"
      - "5666:5666"
    hostname: "rabhaproxy"
    volumes:
      - ./config/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg #挂载日志目录
    links:   #关联主节点的hostname,方便容器内互相访问
      - rabbit01
      - rabbit02
      - rabbit03


  • 构建命令 docker-compose -f docker-compose.yml up
  • 删除命令 docker-compose -f docker-compose.yml down
  • 启动命令 docker-compose -f docker-compose.yml up start
  • 停止命令 docker-compose -f docker-compose.yml up stop
版权声明:本文为miaocansky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/miaocansky/article/details/112354734

智能推荐

Rabbitmq集群+HAproxy部署

MQ全称Messages Queue,即消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。队列的使用除去了接收和发送应用程序,同时执行的要求。在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式,大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 MQ的分类: P2P模式(安...

Rabbitmq集群部署Haproxy

安装前的说明: 1、为了配合做rabbitmq的负载均衡,本次的安装包是安装的低版本1.5.8版本,下载包的地址:https://src.fedoraproject.org/repo/pkgs/haproxy/ 2、按照上两篇博客,先把rabbitmq集群装好: 单机版Rabbitmq部署:https://blog.51cto.com/10950710/2135676 Rabbitmq集群部署:h...

Mybatis基础(part 1)

一.mybatis调用SQL语句 1.使用XML配置SQL语句 在SqlMapConfig.xml配置数据源并指定映射配置文件的位置(每个DAO对应的XML文件,该文件映射了DAO的全限定类名)   2.使用注解配置sql语句 在SqlMapConfig.xml配置数据源和class属性(指定被注解的dao全限定类名),在DAO上写注解。 用注解来配置,故此处使用class属性指定被注解...

Docker 容器内运行 Dubbo 服务

原文:http://www.aqcoder.com/post/content?id=41 在使用 Docker 容器内运行 Dubbo 服务的时候一个令人很头痛的问题就是服务地址注册。 Docker 容器内有自己的 IP 段,和宿主主机是隔离的,Dubbo 会使用容器内的 IP 注册到 zookeeper 注册中心上。这样其他的服务是无法访问的。 方式一:–host 一个很直接的方案就...

python基础教程

Python基础教程 一、简介 1.1 python语言介绍 python的创始人:Guido Van Rossum Python下载地址:https://www.python.org/ Python文档下载地址:https://www.python.org/doc/ Pycharm下载地址:https://www.runoob.com/w3cnote/pycharm-windows-instal...

猜你喜欢

1、Git安装与配置

1、Git安装与配置 一:版本控制 定义:版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 为什么要用版本控制:在起初的项目开发中,我们会不断的编写代码,但是,害怕有一天系统突然挂掉了,完蛋,辛苦写的代码就这么没了,所有为了防止这一点,都会开发一点就以目录拷贝的形式保存下来,自己这么1.0、2.0、3.0…的这么去标记,开始的还好,后面的话你压根就不知道...

Golang net/rpc 包的深度解读和学习

Golang 提供了一个开箱即用的RPC服务,实现方式简约而不简单。本文对net/rpc 包做深度解读和学习实战。 RPC 简单介绍 远程过程调用 (Remote Procedure Call,RPC) 是一种计算机通信协议。允许运行在一台计算机的程序调用另一个地址空间的子程序(一般是开放网络中的一台计算机),而程序员就像调用调用本地程序一样,无需额外做交互编程。RPC 是一种 CS (Clien...

merge sort

归并排序(merge sort) 具体算法: I.对原数组进行分组:对数组进行遍历,每检测出一个有序序列则记录一个分组,一般分组都是上升序列,下降序列也会被转换成上升序列 II.对两两相邻的分组进行合并,合并后的分组也将被记录 III.迭代合并之前合并后的分组直到出现最后的一个有序的大分组,也就是排序的最终结果 java.util.DualPivotQuicksort类中的static void ...

Java函数的学习

java学习 百知教育学习 - 胡鑫喆 - Java函数的学习 01_函数的定义 函数的定义 概念:实现特定功能的一段代码,可反复使用 定义语法: 函数名称许遵循命名规范 函数定义在类的内部,与main函数并列,并且使函数产生作用,需进行函数的调用 使用函数去掉冗余代码 02_函数的参数 函数的参数(函数名称() 其中()就是一个参数表) 无参函数(01_函数的定义中的下划线就为无参函数) 有参函...

03-段寄存器属性探测

1.段属性探测 要点回顾: 要点回顾: 上一节课我们讲过段寄存器有96位: 我们可以通过MOV指令进行读写(LDTR和TR除外) 但我们只能看见16位,那如果证明Attribute、Base、Limit的存在呢? 1、段寄存器成员简介 2、探测Attribute 3、探测Base 3、探测Limit 课后练习:...