本文使用Docker搭建RabbitMQ集群,而后使用HAProxy作负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群。受限于自身条件,本文使用VMware虚拟机的克隆功能克隆了两台服务器进行操做,仅做为一个demo,开发中可根据实际状况进行调整。html
为何要搭建高可用负载均衡集群?一句话来讲就是:引入消息队列,能够实现异步操做、流量削峰、应用解耦等好处,可是消息队列毕竟是一把双刃剑,带了这些好处的同时也会使系统可用性、稳定性下降。对于RabbitMQ而言,它自己并非分布式的(对比Kafka),因此咱们要搭建RabbitMQ的集群来实现高可用。linux
首先看下RabbitMQ高可用负载均衡集群长什么样子:web
使用Docker构建RabbitMQ高可用负载均衡集群大概分为三个步骤:算法
使用Docker启动3个RabbitMQ节点,目标以下表所示:docker
服务器ip | 端口 | hostname | 管理界面地址 |
---|---|---|---|
192.168.16.128 | 5672 | my-rabbit1 | 192.168.16.128:15672 |
192.168.16.128 | 5673 | my-rabbit2 | 192.168.16.128:15673 |
192.168.16.128 | 5674 | my-rabbit3 | 192.168.16.128:15674 |
命令:浏览器
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必须设置为相同的。bash
启动完成以后,使用docker ps命令查看运行状况,确保RabbitMQ都已经启动。服务器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d6f612fdc8e 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 rabbit3 c410aa73ce68 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 rabbit2 ceb28620d7b1 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
内存节点和磁盘节点的选择:cookie
每一个RabbitMQ节点,要么是内存节点,要么是磁盘节点。内存节点将全部的队列、交换器、绑定、用户等元数据定义都存储在内存中;而磁盘节点将元数据存储在磁盘中。单节点系统只容许磁盘类型的节点,不然当节点重启之后,全部的配置信息都会丢失。若是采用集群的方式,能够选择至少配置一个节点为磁盘节点,其他部分配置为内存节点,,这样能够得到更快的响应。因此本集群中配置节点1位磁盘节点,节点2和节点3位内存节点。app
集群中的第一个节点将初始元数据代入集群中,而且无须被告知加入。而第2个和以后加入的节点将加入它并获取它的元数据。要加入节点,须要进入Docker容器,重启RabbitMQ。
设置节点1:
docker exec -it rabbit1 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit
设置节点2:
docker exec -it rabbit2 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@my-rabbit1 rabbitmqctl start_app exit
设置节点3:
docker exec -it rabbit3 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@my-rabbit1 rabbitmqctl start_app exit
节点设置完成以后,在浏览器访问192.168.16.128:1567二、192.168.16.128:15673和192.168.16.128:15674中任意一个,都会看到RabbitMQ集群已经建立成功。
镜像队列工做原理:在非镜像队列的集群中,消息会路由到指定的队列。当配置为镜像队列以后,消息除了按照路由规则投递到相应的队列外,还会投递到镜像队列的拷贝。也能够想象在镜像队列中隐藏着一个fanout交换器,将消息发送到镜像的队列的拷贝。
进入任意一个RabbitMQ节点,执行以下命令:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
能够设置镜像队列,"^"表示匹配全部队列,即全部队列在各个节点上都会有备份。在集群中,只须要在一个节点上设置镜像队列,设置操做会同步到其余节点。
查看集群的状态:
rabbitmqctl cluster_status
第一步构建RabbitMQ集群只是构建高可用负载均衡集群的基础,下面将使用HAProxy为RabbitMQ集群作负载均衡。
Haproxy 是目前比较流行的一种群集调度工具,是使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。同类群集调度工具备不少,如LVS 和 Nginx 。相比较而言,LVS 性能最好,可是搭建相对复杂,Nginx的upstream模块支持群集功能,可是对群集节点的健康检查功能不强,性能没有HAProxy 好。
对于调度算法本文采用最简单最经常使用的轮询算法。
原本想采用Docker的方式拉取并运行HAProxy镜像,折腾了好几天搞不定,HAProxy启动不了,故采用源码安装的方式安装HAProxy。
配置两个HAProxy节点实现负载均衡:
服务器ip | 端口号 | 管理界面地址 |
---|---|---|
192.168.16.128 | 8888 | http://192.168.16.128:8888/haproxy |
192.168.16.129 | 8888 | http://192.168.16.129:8888/haproxy |
因为到官网下载须要kexue上网,这里提供百度云连接。
连接: https://pan.baidu.com/s/1uaSJa3NHFiE1E6dk7iHMwQ 提取码: irz6
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.8 make TARGET=generic
执行完毕以后,目录下出现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 global mode http #超时配置 timeout connect 5000 timeout client 5000 timeout server 5000 timeout check 2000 listen http_front #haproxy的客户页面 bind 192.168.16.128:8888 mode http option httplog stats uri /haproxy stats auth admin:123456 stats refresh 5s stats enable listen haproxy #负载均衡的名字 bind 0.0.0.0:5666 #对外提供的虚拟的端口 option tcplog mode tcp #轮询算法 balance roundrobin server rabbit1 192.168.16.128:5672 check inter 5000 rise 2 fall 2 server rabbit2 192.168.16.128:5673 check inter 5000 rise 2 fall 2 server rabbit3 192.168.16.128:5674 check inter 5000 rise 2 fall 2
启动命令:
/opt/haproxy-1.7.8/haproxy -f /opt/haproxy-1.7.8/haproxy.cfg
验证一下是否启动成功:
[root@localhost haproxy-1.7.8]# lsof -i:8888 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME haproxy 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主要来防止服务器单点故障的发生问题,能够经过其与Nginx、Haproxy等反向代理的负载均衡服务器配合实现web服务端的高可用。Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。
Keepalived的官网下载Keepalived的安装文件,目前最新的版本为:keepalived-2.0.17.tar.gz,下载地址为http://www.keepalived.org/download.html。
下载以后进行解压和编译安装。
tar zxvf keepalived-2.0.17.tar.gz cd keepalived-2.0.17 ./configure --prefix=/opt/keepalived --with-init=SYSV #注:(upstart|systemd|SYSV|SUSE|openrc) #根据你的系统选择对应的启动方式 make make install
以后将安装事后的Keepalived加入系统服务中,详细步骤以下:
cp /opt/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig cp /opt/keepalived/sbin/keepalived /usr/sbin/ chmod +x /etc/init.d/keepalived chkconfig --add keepalived chkconfig keepalived on #Keepalived默认会读取/etc/keepalived/keepalived.conf配置文件 mkdir /etc/keepalived cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
接下来修改/etc/keepalived/keepalived.conf文件,在Keepalived的Master上配置详情以下:
#Keepalived配置文件 global_defs { router_id NodeA #路由ID, 主备的ID不能相同 } #自定义监控脚本 vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 5 weight 2 } vrrp_instance VI_1 { state MASTER #Keepalived的角色。Master表示主服务器,从服务器设置为BACKUP interface eth0 #指定监测网卡 virtual_router_id 1 priority 100 #优先级,BACKUP机器上的优先级要小于这个值 advert_int 1 #设置主备之间的检查时间,单位为s authentication { #定义验证类型和密码 auth_type PASS auth_pass root123 } track_script { chk_haproxy } virtual_ipaddress { #VIP地址,能够设置多个: 192.168.16.130 } }
Backup中的配置大体和Master中的相同,不过须要修改global_defs{}的router_id,好比置为NodeB;其次要修改vrrp_instance VI_1{}中的state为BACKUP;最后要将priority设置为小于100的值。注意Master和Backup中的virtual_router_id要保持一致。下面简要的展现下Backup的配置:
#Keepalived配置文件 global_defs { router_id NodeB #路由ID, 主备的ID不能相同 } #自定义监控脚本 vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 5 weight 2 } vrrp_instance VI_1 { state BACKUP interface eth0 #指定监测网卡 virtual_router_id 1 priority 80 #优先级,BACKUP机器上的优先级要小于这个值 advert_int 1 #设置主备之间的检查时间,单位为s authentication { #定义验证类型和密码 auth_type PASS auth_pass root123 } track_script { chk_haproxy } virtual_ipaddress { #VIP地址,能够设置多个: 192.168.16.130 } }
为了防止HAProxy服务挂了,可是Keepalived却还在正常工做而没有切换到Backup上,因此这里须要编写一个脚原本检测HAProxy服务的状态。当HAProxy服务挂掉以后该脚本会自动重启HAProxy的服务,若是不成功则关闭Keepalived服务,如此即可以切换到Backup继续工做。这个脚本就对应了上面配置中vrrp_script chk_haproxy{}的script对应的值,/etc/keepalived/check_haproxy.sh的内容如代码清单所示。
#!/bin/bash if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then haproxy -f /opt/haproxy-1.7.8/haproxy.cfg fi sleep 2 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then service keepalived stop fi
如此配置好以后,使用service keepalived start命令启动192.168.16.128和192.168.16.129中的Keepalived服务便可。以后客户端的应用能够经过192.168.16.130这个IP地址来接通RabbitMQ服务。
原文出处:https://www.cnblogs.com/sgh1023/p/11296013.html