RabbitMq docker+haproxy+keepalived高可用的负载均衡集群

1 篇文章 0 订阅
1 篇文章 0 订阅

集群架构图

在这里插入图片描述
先记录下遇到的坑,避免之后忘了;

花时间最多去解决的一个题是:在docker下启动haproxy服务后在这个docker服务内安装keepalived无法ping通的问题,虽然最后也是莫名其妙就好了,但是加强了不少对docker的理解和还需深入学习的地方。

为什么要用keepalived+haproxy实现docker下的高可用负载均衡?在不同环境下有哪些方式可以实现高可用负载均衡?

首先第一点,实现负载均衡并不是只有haproxy一个中间件,网上还有很多方案是用keepalived+LVS等等,所以对于docker下的高可用负载均衡不一定只有keepalived+haproxy。只是本次我是基于之前搭建的pxc集群进行继续搭建的,所以用的是haproxy。

为什么这里强调的是docker、keepalived?

首先我们运行环境是docker,keepalived的作用是抢占虚拟ip,docker环境下,镜像内的网段外网是无法访问的,所以我们需要一个外网在宿主机上映射到docker内的ip上,keepalived一方面可以映射ip到docker服务内,二可以在docker服务内强占虚拟ip。所以在docker搭建负载均衡的多种方案中都常见会出现keepalived。

为什么要抢占虚拟ip?为什么要用keepalived呢?

负载均衡中间件(haproxy,lvs)等等在实际中不可能只是单节点存在(单节点不需要keepalived),都要有冗余设计,即集群设计,和数据库集群不一样的是,docker中实现负载均衡中间件的集群是通过抢占一个ip地址实现的,有主备和主主方式,虽然方式不一样,但都有一个心跳检测的共同点,在主节点抢占虚拟ip时,主从节点上会有心跳检测线,如果发现主节点心跳检测连不上,则从节点会主动抢占ip实现数据不中断的冗余机制;

总结描述:由于是在docker环境下,我们要搭建负载均衡集群需要通过keepalived抢占虚拟ip实现,而负载均衡功能需要haproxy中间件实现,所以本次我搭建的是一个在docker环境下高可用的负载均衡方案是:keepalived+haproxy。

使用docker pull rabbitmq拉取最新rabbimq镜像,docker pull haproxy 拉取haproxy镜像
在这里插入图片描述
创建docker网络 rabbtimanet 用于haproxy和rabbimq通信

docker network create rabbtimanet

在这里插入图片描述
创建三节点rabbitmq容器
rabbitmq1:

docker run -d --name=rabbitmq1 -p 5672:5672 -p 15672:15672 -e RABBITMQ_NODENAME=rabbitmq1 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ'  -h rabbitmq1 --net=rabbtimanet rabbitmq:management

rabbitmq2:

docker run -d --name=rabbitmq2 -p 5673:5672 -p 15673:15672 -e RABBITMQ_NODENAME=rabbitmq2 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ'  -h rabbitmq2 --net=rabbtimanet rabbitmq:management

rabbitmq3:

docker run -d --name=rabbitmq3 -p 5674:5672 -p 15674:15672 -e RABBITMQ_NODENAME=rabbitmq3 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ'  -h rabbitmq3 --net=rabbtimanet rabbitmq:management

在这里插入图片描述
分别进入rabbitmq2 和rabbitmq3容器(docker exec -it 容器id /bin/bash),执行以下:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbitmq1@rabbitmq1
rabbitmqctl start_app

在这里插入图片描述

部署Haproxy

因为创建haproxy时发现容器一启动就结束生命docker logs -f rabbitmq-haproxy

[ALERT] 316/035201 (1) : Cannot open configuration file/directory /usr/local/etc/haproxy/haproxy.cfg : Permission denied

查看后发现是权限问题。
解决方案:改用Dockerfile的方式创建haproxy
在这里插入图片描述

编辑haproxy.cfg配置文件如下:
 vim haproxy.cfg 
global
  daemon
  maxconn 256
  
defaults
  mode http
  timeout connect 5000ms
  timeout client 5000ms
  timeout server 5000ms
 
listen rabbitmq_cluster #监听5677端口转发到rabbitmq服务
  bind 0.0.0.0:5677
  option tcplog
  mode tcp
  balance leastconn
  server rabbit1 rabbitmq1:5672 check inter 2s rise 2 fall 3
  server rabbit2 rabbitmq2:5672 check inter 2s rise 2 fall 3
  server rabbit3 rabbitmq3:5672 check inter 2s rise 2 fall 3
listen http_front #haproxy的客户页面
  bind 0.0.0.0:80
  stats uri /haproxy?stats
 
listen rabbitmq_admin #监听8011端口转发到rabbitmq的客户端
  bind 0.0.0.0:8001
  server rabbit1 rabbitmq1:15672 check inter 2s rise 2 fall 3
  server rabbit2 rabbitmq2:15672 check inter 2s rise 2 fall 3
  server rabbit2 rabbitmq3:15672 check inter 2s rise 2 fall 3

编辑Dockerfile.cfg配置文件如下
vim Dockerfile

FROM haproxy:1.7
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

在这里插入图片描述
创建容器

docker run -d --name rabbitmq-haproxy  -p 8090:80 -p 5677:5677 -p 8001:8001 --net=rabbtimanet  rabbit-haproxy:latest
docker run -d --name rabbitmq-haproxy2  -p 8091:80 -p 5678:5677 -p 8002:8001 --net=rabbtimanet  rabbit-haproxy:latest

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200217161736442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyNDk3MzYx,size_16,color_FFFFFF,t_70在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Spring Boot、RabbitMQ集群和Controller的完整示例: 1. 首先,需要在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 然后,在application.yml文件中添加以下RabbitMQ配置: ``` spring: rabbitmq: addresses: server1:5672,server2:5672 # RabbitMQ集群地址 username: guest # RabbitMQ用户名 password: guest # RabbitMQ密码 virtual-host: / # RabbitMQ虚拟主机 ``` 3. 创建一个RabbitMQ配置类,如下所示: ``` @Configuration public class RabbitMQConfig { @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setAddresses("server1:5672,server2:5672"); connectionFactory.setUsername("guest"); connectionFactory.setPassword("guest"); connectionFactory.setVirtualHost("/"); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; } } ``` 4. 创建一个消息发送端,如下所示: ``` @Component public class MessageSender { @Autowired private RabbitTemplate rabbitTemplate; public void send(String message) { rabbitTemplate.convertAndSend("exchange", "routingKey", message); } } ``` 5. 创建一个消息接收端,如下所示: ``` @Component public class MessageReceiver { @RabbitListener(queues = "queue") public void receive(String message) { System.out.println("Received message: " + message); } } ``` 6. 创建一个Controller,如下所示: ``` @RestController public class MessageController { @Autowired private MessageSender messageSender; @PostMapping("/message") public void sendMessage(@RequestBody String message) { messageSender.send(message); } } ``` 7. 最后,启动多个应用程序实例,并通过发送POST请求来测试Controller和RabbitMQ集群是否正常工作。 注意:本示例中的exchange、routingKey和queue名称可以根据实际情况进行更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值