写点什么

干货!使用 Docker 构建 RabbitMQ 高可用负载均衡集群,java 面试题汇总及答案

用户头像
极客good
关注
发布于: 刚刚

使用 Docker 构建 RabbitMQ 高可用负载均衡集群大概分为三个步骤:


  1. 启动多个(3 个为例)RabbitMQ,构建 RabbitMQ 集群,并配置为镜像模式。

  2. 使用 HAProxy 做负载均衡。

  3. 使用 KeepAlived 实现高可用。

一、构建 RabbitMQ 集群

1. 启动多个 RabbitMQ 节点


使用 Docker 启动 3 个 RabbitMQ 节点,目标如下表所示:



命令:


docker run -d --hostname my-rabbit1 --name rabbit1 -p 5672:5672 -p 15672:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.0-beta.4-management


docker run -d --hostname my-rabbit2 --name rabbit2 -p 5673:5672 -p 15673:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 rabbitmq:3.8.0-beta.4-management


docker run -d --hostname my-rabbit3 --name rabbit3 -p 5674:5672 -p 15674:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 --link rabbit2:my-rabbit2 rabbitmq:3.8.0-beta.4-management


注意:由于 Erlang 节点间通过认证 Erlang cookie 的方式来允许互相通信,所以 RABBITMQ_ERLANG_COOKIE 必须设置为相同的。


启动完成之后,使用 docker ps 命令查看运行情况,确保 RabbitMQ 都已经启动。


CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2d6f612fdc8e rabbitmq:3.8.0-beta.4-management "docker-entrypoint..." 5 seconds ago Up 4 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, 0.0.0.0:15674->15672/tcp rabbit3c410aa73ce68 rabbitmq:3.8.0-beta.4-management "docker-entrypoint..." 14 seconds ago Up 14 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15673->15672/tcp rabbit2ceb28620d7b1 rabbitmq:3.8.0-beta.4-management "docker-entrypoint..." 24 seconds ago Up 23 seconds 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbit1


2. 加入集群


内存节点和磁盘节点的选择:


每个 RabbitMQ 节点,要么是内存节点,要么是磁盘节点。内存节点将所有的队列、交换器、绑定、用户等元数据定义都存储在内存中;而磁盘节点将元数据存储在磁盘中。单节点系统只允许磁盘类型的节点,否则当节点重启以后,所有的配置信息都会丢失。如果采用集群的方式,可以选择至少配置一个节点为磁盘节点,其余部分配置为内存节点,,这样可以获得更快的响应。所以本集群中配置节点 1 位磁盘节点,节点 2 和节点 3 位内存节点。


集群中的第一个节点将初始元数据代入集群中,并且无须被告知加入。而第 2 个和之后加入的节点将加入它并获取它的元数据。要加入节点,需要进入 Docker 容器,重启 RabbitMQ。


设置节点 1:


docker exec -it rabbit1 bashrabbitmqctl stop_apprabbitmqctl resetrabbitmqctl start_appexit


设置节点 2:


docker exec -it rabbit2 bashrabbitmqctl stop_apprabbitmqctl resetrabbitmqctl join_cluster --ram rabbit@my-rabbit1rabbitmqctl start_appexit


设置节点 3:


docker exec -it rabbit3 bashrabbitmqctl stop_apprabbitmqctl resetrabbitmqctl join_cluster --ram rabbit@my-rabbit1rabbitmqctl start_appexit


节点设置完成之后,在浏览器访问 192.168.16.128:15672、192.168.16.128:15673 和 192.168.16.128:15674 中任意一个,都会看到 RabbitMQ 集群已经创建成功。



3. 配置镜像队列


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


进入任意一个 RabbitMQ 节点,执行如下命令:


rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'


可以设置镜像队列,"^"表示匹配所有队列,即所有队列在各个节点上都会有备份。在集群中,只需要在一个节点上设置镜像队列,设置操作会同步到其他节点。


查看集群的状态:


rabbitmqctl cluster_status

二、HAProxy 负载均衡

