RabbitMQ镜像集群搭建
RabbitMQ镜像集群搭建
本文主要记录RabbitMQ镜像集群的搭建方法。
RabbitMQ集群架构模式
-
主备模式(Warren)
实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单。简单来说就是集群至少有两台RabbitMQ服务器,这两台服务器一台在工作一台在闲置,当工作的服务器出现故障则切换到备份的服务器,以此来实现高可用。但是主备模式有其弊端,那就是负载不均衡,一台忙的忙死,一台没事儿干。在实际开发中,一般不使用主备模式,这会造成MQ资源的浪费。 -
镜像模式(Mirror)
集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失(夸张了),在实际工作中也是用的最多的,并且实现集群非常简单。简单来说就是集群中所有的节点即每一台MQ的服务器数据都是同步的,并且所有的服务器都在工作,我们在集群的前面使用一个TCP代理(nginx/haproxy)来做负载均衡,如果一台MQ服务器出异常了,集群中其他的MQ服务器立马顶上。 -
远程模式(Shovel)
远程模式是可以实现双活的一种模式,简称Shovel模式,所谓Shovel就是我们可以把消息进行不同数据中心的复制工作,我们可以跨地域的让两个MQ集群互联,该模式要求比较高,配置也比较复杂。在实际的开发中,基本不用,如果要搭建多个数据中心的集群一般使用第四种方式。 -
多活模式(Federation)
这种模式也是实现异地数据复制的主流模式,因为Shovel模式配置比较复杂,所以一般来说实现异地集群都是使用双活或者多活模型来实现。简单来说双活模式就是一种可以容灾的机制,比如我们在北京和成都分别搭建两个MQ的集群,这两个集群数据都是同步的,当两个集群都可以访问的时候,可以采用距离或者响应速度选择最优的一个集群访问,当一个地方的集群出现宕机可以立马切换到另一个地方的集群。这种模型需要依赖RabbitMQ和Federation插件,可以实现持续可靠的AMQP数据通信,多活模式在实际配置与应用中都非常简单。
使用环境
- 两台腾讯云服务器,分别安装Centos7的Linux系统;
- 两台服务器均提前安装RabbitMQ服务器,具体安装教程看这里。
Mirror集群搭建
-
修改两台服务器的hostname
第一台:
vim /etc/hostname
mq1
第二台:
vim /etc/hostname
mq2
注意:
如果两台服务器的主机名本身就不一致也可以不修改,例如腾讯云服务器的主机名VM_x_x_centos便可以不用修改。 -
在两台服务器的主机列表中加入两台主机
两台做同样的操作:
vim /etc/hosts
192.168.132.137 mq1
192.268.132.139 mq2
注意:
如果是腾讯云服务器,cat /etc/hosts查看hosts文件,发现大致如下:
127.0.0.1 VM_0_14_centos VM_0_14_centos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
::1 VM_0_14_centos VM_0_14_centos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
删除第一行和第四行,然后将两台主机加入hosts文件中,注意自己设置的hostname
172.27.0.14 VM_0_14_centos
172.27.0.13 VM_0_13_centos -
检查hosts添加是否有用
ping mq1
ping mq2 -
关闭防火墙,或者防火墙开放端口
Centos7关闭防火墙:
firewall-cmd --state,查看防火墙状态
systemctl stop firewalld.service,停止防火墙
systemctl disable firewalld.service,禁止防火墙开机启动
Centos7防火墙开放端口:
RabbitMQ需要开放4369/5672/15672/25672端口。4369是erlang主机的发现端口,通过该端口来发现RabbitMQ服务是否存在;5672是RabbitMQ操作的端口号;15672是RabbitMQ后台管理系统的端口号;25672是erlang底层进行消息分配和发送的端口。
firewall-cmd --zone=public --add-port=4368/tcp --permanent,permanent表示永久生效
firewall-cmd --zone=public --add-port=4368/tcp --permanent
firewall-cmd --zone=public --add-port=4368/tcp --permanent
firewall-cmd --zone=public --add-port=4368/tcp --permanent
一般设置防火墙以后,保险起见需要重启电脑reboot,腾讯云服务器Centos7系统默认防火墙是关闭的。 -
复制.erlang.cookie
.erlang.cookie是erlang分布式的token文件,集群内所有设备要持有相同的.erlang.cookie文件才允许彼此通信。
find / -name .erlang.cookie,查询该文件的位置,一般在/var/lib/rabbitmq目录下
scp /var/lib/rabbitmq/.erlang.cookie 192.268.132.139:/var/lib/rabbitmq,远程复制 -
对两台电脑上的.erlang.cookie文件进行授权
chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/,对/var/lib/rabbitmq/路径授权
chmod 400 /var/lib/rabbitmq/.erlang.cookie,对文件进行授权 -
启动两台服务器
rabbitmq-server --detached -
在mq2服务器上,执行下面的命令,与mq1服务器进行镜像复制
rabbitmqctl stop_app,暂停服务
rabbitmqctl join_cluster rabbit@mq1,将mq2加入到mq1的集群
rabbitmqctl stop_app,启动服务
rabbitmqctl cluster_status,验证集群结果 -
查看集群
通过15672端口访问两台RabbitMQ服务器的后台管理系统,发现都在mq1的集群下面,在overview节点一栏也会发现有两个节点,同时在两台服务器上操作数据都是同步的。
注意:
如果是使用云服务器,想要外网访问15672端口,需要安全策略开启该tcp端口;如果想要guest用户登录后台管理系统也需要做RabbitMQ的设置。
配置MQ镜像集群负载均衡
做MQ镜像集群的负载均衡有很多的选择,最常见的是使用haproxy来完成,当然你也可以使用nginx,如果你使用的是腾讯云的服务器来搭建的MQ镜像集群也可以使用腾讯云的负载均衡产品。
我们之所以要给MQ的镜像集群设置TCP代理来完成负载均衡是因为我们的集群中有多台MQ服务器,我们可以通过连接任意一台服务器来完成消息的处理,但是我们人为并不能让服务器比较均衡的处理我们的消息,我们每次到底应该连接那一台服务器我们也不好处理,所以在MQ镜像集群的前面增加一个TCP代理服务器,我们只需要和TCP代理服务器打交道,TCP代理服务器可以根据我们的策略设置,例如轮询的方式,来将我们的请求分发到具体的节点即MQ服务器中去,达到负载均衡的目的。
HAProxy
-
HAProxy简介
HAProxy是一款提供高可用、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,他是免费、快速并且可靠的一种解决方案。
RabbitMQ集群镜像模式中,HAProxy用于做TCP代理,提供节点负载均衡与故障发现。 -
Centos7安装HAProxy
yum install haproxy,安装haproxy
目前仓库里的版本,不是最新的版本,但是是一个经典稳定的版本。
rpm -ql haproxy,查看安装文件 -
HAProxy配置
HAProxy核心配置文件为:/etc/haproxy/haproxy.cfg
备份一下源文件:cp haproxy.cfg haproxy.cfg.bak
编写配置文件:vim haproxy.cfg
删除default项后面的所有部分,保留default部分 -
对MQ集群进行监听配置
# 对MQ集群进行监听
listen rabbitmq_cluster
# 通过5672对代理的node进行映射
bind 0.0.0.0:5672
# 记录tcp连接的状态和时间
option tcplog
# 第四层的协议代理,即对TCP协议转发
mode tcp
# 开启TCP长连接模式
option clitcpka
# 针对TCP长连接的一些超市设置
# haproxy与mq监理连接的超时时间
timeout connect 10s
# 客户端与haproxy最大空闲时间
timeout client 30s
# haproxy与服务器最大空闲时间
timeout server 30s
# 采用轮训转发消息
balance roundrobin
# 每5秒发送一次心跳包,如果连续两次有响应则代表状态良好
# 如果连续三次没有响应,则视为故障服务,该节点将被剔除
server node1 192.168.132.137:5672 check inter 5s rise 2 fall 3
server node2 192.168.132.139:5672 check inter 5s rise 2 fall 3
- 开启haproxy监控服务
# 开启haproxy监控服务
listen http_front
# 监听端口
bind 0.0.0.0:1080
# 统计页面自动刷新时间
stats refresh 30s
# 统计页面url
stats uri /haproxy?stats
# 统计页面用户名和密码设置
stats auth guest:guest
-
启动HAProxy
haproxy -f /etc/haproxy/haproxy.cfg
上面的配置启动时会报一个警告信息,不用管。 -
访问HAProxy监控平台
http://ip:1080/haproxy?stats,登录以后可以查看到RabbitMQ集群的信息。 -
注意事项
云服务器上,如果需要访问HAProxy的监控页面,需要安全策略开启响应的端口;
如果访问过程中出现网络问题可以注意防火墙以及iptables,HAProxy一般会使用下面的端口1080、60866和监听的端口。
腾讯云负载均衡LB
- 在腾讯云负载均衡的监听器管理中,建立TCP监听器
- 新建TCP监听,监听TCP:5672端口,开启健康检查,设置回话保持,保持时间可以自己设置
- 绑定RabbitMQ所在的服务器,以及MQ服务的端口
- 集群中节点状态查看,如果端口状态出现异常,需要及时排查服务是否宕机,或者其他原因