干货!使用 Docker 构建 RabbitMQ 高可用负载均衡集群,java 面试题汇总及答案
使用 Docker 构建 RabbitMQ 高可用负载均衡集群大概分为三个步骤:
启动多个(3 个为例)RabbitMQ,构建 RabbitMQ 集群,并配置为镜像模式。
使用 HAProxy 做负载均衡。
使用 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
下载
由于到官网下载需要 kexue 上网,这里提供百度云链接。
链接:https://pan.baidu.com/s/1uaSJa3NHFiE1E6dk7iHMwQ 提取码: irz6
将 haproxy-1.7.8.tar.gz 拷贝至/opt 目录下,解压缩:
tar zxvf haproxy-1.7.8.tar.gz
进入目录,编译成可执行文件。
将源代码解压之后,需要运行 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
ived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。
1. KeepAlived 安装
评论