docker部署haproxy负载均衡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
智能推荐
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 课后练习:...
