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

集群架构图

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

花时间最多去解决的一个题是:在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在这里插入图片描述

发布了32 篇原创文章 · 获赞 16 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_32497361/article/details/104056423