第一步构建 RabbitMQ 集群只是构建高可用负载均衡集群的基础,下面将使用 HAProxy 为 RabbitMQ 集群做负载均衡。


Haproxy 是目前比较流行的一种群集调度工具,是使用 C 语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。同类群集调度工具有很多,如 LVS 和 Nginx 。相比较而言,LVS 性能最好,但是搭建相对复杂,Nginx 的 upstream 模块支持群集功能,但是对群集节点的健康检查功能不强,性能没有 HAProxy 好。


对于调度算法本文采用最简单最常用的轮询算法。


本来想采用 Docker 的方式拉取并运行 HAProxy 镜像,折腾了好几天搞不定,HAProxy 启动不了,故采用源码安装的方式安装 HAProxy。


配置两个 HAProxy 节点实现负载均衡:



1. 安装 HAProxy


  1. 下载


由于到官网下载需要 kexue 上网,这里提供百度云链接。


链接:https://pan.baidu.com/s/1uaSJa3NHFiE1E6dk7iHMwQ 提取码: irz6


  1. 将 haproxy-1.7.8.tar.gz 拷贝至/opt 目录下,解压缩:


tar zxvf haproxy-1.7.8.tar.gz


  1. 进入目录,编译成可执行文件。


将源代码解压之后,需要运行 make 来将 HAProxy 编译成为可执行文件。如果是在 Linux2.6 系统上面进行编译的话,需要设置 TARGET=linux26 以开启 epoll 支持,这也是为什么网上许多博客里面都是这么写的。对于其他的 UNIX 系统来说,直接采用 TARGET=generic 方式,本文进行安装的系统为 CentOS7 ,内核 3.10 版本。


cd haproxy-1.7.8make TARGET=generic


执行完毕之后,目录下出现 haproxy 的可执行文件。


2. 配置 HAProxy


HAProxy 配置文件说明


HAProxy 配置文件通常分为三个部分,即 global、defaults 和 listen。global 为全局配置,defaults 为默认配置,listen 为应用组件配置。


global 为全局配置部分,属于进程级别的配置,通常和使用的操作系统配置相关。


defaults 配置项配置默认参数,会被应用组件继承,如果在应用组件中没有特别声明,将使用默认配置参数。


以配置 RabbitMQ 集群的负载均衡为例,在安装目录下面新建一个 haproxy.cfg,输入下面配置信息:


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


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


listen http_front #haproxy 的客户页面 bind 192.168.16.128:8888mode httpoption httplogstats uri /haproxystats auth admin:123456stats refresh 5sstats enable


listen haproxy #负载均衡的名字 bind 0.0.0.0:5666 #对外提供的虚拟的端口 option tcplogmode tcp#轮询算法 balance roundrobinserver rabbit1 192.168.16.128:5672 check inter 5000 rise 2 fall 2server rabbit2 192.168.16.128:5673 check inter 5000 rise 2 fall 2server rabbit3 192.168.16.128:5674 check inter 5000 rise 2 fall 2


3. 启动


启动命令:


/opt/haproxy-1.7.8/haproxy -f /opt/haproxy-1.7.8/haproxy.cfg


验证一下是否启动成功:


[root@localhost haproxy-1.7.8]# lsof -i:8888COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEhaproxy 45031 root 3u IPv4 228341 0t0 TCP localhost.localdomain:ddi-tcp-1 (LISTEN)


在浏览器上访问http://192.168.16.128:8888/haproxy,输入配置的用户名和密码登录以后,可以看到如下画面:



再以相同的方式在 192.168.16.129 服务器上面启动一个 HAProxy。


到此,负载均衡配置完成。

三、KeepAlived 配置高可用

Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived 主要来防止服务器单点故障的发生问题,可以通过其与 Nginx、Haproxy 等反向代理的负载均衡服务器配合实现 web 服务端的高可用。Keepal


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。


1. KeepAlived 安装

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
干货!使用Docker构建RabbitMQ高可用负载均衡集群,java面试题汇总及答案